diff --git a/.github/workflows/scheduled.yml b/.github/workflows/scheduled.yml index cfc074205669..68814db1ad74 100644 --- a/.github/workflows/scheduled.yml +++ b/.github/workflows/scheduled.yml @@ -264,14 +264,14 @@ jobs: uses: actions/upload-artifact@v4 with: name: presto - path: velox/_build/debug/velox/expression/tests/velox_expression_fuzzer_test + path: velox/_build/debug/velox/expression/fuzzer/velox_expression_fuzzer_test retention-days: "${{ env.RETENTION }}" - name: Upload spark expression fuzzer uses: actions/upload-artifact@v4 with: name: spark_expression_fuzzer - path: velox/_build/debug/velox/expression/tests/spark_expression_fuzzer_test + path: velox/_build/debug/velox/expression/fuzzer/spark_expression_fuzzer_test retention-days: "${{ env.RETENTION }}" - name: Upload spark aggregation fuzzer diff --git a/Makefile b/Makefile index 3e8ff17397bd..b604d560adf6 100644 --- a/Makefile +++ b/Makefile @@ -161,7 +161,7 @@ unittest: debug #: Build with debugging and run unit tests # Build with debugging and run expression fuzzer test. Use a fixed seed to # ensure the tests are reproducible. fuzzertest: debug - $(BUILD_BASE_DIR)/debug/velox/expression/tests/velox_expression_fuzzer_test \ + $(BUILD_BASE_DIR)/debug/velox/expression/fuzzer/velox_expression_fuzzer_test \ --seed $(FUZZER_SEED) \ --duration_sec $(FUZZER_DURATION_SEC) \ --repro_persist_path $(FUZZER_REPRO_PERSIST_PATH) \ diff --git a/velox/docs/develop/testing/fuzzer.rst b/velox/docs/develop/testing/fuzzer.rst index 9aa7630f07a4..7785d36ae0d7 100644 --- a/velox/docs/develop/testing/fuzzer.rst +++ b/velox/docs/develop/testing/fuzzer.rst @@ -284,7 +284,7 @@ When Fuzzer test fails, a seed number and the evaluated expression are printed to the log. An example is given below. Developers can use ``--seed`` with this seed number to rerun the exact same expression with the same inputs, and use a debugger to investigate the issue. For the example below, the command -to reproduce the error would be ``velox/expression/tests/velox_expression_fuzzer_test --seed 1188545576``. +to reproduce the error would be ``velox/expression/fuzzer/velox_expression_fuzzer_test --seed 1188545576``. :: diff --git a/velox/exec/fuzzer/AggregationFuzzer.cpp b/velox/exec/fuzzer/AggregationFuzzer.cpp index e6d15548e62c..cde7098bc125 100644 --- a/velox/exec/fuzzer/AggregationFuzzer.cpp +++ b/velox/exec/fuzzer/AggregationFuzzer.cpp @@ -25,7 +25,7 @@ #include "velox/exec/PartitionFunction.h" #include "velox/exec/fuzzer/AggregationFuzzerBase.h" -#include "velox/expression/tests/utils/FuzzerToolkit.h" +#include "velox/expression/fuzzer/FuzzerToolkit.h" #include "velox/vector/VectorSaver.h" #include "velox/vector/fuzzer/VectorFuzzer.h" @@ -39,8 +39,8 @@ DEFINE_bool( false, "When true, the results of the window aggregation are compared to reference DB results"); -using facebook::velox::test::CallableSignature; -using facebook::velox::test::SignatureTemplate; +using facebook::velox::fuzzer::CallableSignature; +using facebook::velox::fuzzer::SignatureTemplate; namespace facebook::velox::exec::test { @@ -153,7 +153,7 @@ class AggregationFuzzer : public AggregationFuzzerBase { const std::vector& plans, bool customVerification, const std::vector>& customVerifiers, - const velox::test::ResultOrError& expected, + const velox::fuzzer::ResultOrError& expected, int32_t maxDrivers = 2, bool testWithSpilling = true) { for (auto i = 0; i < plans.size(); ++i) { @@ -1074,7 +1074,7 @@ bool AggregationFuzzer::compareEquivalentPlanResults( stats_.updateReferenceQueryStats(referenceResult.second); if (referenceResult.first) { - velox::test::ResultOrError expected; + velox::fuzzer::ResultOrError expected; expected.result = mergeRowVectors(referenceResult.first.value(), pool_.get()); diff --git a/velox/exec/fuzzer/AggregationFuzzerBase.cpp b/velox/exec/fuzzer/AggregationFuzzerBase.cpp index 462ecf9932ba..6f6e42dd7bb6 100644 --- a/velox/exec/fuzzer/AggregationFuzzerBase.cpp +++ b/velox/exec/fuzzer/AggregationFuzzerBase.cpp @@ -25,7 +25,7 @@ #include "velox/exec/fuzzer/PrestoQueryRunner.h" #include "velox/exec/tests/utils/TempDirectoryPath.h" #include "velox/expression/SignatureBinder.h" -#include "velox/expression/tests/utils/ArgumentTypeFuzzer.h" +#include "velox/expression/fuzzer/ArgumentTypeFuzzer.h" #include "velox/vector/VectorSaver.h" #include "velox/vector/fuzzer/VectorFuzzer.h" @@ -198,7 +198,7 @@ AggregationFuzzerBase::pickSignature() { const auto& signatureTemplate = signatureTemplates_[idx - signatures_.size()]; signature.name = signatureTemplate.name; - velox::test::ArgumentTypeFuzzer typeFuzzer( + velox::fuzzer::ArgumentTypeFuzzer typeFuzzer( *signatureTemplate.signature, rng_); VELOX_CHECK(typeFuzzer.fuzzArgumentTypes(FLAGS_max_num_varargs)); signature.args = typeFuzzer.argumentTypes(); @@ -386,7 +386,7 @@ void AggregationFuzzerBase::printSignatureStats() { } } -velox::test::ResultOrError AggregationFuzzerBase::execute( +velox::fuzzer::ResultOrError AggregationFuzzerBase::execute( const core::PlanNodePtr& plan, const std::vector& splits, bool injectSpill, @@ -395,7 +395,7 @@ velox::test::ResultOrError AggregationFuzzerBase::execute( LOG(INFO) << "Executing query plan: " << std::endl << plan->toString(true, true); - velox::test::ResultOrError resultOrError; + velox::fuzzer::ResultOrError resultOrError; try { std::shared_ptr spillDirectory; AssertQueryBuilder builder(plan); @@ -511,7 +511,7 @@ void AggregationFuzzerBase::testPlan( bool abandonPartial, bool customVerification, const std::vector>& customVerifiers, - const velox::test::ResultOrError& expected, + const velox::fuzzer::ResultOrError& expected, int32_t maxDrivers) { auto actual = execute( planWithSplits.plan, @@ -523,10 +523,10 @@ void AggregationFuzzerBase::testPlan( } void AggregationFuzzerBase::compare( - const velox::test::ResultOrError& actual, + const velox::fuzzer::ResultOrError& actual, bool customVerification, const std::vector>& customVerifiers, - const velox::test::ResultOrError& expected) { + const velox::fuzzer::ResultOrError& expected) { // Compare results or exceptions (if any). Fail is anything is different. if (FLAGS_enable_oom_injection) { // If OOM injection is enabled and we've made it this far and the test @@ -537,7 +537,8 @@ void AggregationFuzzerBase::compare( // Compare results or exceptions (if any). Fail if anything is different. if (expected.exceptionPtr || actual.exceptionPtr) { // Throws in case exceptions are not compatible. - velox::test::compareExceptions(expected.exceptionPtr, actual.exceptionPtr); + velox::fuzzer::compareExceptions( + expected.exceptionPtr, actual.exceptionPtr); return; } diff --git a/velox/exec/fuzzer/AggregationFuzzerBase.h b/velox/exec/fuzzer/AggregationFuzzerBase.h index 9b9c0530dcaa..f2f9b6fb632f 100644 --- a/velox/exec/fuzzer/AggregationFuzzerBase.h +++ b/velox/exec/fuzzer/AggregationFuzzerBase.h @@ -23,7 +23,7 @@ #include "velox/exec/fuzzer/ReferenceQueryRunner.h" #include "velox/exec/fuzzer/ResultVerifier.h" #include "velox/exec/tests/utils/AssertQueryBuilder.h" -#include "velox/expression/tests/utils/FuzzerToolkit.h" +#include "velox/expression/fuzzer/FuzzerToolkit.h" #include "velox/vector/fuzzer/VectorFuzzer.h" #include "velox/vector/tests/utils/VectorMaker.h" @@ -47,8 +47,8 @@ DECLARE_bool(log_signature_stats); namespace facebook::velox::exec::test { -using facebook::velox::test::CallableSignature; -using facebook::velox::test::SignatureTemplate; +using facebook::velox::fuzzer::CallableSignature; +using facebook::velox::fuzzer::SignatureTemplate; constexpr const std::string_view kPlanNodeFileName = "plan_nodes"; @@ -219,7 +219,7 @@ class AggregationFuzzerBase { const core::PlanNodePtr& plan, const std::vector& input); - velox::test::ResultOrError execute( + velox::fuzzer::ResultOrError execute( const core::PlanNodePtr& plan, const std::vector& splits = {}, bool injectSpill = false, @@ -236,10 +236,10 @@ class AggregationFuzzerBase { const std::vector& input); void compare( - const velox::test::ResultOrError& actual, + const velox::fuzzer::ResultOrError& actual, bool customVerification, const std::vector>& customVerifiers, - const velox::test::ResultOrError& expected); + const velox::fuzzer::ResultOrError& expected); /// Returns false if the type or its children are unsupported. /// Currently returns false if type is Date,IntervalDayTime or Unknown. @@ -258,7 +258,7 @@ class AggregationFuzzerBase { bool abandonPartial, bool customVerification, const std::vector>& customVerifiers, - const velox::test::ResultOrError& expected, + const velox::fuzzer::ResultOrError& expected, int32_t maxDrivers = 2); void printSignatureStats(); diff --git a/velox/exec/fuzzer/AggregationFuzzerRunner.h b/velox/exec/fuzzer/AggregationFuzzerRunner.h index 069757655199..f82a2120189c 100644 --- a/velox/exec/fuzzer/AggregationFuzzerRunner.h +++ b/velox/exec/fuzzer/AggregationFuzzerRunner.h @@ -94,7 +94,7 @@ class AggregationFuzzerRunner { exit(1); } - auto filteredSignatures = velox::test::filterSignatures( + auto filteredSignatures = velox::fuzzer::filterSignatures( signatures, options.onlyFunctions, options.skipFunctions); if (filteredSignatures.empty()) { LOG(ERROR) diff --git a/velox/exec/fuzzer/WindowFuzzer.cpp b/velox/exec/fuzzer/WindowFuzzer.cpp index b0bb1b629543..5ce2a7730f75 100644 --- a/velox/exec/fuzzer/WindowFuzzer.cpp +++ b/velox/exec/fuzzer/WindowFuzzer.cpp @@ -298,7 +298,7 @@ void WindowFuzzer::testAlternativePlans( const std::vector& input, bool customVerification, const std::shared_ptr& customVerifier, - const velox::test::ResultOrError& expected) { + const velox::fuzzer::ResultOrError& expected) { std::vector plans; std::vector allKeys; @@ -393,7 +393,7 @@ bool WindowFuzzer::verifyWindow( persistReproInfo({{plan, {}}}, reproPersistPath_); } - velox::test::ResultOrError resultOrError; + velox::fuzzer::ResultOrError resultOrError; try { resultOrError = execute(plan); if (resultOrError.exceptionPtr) { diff --git a/velox/exec/fuzzer/WindowFuzzer.h b/velox/exec/fuzzer/WindowFuzzer.h index 3915b2f44821..bf36de8a9e3d 100644 --- a/velox/exec/fuzzer/WindowFuzzer.h +++ b/velox/exec/fuzzer/WindowFuzzer.h @@ -122,7 +122,7 @@ class WindowFuzzer : public AggregationFuzzerBase { const std::vector& input, bool customVerification, const std::shared_ptr& customVerifier, - const velox::test::ResultOrError& expected); + const velox::fuzzer::ResultOrError& expected); const std::unordered_set orderDependentFunctions_; diff --git a/velox/exec/fuzzer/WindowFuzzerRunner.h b/velox/exec/fuzzer/WindowFuzzerRunner.h index 16c512b9a51c..147ea5471a22 100644 --- a/velox/exec/fuzzer/WindowFuzzerRunner.h +++ b/velox/exec/fuzzer/WindowFuzzerRunner.h @@ -26,7 +26,7 @@ #include "velox/exec/Aggregate.h" #include "velox/exec/fuzzer/AggregationFuzzerOptions.h" #include "velox/exec/fuzzer/WindowFuzzer.h" -#include "velox/expression/tests/utils/FuzzerToolkit.h" +#include "velox/expression/fuzzer/FuzzerToolkit.h" #include "velox/parse/TypeResolver.h" #include "velox/serializers/PrestoSerializer.h" #include "velox/vector/fuzzer/VectorFuzzer.h" @@ -63,9 +63,9 @@ class WindowFuzzerRunner { exit(1); } - auto filteredAggregationSignatures = velox::test::filterSignatures( + auto filteredAggregationSignatures = velox::fuzzer::filterSignatures( aggregationSignatures, options.onlyFunctions, options.skipFunctions); - auto filteredWindowSignatures = velox::test::filterSignatures( + auto filteredWindowSignatures = velox::fuzzer::filterSignatures( windowSignatures, options.onlyFunctions, options.skipFunctions); if (filteredAggregationSignatures.empty() && filteredWindowSignatures.empty()) { diff --git a/velox/expression/CMakeLists.txt b/velox/expression/CMakeLists.txt index 316648798381..c06c5be23fcb 100644 --- a/velox/expression/CMakeLists.txt +++ b/velox/expression/CMakeLists.txt @@ -58,6 +58,5 @@ add_subdirectory(signature_parser) if(${VELOX_BUILD_TESTING}) add_subdirectory(tests) -elseif(${VELOX_BUILD_TEST_UTILS}) - add_subdirectory(tests/utils) + add_subdirectory(fuzzer) endif() diff --git a/velox/expression/tests/utils/ArgumentTypeFuzzer.cpp b/velox/expression/fuzzer/ArgumentTypeFuzzer.cpp similarity index 98% rename from velox/expression/tests/utils/ArgumentTypeFuzzer.cpp rename to velox/expression/fuzzer/ArgumentTypeFuzzer.cpp index 1b32b5c94674..1d7b784f2990 100644 --- a/velox/expression/tests/utils/ArgumentTypeFuzzer.cpp +++ b/velox/expression/fuzzer/ArgumentTypeFuzzer.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "velox/expression/tests/utils/ArgumentTypeFuzzer.h" +#include "velox/expression/fuzzer/ArgumentTypeFuzzer.h" #include #include @@ -24,7 +24,7 @@ #include "velox/type/Type.h" #include "velox/vector/fuzzer/VectorFuzzer.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { std::string typeToBaseName(const TypePtr& type) { if (type->isDecimal()) { @@ -226,4 +226,4 @@ int32_t ArgumentTypeFuzzer::rand32(int32_t min, int32_t max) { return boost::random::uniform_int_distribution(min, max)(rng_); } -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/utils/ArgumentTypeFuzzer.h b/velox/expression/fuzzer/ArgumentTypeFuzzer.h similarity index 98% rename from velox/expression/tests/utils/ArgumentTypeFuzzer.h rename to velox/expression/fuzzer/ArgumentTypeFuzzer.h index f21ced70c521..9a01ef9c5e4a 100644 --- a/velox/expression/tests/utils/ArgumentTypeFuzzer.h +++ b/velox/expression/fuzzer/ArgumentTypeFuzzer.h @@ -22,7 +22,7 @@ #include "velox/expression/SignatureBinder.h" #include "velox/type/Type.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { /// For function signatures using type variables, generates a list of /// arguments types. Optionally, allows to specify a desired return type. If @@ -104,4 +104,4 @@ std::string typeToBaseName(const TypePtr& type); /// Return the TypeKind that corresponds to typeName. std::optional baseNameToTypeKind(const std::string& typeName); -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/fuzzer/CMakeLists.txt b/velox/expression/fuzzer/CMakeLists.txt new file mode 100644 index 000000000000..ca961f58e50e --- /dev/null +++ b/velox/expression/fuzzer/CMakeLists.txt @@ -0,0 +1,46 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +add_library(velox_expression_test_utility ArgumentTypeFuzzer.cpp + FuzzerToolkit.cpp) + +target_link_libraries(velox_expression_test_utility velox_type + velox_expression_functions gtest) + +add_library( + velox_expression_fuzzer ArgumentTypeFuzzer.cpp ExpressionFuzzer.cpp + FuzzerRunner.cpp ExpressionFuzzerVerifier.cpp) + +target_link_libraries( + velox_expression_fuzzer + velox_expression_verifier + velox_type + velox_vector_fuzzer + velox_vector_test_lib + velox_function_registry + velox_expression_test_utility) + +add_executable(velox_expression_fuzzer_test ExpressionFuzzerTest.cpp) + +target_link_libraries(velox_expression_fuzzer_test velox_expression_fuzzer + velox_functions_prestosql gtest gtest_main) + +add_executable(spark_expression_fuzzer_test SparkExpressionFuzzerTest.cpp) + +target_link_libraries(spark_expression_fuzzer_test velox_expression_fuzzer + velox_functions_spark gtest gtest_main) + +if(${VELOX_BUILD_TESTING}) + add_subdirectory(tests) +endif() diff --git a/velox/expression/tests/ExpressionFuzzer.cpp b/velox/expression/fuzzer/ExpressionFuzzer.cpp similarity index 99% rename from velox/expression/tests/ExpressionFuzzer.cpp rename to velox/expression/fuzzer/ExpressionFuzzer.cpp index f8bdf6c59c87..4817d71ac462 100644 --- a/velox/expression/tests/ExpressionFuzzer.cpp +++ b/velox/expression/fuzzer/ExpressionFuzzer.cpp @@ -26,10 +26,10 @@ #include "velox/expression/FunctionSignature.h" #include "velox/expression/ReverseSignatureBinder.h" #include "velox/expression/SimpleFunctionRegistry.h" -#include "velox/expression/tests/ExpressionFuzzer.h" -#include "velox/expression/tests/utils/ArgumentTypeFuzzer.h" +#include "velox/expression/fuzzer/ArgumentTypeFuzzer.h" +#include "velox/expression/fuzzer/ExpressionFuzzer.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { namespace { using exec::SignatureBinder; @@ -1384,4 +1384,4 @@ RowTypePtr ExpressionFuzzer::fuzzRowReturnType(size_t size, char prefix) { return ROW(std::move(names), std::move(children)); } -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/ExpressionFuzzer.h b/velox/expression/fuzzer/ExpressionFuzzer.h similarity index 99% rename from velox/expression/tests/ExpressionFuzzer.h rename to velox/expression/fuzzer/ExpressionFuzzer.h index fcc7bee02a27..1e0dc9a74f74 100644 --- a/velox/expression/tests/ExpressionFuzzer.h +++ b/velox/expression/fuzzer/ExpressionFuzzer.h @@ -19,13 +19,13 @@ #include "velox/core/ITypedExpr.h" #include "velox/core/QueryCtx.h" #include "velox/expression/Expr.h" +#include "velox/expression/fuzzer/FuzzerToolkit.h" #include "velox/expression/tests/ExpressionVerifier.h" -#include "velox/expression/tests/utils/FuzzerToolkit.h" #include "velox/functions/FunctionRegistry.h" #include "velox/vector/fuzzer/VectorFuzzer.h" #include "velox/vector/tests/utils/VectorMaker.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { // A tool that can be used to generate random expressions. class ExpressionFuzzer { @@ -418,4 +418,4 @@ class ExpressionFuzzer { friend class ExpressionFuzzerUnitTest; }; -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/ExpressionFuzzerTest.cpp b/velox/expression/fuzzer/ExpressionFuzzerTest.cpp similarity index 96% rename from velox/expression/tests/ExpressionFuzzerTest.cpp rename to velox/expression/fuzzer/ExpressionFuzzerTest.cpp index 1c6a675bfdf7..e9f35f02f770 100644 --- a/velox/expression/tests/ExpressionFuzzerTest.cpp +++ b/velox/expression/fuzzer/ExpressionFuzzerTest.cpp @@ -18,7 +18,7 @@ #include #include -#include "velox/expression/tests/FuzzerRunner.h" +#include "velox/expression/fuzzer/FuzzerRunner.h" #include "velox/functions/prestosql/registration/RegistrationFunctions.h" DEFINE_int64( @@ -27,7 +27,7 @@ DEFINE_int64( "Initial seed for random number generator used to reproduce previous " "results (0 means start with random seed)."); -using facebook::velox::test::FuzzerRunner; +using facebook::velox::fuzzer::FuzzerRunner; int main(int argc, char** argv) { facebook::velox::functions::prestosql::registerAllScalarFunctions(); diff --git a/velox/expression/tests/ExpressionFuzzerVerifier.cpp b/velox/expression/fuzzer/ExpressionFuzzerVerifier.cpp similarity index 97% rename from velox/expression/tests/ExpressionFuzzerVerifier.cpp rename to velox/expression/fuzzer/ExpressionFuzzerVerifier.cpp index 45e5f5a5a8d7..9ea2d1e0421c 100644 --- a/velox/expression/tests/ExpressionFuzzerVerifier.cpp +++ b/velox/expression/fuzzer/ExpressionFuzzerVerifier.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "velox/expression/tests/ExpressionFuzzerVerifier.h" +#include "velox/expression/fuzzer/ExpressionFuzzerVerifier.h" #include #include @@ -24,9 +24,9 @@ #include "velox/expression/Expr.h" #include "velox/expression/FunctionSignature.h" #include "velox/expression/ReverseSignatureBinder.h" -#include "velox/expression/tests/ExpressionFuzzer.h" +#include "velox/expression/fuzzer/ExpressionFuzzer.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { namespace { @@ -252,7 +252,7 @@ void ExpressionFuzzerVerifier::retryWithTry( .result; } catch (const std::exception&) { if (options_.findMinimalSubexpression) { - computeMinimumSubExpression( + test::computeMinimumSubExpression( {&execCtx_, {false, ""}}, *vectorFuzzer_, plans, @@ -283,7 +283,7 @@ void ExpressionFuzzerVerifier::retryWithTry( columnsToWrapInLazy); } catch (const std::exception&) { if (options_.findMinimalSubexpression) { - computeMinimumSubExpression( + test::computeMinimumSubExpression( {&execCtx_, {false, ""}}, *vectorFuzzer_, plans, @@ -341,7 +341,7 @@ void ExpressionFuzzerVerifier::go() { columnsToWrapInLazy); } catch (const std::exception&) { if (options_.findMinimalSubexpression) { - computeMinimumSubExpression( + test::computeMinimumSubExpression( {&execCtx_, {false, ""}}, *vectorFuzzer_, plans, @@ -374,4 +374,4 @@ void ExpressionFuzzerVerifier::go() { LOG(ERROR) << "Total failed: " << numFailed; } -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/ExpressionFuzzerVerifier.h b/velox/expression/fuzzer/ExpressionFuzzerVerifier.h similarity index 97% rename from velox/expression/tests/ExpressionFuzzerVerifier.h rename to velox/expression/fuzzer/ExpressionFuzzerVerifier.h index 4faf1513b460..f651ad554143 100644 --- a/velox/expression/tests/ExpressionFuzzerVerifier.h +++ b/velox/expression/fuzzer/ExpressionFuzzerVerifier.h @@ -19,16 +19,16 @@ #include "velox/core/ITypedExpr.h" #include "velox/core/QueryCtx.h" #include "velox/expression/Expr.h" -#include "velox/expression/tests/ExpressionFuzzer.h" +#include "velox/expression/fuzzer/ExpressionFuzzer.h" +#include "velox/expression/fuzzer/FuzzerToolkit.h" #include "velox/expression/tests/ExpressionVerifier.h" -#include "velox/expression/tests/utils/FuzzerToolkit.h" #include "velox/functions/FunctionRegistry.h" #include "velox/vector/fuzzer/VectorFuzzer.h" #include "velox/vector/tests/utils/VectorMaker.h" DECLARE_int32(velox_fuzzer_max_level_of_nesting); -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { // A tool that utilizes ExpressionFuzzer, VectorFuzzer and ExpressionVerfier to // generate random expressions and verify the correctness of the results. It @@ -210,4 +210,4 @@ class ExpressionFuzzerVerifier { ExpressionFuzzer expressionFuzzer_; }; -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/FuzzerRunner.cpp b/velox/expression/fuzzer/FuzzerRunner.cpp similarity index 97% rename from velox/expression/tests/FuzzerRunner.cpp rename to velox/expression/fuzzer/FuzzerRunner.cpp index ac741944dfa6..56c58a365841 100644 --- a/velox/expression/tests/FuzzerRunner.cpp +++ b/velox/expression/fuzzer/FuzzerRunner.cpp @@ -14,8 +14,8 @@ * limitations under the License. */ -#include "velox/expression/tests/FuzzerRunner.h" -#include "velox/expression/tests/ExpressionFuzzer.h" +#include "velox/expression/fuzzer/FuzzerRunner.h" +#include "velox/expression/fuzzer/ExpressionFuzzer.h" DEFINE_int32(steps, 10, "Number of expressions to generate and execute."); @@ -148,7 +148,7 @@ DEFINE_string( "of functions at every instance. Number of tickets must be a positive " "integer. Example: eq=3,floor=5"); -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { namespace { VectorFuzzer::Options getVectorFuzzerOptions() { @@ -222,4 +222,4 @@ void FuzzerRunner::runFromGtest( getExpressionFuzzerVerifierOptions(skipFunctions, queryConfigs)) .go(); } -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/FuzzerRunner.h b/velox/expression/fuzzer/FuzzerRunner.h similarity index 90% rename from velox/expression/tests/FuzzerRunner.h rename to velox/expression/fuzzer/FuzzerRunner.h index cbf3d5ac290a..0eda0ecd1d7a 100644 --- a/velox/expression/tests/FuzzerRunner.h +++ b/velox/expression/fuzzer/FuzzerRunner.h @@ -22,10 +22,10 @@ #include #include -#include "velox/expression/tests/ExpressionFuzzerVerifier.h" +#include "velox/expression/fuzzer/ExpressionFuzzerVerifier.h" #include "velox/functions/FunctionRegistry.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { /// FuzzerRunner leverages ExpressionFuzzerVerifier to create a gtest unit test. class FuzzerRunner { @@ -41,4 +41,4 @@ class FuzzerRunner { const std::unordered_map& queryConfigs); }; -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/utils/FuzzerToolkit.cpp b/velox/expression/fuzzer/FuzzerToolkit.cpp similarity index 97% rename from velox/expression/tests/utils/FuzzerToolkit.cpp rename to velox/expression/fuzzer/FuzzerToolkit.cpp index cbbc60b4c08c..292f4619bb66 100644 --- a/velox/expression/tests/utils/FuzzerToolkit.cpp +++ b/velox/expression/fuzzer/FuzzerToolkit.cpp @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "velox/expression/tests/utils/FuzzerToolkit.h" +#include "velox/expression/fuzzer/FuzzerToolkit.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { std::string CallableSignature::toString() const { std::string buf = name; @@ -137,4 +137,4 @@ void compareVectors( LOG(INFO) << "Two vectors match."; } -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/utils/FuzzerToolkit.h b/velox/expression/fuzzer/FuzzerToolkit.h similarity index 97% rename from velox/expression/tests/utils/FuzzerToolkit.h rename to velox/expression/fuzzer/FuzzerToolkit.h index 0411d4aaecc1..9d78d0899c82 100644 --- a/velox/expression/tests/utils/FuzzerToolkit.h +++ b/velox/expression/fuzzer/FuzzerToolkit.h @@ -18,7 +18,7 @@ #include "velox/expression/FunctionSignature.h" #include "velox/vector/ComplexVector.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer { // Represents one available function signature. struct CallableSignature { @@ -111,4 +111,4 @@ void compareVectors( const std::string& leftName = "left", const std::string& rightName = "right", const std::optional& rows = std::nullopt); -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer diff --git a/velox/expression/tests/SparkExpressionFuzzerTest.cpp b/velox/expression/fuzzer/SparkExpressionFuzzerTest.cpp similarity index 95% rename from velox/expression/tests/SparkExpressionFuzzerTest.cpp rename to velox/expression/fuzzer/SparkExpressionFuzzerTest.cpp index c9531632f413..ffba105e2e08 100644 --- a/velox/expression/tests/SparkExpressionFuzzerTest.cpp +++ b/velox/expression/fuzzer/SparkExpressionFuzzerTest.cpp @@ -22,7 +22,7 @@ #include #include -#include "velox/expression/tests/FuzzerRunner.h" +#include "velox/expression/fuzzer/FuzzerRunner.h" #include "velox/functions/sparksql/Register.h" DEFINE_int64( @@ -31,7 +31,7 @@ DEFINE_int64( "Initial seed for random number generator " "(use it to reproduce previous results)."); -using facebook::velox::test::FuzzerRunner; +using facebook::velox::fuzzer::FuzzerRunner; int main(int argc, char** argv) { facebook::velox::functions::sparksql::registerFunctions(""); diff --git a/velox/expression/tests/ArgumentTypeFuzzerTest.cpp b/velox/expression/fuzzer/tests/ArgumentTypeFuzzerTest.cpp similarity index 99% rename from velox/expression/tests/ArgumentTypeFuzzerTest.cpp rename to velox/expression/fuzzer/tests/ArgumentTypeFuzzerTest.cpp index 595a09ccaf8d..32971df22e0d 100644 --- a/velox/expression/tests/ArgumentTypeFuzzerTest.cpp +++ b/velox/expression/fuzzer/tests/ArgumentTypeFuzzerTest.cpp @@ -14,14 +14,14 @@ * limitations under the License. */ -#include "velox/expression/tests/utils/ArgumentTypeFuzzer.h" +#include "velox/expression/fuzzer/ArgumentTypeFuzzer.h" #include #include "velox/expression/SignatureBinder.h" #include "velox/type/Type.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer::test { namespace { const uint32_t kMaxVariadicArgs = 5; @@ -649,4 +649,4 @@ TEST_F(ArgumentTypeFuzzerTest, fuzzDecimalReturnType) { EXPECT_EQ(DECIMAL(10, 7)->toString(), returnType->toString()); } -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer::test diff --git a/velox/expression/tests/utils/CMakeLists.txt b/velox/expression/fuzzer/tests/CMakeLists.txt similarity index 68% rename from velox/expression/tests/utils/CMakeLists.txt rename to velox/expression/fuzzer/tests/CMakeLists.txt index afdae1b2789d..459189ed4c80 100644 --- a/velox/expression/tests/utils/CMakeLists.txt +++ b/velox/expression/fuzzer/tests/CMakeLists.txt @@ -12,8 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -add_library(velox_expression_test_utility ArgumentTypeFuzzer.cpp - FuzzerToolkit.cpp) +add_executable(velox_expression_fuzzer_unit_test ArgumentTypeFuzzerTest.cpp ExpressionFuzzerUnitTest.cpp) -target_link_libraries(velox_expression_test_utility velox_type - velox_expression_functions gtest) +target_link_libraries( + velox_expression_fuzzer_unit_test + velox_expression_fuzzer + velox_functions_prestosql + velox_core + velox_expression + gtest + gtest_main) diff --git a/velox/expression/tests/ExpressionFuzzerUnitTest.cpp b/velox/expression/fuzzer/tests/ExpressionFuzzerUnitTest.cpp similarity index 97% rename from velox/expression/tests/ExpressionFuzzerUnitTest.cpp rename to velox/expression/fuzzer/tests/ExpressionFuzzerUnitTest.cpp index 9fd3a09b3a04..2a0093133687 100644 --- a/velox/expression/tests/ExpressionFuzzerUnitTest.cpp +++ b/velox/expression/fuzzer/tests/ExpressionFuzzerUnitTest.cpp @@ -16,10 +16,10 @@ #include -#include "velox/expression/tests/ExpressionFuzzer.h" +#include "velox/expression/fuzzer/ExpressionFuzzer.h" #include "velox/functions/prestosql/registration/RegistrationFunctions.h" -namespace facebook::velox::test { +namespace facebook::velox::fuzzer::test { class ExpressionFuzzerUnitTest : public testing::Test { protected: static void SetUpTestCase() { @@ -199,4 +199,4 @@ TEST_F(ExpressionFuzzerUnitTest, exprBank) { } } -} // namespace facebook::velox::test +} // namespace facebook::velox::fuzzer::test diff --git a/velox/expression/tests/CMakeLists.txt b/velox/expression/tests/CMakeLists.txt index 6958e22f9276..c58c7963834e 100644 --- a/velox/expression/tests/CMakeLists.txt +++ b/velox/expression/tests/CMakeLists.txt @@ -12,11 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -add_subdirectory(utils) - add_executable( velox_expression_test - ArgumentTypeFuzzerTest.cpp ArrayViewTest.cpp ArrayWriterTest.cpp CastExprTest.cpp @@ -88,29 +85,6 @@ target_link_libraries( velox_expression_verifier velox_vector_test_lib velox_vector_fuzzer velox_type velox_expression_test_utility) -add_library(velox_expression_fuzzer ExpressionFuzzer.cpp FuzzerRunner.cpp - ExpressionFuzzerVerifier.cpp) - -target_link_libraries( - velox_expression_fuzzer - velox_expression_verifier - velox_type - velox_vector_fuzzer - velox_vector_test_lib - velox_function_registry - velox_expression_test_utility) - -add_executable(velox_expression_fuzzer_unit_test ExpressionFuzzerUnitTest.cpp) - -target_link_libraries( - velox_expression_fuzzer_unit_test - velox_expression_fuzzer - velox_functions_prestosql - velox_core - velox_expression - gtest - gtest_main) - add_library(velox_expression_runner ExpressionRunner.cpp) target_link_libraries( velox_expression_runner velox_expression_verifier velox_functions_prestosql @@ -150,13 +124,3 @@ target_link_libraries( velox_vector_test_lib gtest gtest_main) - -add_executable(velox_expression_fuzzer_test ExpressionFuzzerTest.cpp) - -target_link_libraries(velox_expression_fuzzer_test velox_expression_fuzzer - velox_functions_prestosql gtest gtest_main) - -add_executable(spark_expression_fuzzer_test SparkExpressionFuzzerTest.cpp) - -target_link_libraries(spark_expression_fuzzer_test velox_expression_fuzzer - velox_functions_spark gtest gtest_main) diff --git a/velox/expression/tests/ExpressionRunnerUnitTest.cpp b/velox/expression/tests/ExpressionRunnerUnitTest.cpp index a6107543885b..2c56715b197f 100644 --- a/velox/expression/tests/ExpressionRunnerUnitTest.cpp +++ b/velox/expression/tests/ExpressionRunnerUnitTest.cpp @@ -15,12 +15,12 @@ */ #include -#include "FuzzerRunner.h" #include "velox/dwio/common/tests/utils/BatchMaker.h" #include "velox/exec/tests/utils/TempFilePath.h" #include "velox/expression/Expr.h" #include "velox/expression/SignatureBinder.h" -#include "velox/expression/tests/ExpressionFuzzer.h" +#include "velox/expression/fuzzer/ExpressionFuzzer.h" +#include "velox/expression/fuzzer/FuzzerRunner.h" #include "velox/expression/tests/ExpressionRunner.h" #include "velox/functions/prestosql/registration/RegistrationFunctions.h" #include "velox/vector/VectorSaver.h" diff --git a/velox/expression/tests/ExpressionVerifier.cpp b/velox/expression/tests/ExpressionVerifier.cpp index e4e23320834e..1d3b74cf82fb 100644 --- a/velox/expression/tests/ExpressionVerifier.cpp +++ b/velox/expression/tests/ExpressionVerifier.cpp @@ -41,7 +41,7 @@ void logRowVector(const RowVectorPtr& rowVector) { } } // namespace -ResultOrError ExpressionVerifier::verify( +fuzzer::ResultOrError ExpressionVerifier::verify( const std::vector& plans, const RowVectorPtr& rowVector, VectorPtr&& resultVector, @@ -127,7 +127,7 @@ ResultOrError ExpressionVerifier::verify( if (copiedInput) { // Flatten the input vector as an optimization if its very deeply nested. - compareVectors( + fuzzer::compareVectors( copiedInput, BaseVector::copy(*inputRowVector), "Copy of original input", @@ -162,7 +162,7 @@ ResultOrError ExpressionVerifier::verify( exprSetSimplified.eval(rows, evalCtxSimplified, simplifiedEvalResult); // Flatten the input vector as an optimization if its very deeply nested. - compareVectors( + fuzzer::compareVectors( copy, BaseVector::copy(*rowVector), "Copy of original input", @@ -183,14 +183,14 @@ ResultOrError ExpressionVerifier::verify( if (exceptionCommonPtr || exceptionSimplifiedPtr) { // Throws in case exceptions are not compatible. If they are compatible, // return false to signal that the expression failed. - compareExceptions(exceptionCommonPtr, exceptionSimplifiedPtr); + fuzzer::compareExceptions(exceptionCommonPtr, exceptionSimplifiedPtr); return {nullptr, exceptionCommonPtr}; } else { // Throws in case output is different. VELOX_CHECK_EQ(commonEvalResult.size(), plans.size()); VELOX_CHECK_EQ(simplifiedEvalResult.size(), plans.size()); for (int i = 0; i < plans.size(); ++i) { - compareVectors( + fuzzer::compareVectors( commonEvalResult[i], simplifiedEvalResult[i], "common path results ", diff --git a/velox/expression/tests/ExpressionVerifier.h b/velox/expression/tests/ExpressionVerifier.h index be7cb52e680c..240768b2aa68 100644 --- a/velox/expression/tests/ExpressionVerifier.h +++ b/velox/expression/tests/ExpressionVerifier.h @@ -18,7 +18,7 @@ #include "velox/core/ITypedExpr.h" #include "velox/core/QueryCtx.h" -#include "velox/expression/tests/utils/FuzzerToolkit.h" +#include "velox/expression/fuzzer/FuzzerToolkit.h" #include "velox/functions/FunctionRegistry.h" #include "velox/type/Type.h" #include "velox/vector/BaseVector.h" @@ -63,7 +63,7 @@ class ExpressionVerifier { // - exception thrown by the common path if both paths failed with compatible // exceptions. // - throws otherwise (incompatible exceptions or different results). - ResultOrError verify( + fuzzer::ResultOrError verify( const std::vector& plans, const RowVectorPtr& rowVector, VectorPtr&& resultVector,