// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // A slimmed down version of bin/run_vm_tests.cc that only runs C++ non-DartVM // unit tests. // // By slimming it down to non-VM, we can run with the defines for all target // architectures and operating systems. #include "vm/compiler/ffi/unit_test.h" #include "platform/assert.h" #include "platform/syslog.h" namespace dart { namespace compiler { namespace ffi { static const char* const kNone = "No Test"; static const char* const kList = "List all Tests"; static const char* const kAll = "Run all Tests"; static const char* run_filter = kNone; static const char* kCommandAll = "--all"; static const char* kCommandList = "--list"; static const char* kCommandUpdate = "--update"; static int run_matches = 0; TestCaseBase* TestCaseBase::first_ = nullptr; TestCaseBase* TestCaseBase::tail_ = nullptr; bool TestCaseBase::update_expectations = false; TestCaseBase::TestCaseBase(const char* name, const char* expectation) : next_(nullptr), name_(name), expectation_(expectation) { ASSERT(strlen(expectation) > 0); if (first_ == nullptr) { first_ = this; } else { tail_->next_ = this; } tail_ = this; } void TestCaseBase::RunAll() { TestCaseBase* test = first_; while (test != nullptr) { test->RunTest(); test = test->next_; } } void TestCaseBase::RunTest() { if (run_filter == kList) { Syslog::Print("%s %s\n", this->name(), this->expectation()); run_matches++; } else if (run_filter == kAll) { this->Run(); run_matches++; } else if (strcmp(run_filter, this->name()) == 0) { this->Run(); run_matches++; } } void RawTestCase::Run() { Syslog::Print("Running test: %s\n", name()); (*run_)(); Syslog::Print("Done: %s\n", name()); } static int Main(int argc, const char** argv) { if (argc == 2 && strcmp(argv[1], kCommandList) == 0) { run_filter = kList; // List all tests and benchmarks and exit. TestCaseBase::RunAll(); fflush(stdout); return 0; } if (argc > 1 && strcmp(argv[1], kCommandUpdate) == 0) { TestCaseBase::update_expectations = true; } if (strcmp(argv[argc - 1], kCommandAll) == 0) { // Run all tests. run_filter = kAll; } else if (argc > 1) { // Run only test with specific name. run_filter = argv[argc - 1]; } TestCaseBase::RunAll(); // Print a warning message if no tests or benchmarks were matched. if (run_matches == 0) { Syslog::PrintErr("No tests matched: %s\n", run_filter); return 1; } if (Expect::failed()) { Syslog::PrintErr( "Some tests failed. Run the following command to update " "expectations.\ntools/test.py --vm-options=--update ffi_unit"); return 255; } return 0; } } // namespace ffi } // namespace compiler } // namespace dart int main(int argc, const char** argv) { return dart::compiler::ffi::Main(argc, argv); }