|  | // 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 constexpr const char* kNone = "No Test"; | 
|  | static constexpr const char* kList = "List all Tests"; | 
|  | static constexpr const char* kAll = "Run all Tests"; | 
|  | static const char* run_filter = kNone; | 
|  |  | 
|  | static constexpr const char* kCommandAll = "--all"; | 
|  | static constexpr const char* kCommandList = "--list"; | 
|  | static constexpr 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); | 
|  | } |