blob: 8fe87843c7b65a05bb1d781507ccbf2094d58fa9 [file] [log] [blame]
// 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);
}