Browse Source

ESQL: Added BytesRef offset randomization to function tests (#109207)

* Added BytesRef offset randomization to ESQL function tests

* Added extra array length and randomized paddings
Iván Cea Fontenla 1 year ago
parent
commit
d58da2c105

+ 40 - 0
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/AbstractFunctionTestCase.java

@@ -641,6 +641,46 @@ public abstract class AbstractFunctionTestCase extends ESTestCase {
         Matcher<String> evaluatorToString(int nullPosition, TestCaseSupplier.TypedData nullData, Matcher<String> original);
     }
 
+    /**
+     * Modifies suppliers to generate BytesRefs with random offsets.
+     */
+    protected static List<TestCaseSupplier> randomizeBytesRefsOffset(List<TestCaseSupplier> testCaseSuppliers) {
+        return testCaseSuppliers.stream().map(supplier -> new TestCaseSupplier(supplier.name(), supplier.types(), () -> {
+            var testCase = supplier.supplier().get();
+
+            var newData = testCase.getData().stream().map(typedData -> {
+                if (typedData.data() instanceof BytesRef bytesRef) {
+                    var offset = randomIntBetween(0, 10);
+                    var extraLength = randomIntBetween(0, 10);
+                    var newBytesArray = randomByteArrayOfLength(bytesRef.length + offset + extraLength);
+
+                    System.arraycopy(bytesRef.bytes, bytesRef.offset, newBytesArray, offset, bytesRef.length);
+
+                    var newBytesRef = new BytesRef(newBytesArray, offset, bytesRef.length);
+                    var newTypedData = new TestCaseSupplier.TypedData(newBytesRef, typedData.type(), typedData.name());
+
+                    if (typedData.isForceLiteral()) {
+                        newTypedData.forceLiteral();
+                    }
+
+                    return newTypedData;
+                }
+                return typedData;
+            }).toList();
+
+            return new TestCaseSupplier.TestCase(
+                newData,
+                testCase.evaluatorToString(),
+                testCase.expectedType(),
+                testCase.getMatcher(),
+                testCase.getExpectedWarnings(),
+                testCase.getExpectedTypeError(),
+                testCase.foldingExceptionClass(),
+                testCase.foldingExceptionMessage()
+            );
+        })).toList();
+    }
+
     protected static List<TestCaseSupplier> anyNullIsNull(
         List<TestCaseSupplier> testCaseSuppliers,
         ExpectedType expectedType,

+ 1 - 1
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/ip/IpPrefixTests.java

@@ -106,7 +106,7 @@ public class IpPrefixTests extends AbstractFunctionTestCase {
             })
         );
 
-        return parameterSuppliersFromTypedData(errorsForCasesWithoutExamples(anyNullIsNull(true, suppliers)));
+        return parameterSuppliersFromTypedData(errorsForCasesWithoutExamples(anyNullIsNull(true, randomizeBytesRefsOffset(suppliers))));
     }
 
     @Override