blob: f539d312952793f021ae645e25864f4c95331ae8 [file] [log] [blame]
// Copyright (c) 2012, 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.
#include <stdio.h>
#include "bin/file.h"
#include "vm/benchmark_test.h"
#include "vm/dart.h"
#include "vm/unit_test.h"
// TODO(iposva, asiva): This is a placeholder for the real unittest framework.
namespace dart {
// Only run tests that match the filter string. The default does not match any
// tests.
static const char* const kNone = "No Test or Benchmarks";
static const char* const kAll = "All";
static const char* const kList = "List all Tests and Benchmarks";
static const char* const kAllTests = "All Tests";
static const char* const kAllBenchmarks = "All Benchmarks";
static const char* run_filter = kNone;
static int run_matches = 0;
void TestCase::Run() {
fprintf(stdout, "Running test: %s\n", name());
(*run_)();
fprintf(stdout, "Done: %s\n", name());
}
void TestCaseBase::RunTest() {
if ((run_filter == kAll) ||
(run_filter == kAllTests) ||
(strcmp(run_filter, this->name()) == 0)) {
this->Run();
run_matches++;
} else if (run_filter == kList) {
fprintf(stdout, "%s\n", this->name());
run_matches++;
}
}
void Benchmark::RunBenchmark() {
if ((run_filter == kAll) ||
(run_filter == kAllBenchmarks) ||
(strcmp(run_filter, this->name()) == 0)) {
this->Run();
OS::Print("%s(RunTime): %"Pd"\n", this->name(), this->score());
run_matches++;
} else if (run_filter == kList) {
fprintf(stdout, "%s\n", this->name());
run_matches++;
}
}
static void DumpPprofSymbolInfo(const char* pprof_filename) {
if (pprof_filename != NULL) {
char* err = NULL;
Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, NULL, NULL, &err);
EXPECT(isolate != NULL);
Dart_EnterScope();
File* pprof_file =
File::Open(pprof_filename, File::kWriteTruncate);
ASSERT(pprof_file != NULL);
void* buffer;
int buffer_size;
Dart_GetPprofSymbolInfo(&buffer, &buffer_size);
if (buffer_size > 0) {
ASSERT(buffer != NULL);
pprof_file->WriteFully(buffer, buffer_size);
}
delete pprof_file; // Closes the file.
Dart_ExitScope();
Dart_ShutdownIsolate();
}
}
static void PrintUsage() {
fprintf(stderr, "run_vm_tests [--list | --benchmarks | "
"--tests | --all | <test name> | <benchmark name>]\n");
fprintf(stderr, "run_vm_tests [vm-flags ...] <test name>\n");
fprintf(stderr, "run_vm_tests [vm-flags ...] <benchmark name>\n");
}
static int Main(int argc, const char** argv) {
// Flags being passed to the Dart VM.
int dart_argc = 0;
const char** dart_argv = NULL;
const char* pprof_filename = NULL;
if (argc < 2) {
// Bad parameter count.
PrintUsage();
return 1;
} else if (argc == 2) {
if (strcmp(argv[1], "--list") == 0) {
run_filter = kList;
// List all tests and benchmarks and exit without initializing the VM.
TestCaseBase::RunAll();
Benchmark::RunAll(argv[0]);
return 0;
} else if (strcmp(argv[1], "--all") == 0) {
run_filter = kAll;
} else if (strcmp(argv[1], "--tests") == 0) {
run_filter = kAllTests;
} else if (strcmp(argv[1], "--benchmarks") == 0) {
run_filter = kAllBenchmarks;
} else {
run_filter = argv[1];
}
} else {
// Last argument is the test name, the rest are vm flags.
run_filter = argv[argc - 1];
const char* pprof_option = "--generate_pprof_symbols=";
int length = strlen(pprof_option);
if (strncmp(pprof_option, argv[1], length) == 0) {
pprof_filename = (argv[1] + length);
Dart_InitPprofSupport();
// Remove the first two values (executable, pprof flag) from the
// arguments and exclude the last argument which is the test name.
dart_argc = argc - 3;
dart_argv = &argv[2];
} else {
// Remove the first value (executable) from the arguments and
// exclude the last argument which is the test name.
dart_argc = argc - 2;
dart_argv = &argv[1];
}
}
bool set_vm_flags_success = Flags::ProcessCommandLineFlags(dart_argc,
dart_argv);
ASSERT(set_vm_flags_success);
bool init_success = Dart::InitOnce(NULL, NULL, NULL);
ASSERT(init_success);
// Apply the filter to all registered tests.
TestCaseBase::RunAll();
// Apply the filter to all registered benchmarks.
Benchmark::RunAll(argv[0]);
// Print a warning message if no tests or benchmarks were matched.
if (run_matches == 0) {
fprintf(stderr, "No tests matched: %s\n", run_filter);
return 1;
}
// Dump symbol information for the profiler.
DumpPprofSymbolInfo(pprof_filename);
return 0;
}
} // namespace dart
int main(int argc, const char** argv) {
return dart::Main(argc, argv);
}