1*a6021da3SAndroid Build Coastguard Worker // Copyright 2008 the V8 project authors. All rights reserved.
2*a6021da3SAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
3*a6021da3SAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
4*a6021da3SAndroid Build Coastguard Worker // met:
5*a6021da3SAndroid Build Coastguard Worker //
6*a6021da3SAndroid Build Coastguard Worker // * Redistributions of source code must retain the above copyright
7*a6021da3SAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
8*a6021da3SAndroid Build Coastguard Worker // * Redistributions in binary form must reproduce the above
9*a6021da3SAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following
10*a6021da3SAndroid Build Coastguard Worker // disclaimer in the documentation and/or other materials provided
11*a6021da3SAndroid Build Coastguard Worker // with the distribution.
12*a6021da3SAndroid Build Coastguard Worker // * Neither the name of Google Inc. nor the names of its
13*a6021da3SAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived
14*a6021da3SAndroid Build Coastguard Worker // from this software without specific prior written permission.
15*a6021da3SAndroid Build Coastguard Worker //
16*a6021da3SAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17*a6021da3SAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18*a6021da3SAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19*a6021da3SAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20*a6021da3SAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21*a6021da3SAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22*a6021da3SAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23*a6021da3SAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24*a6021da3SAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25*a6021da3SAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26*a6021da3SAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*a6021da3SAndroid Build Coastguard Worker
28*a6021da3SAndroid Build Coastguard Worker #include "cctest.h"
29*a6021da3SAndroid Build Coastguard Worker #include <stdio.h>
30*a6021da3SAndroid Build Coastguard Worker #include <stdlib.h>
31*a6021da3SAndroid Build Coastguard Worker #include <string.h>
32*a6021da3SAndroid Build Coastguard Worker
33*a6021da3SAndroid Build Coastguard Worker
34*a6021da3SAndroid Build Coastguard Worker CcTest* CcTest::last_ = NULL;
35*a6021da3SAndroid Build Coastguard Worker
36*a6021da3SAndroid Build Coastguard Worker // The windows compiler doesn't like to use `strdup`, and claims it's a
37*a6021da3SAndroid Build Coastguard Worker // deprecated name.
38*a6021da3SAndroid Build Coastguard Worker // For simplicity just implement it ourselves.
Strdup(const char * str)39*a6021da3SAndroid Build Coastguard Worker static char* Strdup(const char* str) {
40*a6021da3SAndroid Build Coastguard Worker size_t len = strlen(str);
41*a6021da3SAndroid Build Coastguard Worker char* result = reinterpret_cast<char*>(malloc(len + 1));
42*a6021da3SAndroid Build Coastguard Worker memcpy(result, str, len + 1);
43*a6021da3SAndroid Build Coastguard Worker return result;
44*a6021da3SAndroid Build Coastguard Worker }
45*a6021da3SAndroid Build Coastguard Worker
CcTest(TestFunction * callback,const char * test_file,const char * test_name,const char * test_dependency,bool test_is_enabled)46*a6021da3SAndroid Build Coastguard Worker CcTest::CcTest(TestFunction* callback, const char* test_file,
47*a6021da3SAndroid Build Coastguard Worker const char* test_name, const char* test_dependency,
48*a6021da3SAndroid Build Coastguard Worker bool test_is_enabled)
49*a6021da3SAndroid Build Coastguard Worker : callback_(callback), name_(test_name), dependency_(test_dependency),
50*a6021da3SAndroid Build Coastguard Worker prev_(last_) {
51*a6021da3SAndroid Build Coastguard Worker // Find the base name of this test (const_cast required on Windows).
52*a6021da3SAndroid Build Coastguard Worker char *basename = strrchr(const_cast<char *>(test_file), '/');
53*a6021da3SAndroid Build Coastguard Worker if (!basename) {
54*a6021da3SAndroid Build Coastguard Worker basename = strrchr(const_cast<char *>(test_file), '\\');
55*a6021da3SAndroid Build Coastguard Worker }
56*a6021da3SAndroid Build Coastguard Worker if (!basename) {
57*a6021da3SAndroid Build Coastguard Worker basename = Strdup(test_file);
58*a6021da3SAndroid Build Coastguard Worker } else {
59*a6021da3SAndroid Build Coastguard Worker basename = Strdup(basename + 1);
60*a6021da3SAndroid Build Coastguard Worker }
61*a6021da3SAndroid Build Coastguard Worker // Drop the extension, if there is one.
62*a6021da3SAndroid Build Coastguard Worker char *extension = strrchr(basename, '.');
63*a6021da3SAndroid Build Coastguard Worker if (extension) *extension = 0;
64*a6021da3SAndroid Build Coastguard Worker // Install this test in the list of tests
65*a6021da3SAndroid Build Coastguard Worker file_ = basename;
66*a6021da3SAndroid Build Coastguard Worker enabled_ = test_is_enabled;
67*a6021da3SAndroid Build Coastguard Worker prev_ = last_;
68*a6021da3SAndroid Build Coastguard Worker last_ = this;
69*a6021da3SAndroid Build Coastguard Worker }
70*a6021da3SAndroid Build Coastguard Worker
71*a6021da3SAndroid Build Coastguard Worker
PrintTestList(CcTest * current)72*a6021da3SAndroid Build Coastguard Worker static void PrintTestList(CcTest* current) {
73*a6021da3SAndroid Build Coastguard Worker if (current == NULL) return;
74*a6021da3SAndroid Build Coastguard Worker PrintTestList(current->prev());
75*a6021da3SAndroid Build Coastguard Worker if (current->dependency() != NULL) {
76*a6021da3SAndroid Build Coastguard Worker printf("%s/%s<%s\n",
77*a6021da3SAndroid Build Coastguard Worker current->file(), current->name(), current->dependency());
78*a6021da3SAndroid Build Coastguard Worker } else {
79*a6021da3SAndroid Build Coastguard Worker printf("%s/%s<\n", current->file(), current->name());
80*a6021da3SAndroid Build Coastguard Worker }
81*a6021da3SAndroid Build Coastguard Worker }
82*a6021da3SAndroid Build Coastguard Worker
83*a6021da3SAndroid Build Coastguard Worker
main(int argc,char * argv[])84*a6021da3SAndroid Build Coastguard Worker int main(int argc, char* argv[]) {
85*a6021da3SAndroid Build Coastguard Worker int tests_run = 0;
86*a6021da3SAndroid Build Coastguard Worker bool print_run_count = true;
87*a6021da3SAndroid Build Coastguard Worker if (argc == 1) {
88*a6021da3SAndroid Build Coastguard Worker // Just run all the tests.
89*a6021da3SAndroid Build Coastguard Worker CcTest* test = CcTest::last();
90*a6021da3SAndroid Build Coastguard Worker while (test != NULL) {
91*a6021da3SAndroid Build Coastguard Worker if (test->enabled()) {
92*a6021da3SAndroid Build Coastguard Worker test->Run();
93*a6021da3SAndroid Build Coastguard Worker tests_run++;
94*a6021da3SAndroid Build Coastguard Worker }
95*a6021da3SAndroid Build Coastguard Worker test = test->prev();
96*a6021da3SAndroid Build Coastguard Worker }
97*a6021da3SAndroid Build Coastguard Worker }
98*a6021da3SAndroid Build Coastguard Worker for (int i = 1; i < argc; i++) {
99*a6021da3SAndroid Build Coastguard Worker char* arg = argv[i];
100*a6021da3SAndroid Build Coastguard Worker if (strcmp(arg, "--list") == 0) {
101*a6021da3SAndroid Build Coastguard Worker PrintTestList(CcTest::last());
102*a6021da3SAndroid Build Coastguard Worker print_run_count = false;
103*a6021da3SAndroid Build Coastguard Worker
104*a6021da3SAndroid Build Coastguard Worker } else {
105*a6021da3SAndroid Build Coastguard Worker char* arg_copy = Strdup(arg);
106*a6021da3SAndroid Build Coastguard Worker char* testname = strchr(arg_copy, '/');
107*a6021da3SAndroid Build Coastguard Worker if (testname) {
108*a6021da3SAndroid Build Coastguard Worker // Split the string in two by nulling the slash and then run
109*a6021da3SAndroid Build Coastguard Worker // exact matches.
110*a6021da3SAndroid Build Coastguard Worker *testname = 0;
111*a6021da3SAndroid Build Coastguard Worker char* file = arg_copy;
112*a6021da3SAndroid Build Coastguard Worker char* name = testname + 1;
113*a6021da3SAndroid Build Coastguard Worker CcTest* test = CcTest::last();
114*a6021da3SAndroid Build Coastguard Worker while (test != NULL) {
115*a6021da3SAndroid Build Coastguard Worker if (test->enabled()
116*a6021da3SAndroid Build Coastguard Worker && strcmp(test->file(), file) == 0
117*a6021da3SAndroid Build Coastguard Worker && strcmp(test->name(), name) == 0) {
118*a6021da3SAndroid Build Coastguard Worker test->Run();
119*a6021da3SAndroid Build Coastguard Worker tests_run++;
120*a6021da3SAndroid Build Coastguard Worker }
121*a6021da3SAndroid Build Coastguard Worker test = test->prev();
122*a6021da3SAndroid Build Coastguard Worker }
123*a6021da3SAndroid Build Coastguard Worker
124*a6021da3SAndroid Build Coastguard Worker } else {
125*a6021da3SAndroid Build Coastguard Worker // Run all tests with the specified file or test name.
126*a6021da3SAndroid Build Coastguard Worker char* file_or_name = arg_copy;
127*a6021da3SAndroid Build Coastguard Worker CcTest* test = CcTest::last();
128*a6021da3SAndroid Build Coastguard Worker while (test != NULL) {
129*a6021da3SAndroid Build Coastguard Worker if (test->enabled()
130*a6021da3SAndroid Build Coastguard Worker && (strcmp(test->file(), file_or_name) == 0
131*a6021da3SAndroid Build Coastguard Worker || strcmp(test->name(), file_or_name) == 0)) {
132*a6021da3SAndroid Build Coastguard Worker test->Run();
133*a6021da3SAndroid Build Coastguard Worker tests_run++;
134*a6021da3SAndroid Build Coastguard Worker }
135*a6021da3SAndroid Build Coastguard Worker test = test->prev();
136*a6021da3SAndroid Build Coastguard Worker }
137*a6021da3SAndroid Build Coastguard Worker }
138*a6021da3SAndroid Build Coastguard Worker free(arg_copy);
139*a6021da3SAndroid Build Coastguard Worker }
140*a6021da3SAndroid Build Coastguard Worker }
141*a6021da3SAndroid Build Coastguard Worker if (print_run_count && tests_run != 1)
142*a6021da3SAndroid Build Coastguard Worker printf("Ran %i tests.\n", tests_run);
143*a6021da3SAndroid Build Coastguard Worker return 0;
144*a6021da3SAndroid Build Coastguard Worker }
145