Commit | Line | Data |
---|---|---|
08fcae0c DV |
1 | // Invoke via: ./test.sh |
2 | // | |
3 | // or phantomjs phantom-driver.js [testCase.test] | |
4 | // | |
5 | // For more on phantomjs, visit www.phantomjs.org. | |
6 | ||
300c5ff0 DV |
7 | var RunAllAutoTests = function(done_callback) { |
8 | ||
86a3e64f DV |
9 | var page = require('webpage').create(); |
10 | ||
11 | // NOTE: Cannot include '#' or '?' in this URL. | |
12 | var url = 'auto_tests/misc/local.html'; | |
13 | ||
14 | // NOTE: changing the line below to this: | |
15 | // page.open(url, function(status)) { | |
16 | // makes phantomjs hang. | |
17 | page.open(url, function(status) { | |
18 | if (status !== 'success') { | |
19 | console.warn('Page status: ' + status); | |
20 | console.log(page); | |
21 | phantom.exit(); | |
22 | } | |
23 | ||
24 | var testCase, test; | |
2323945c RK |
25 | var verbose = false; |
26 | var optIdx = 0; | |
27 | if (phantom.args.length > 0 && phantom.args[0] === "--verbose") { | |
0c59a428 RK |
28 | verbose = true; |
29 | optIdx = 1; | |
2323945c RK |
30 | } |
31 | if (phantom.args.length == optIdx + 1) { | |
32 | var parts = phantom.args[optIdx].split('.'); | |
86a3e64f | 33 | if (2 != parts.length) { |
2323945c | 34 | console.warn('Usage: phantomjs phantom-driver.js [--verbose] [testCase.test]'); |
86a3e64f DV |
35 | phantom.exit(); |
36 | } | |
37 | testCase = parts[0]; | |
38 | test = parts[1]; | |
39 | } | |
40 | ||
41 | var loggingOn = false; | |
0c59a428 | 42 | |
86a3e64f DV |
43 | page.onConsoleMessage = function (msg) { |
44 | if (msg == 'Running ' + test) { | |
45 | loggingOn = true; | |
46 | } else if (msg.substr(0, 'Running'.length) == 'Running') { | |
47 | loggingOn = false; | |
48 | } | |
2323945c | 49 | if (verbose || loggingOn) console.log(msg); |
86a3e64f DV |
50 | }; |
51 | ||
52 | page.onError = function (msg, trace) { | |
53 | console.log(msg); | |
54 | trace.forEach(function(item) { | |
55 | console.log(' ', item.file, ':', item.line); | |
56 | }) | |
57 | }; | |
58 | ||
59 | var results; | |
60 | ||
61 | // Run all tests. | |
08fcae0c | 62 | var start = new Date().getTime(); |
86a3e64f | 63 | results = page.evaluate(function() { |
0c59a428 RK |
64 | var num_passing = 0, num_failing = 0; |
65 | var failures = []; | |
86a3e64f DV |
66 | // Phantom doesn't like stacktrace.js using the "arguments" object |
67 | // in stacktrace.js, which it interprets in strict mode. | |
68 | printStackTrace = undefined; | |
69 | ||
0c59a428 RK |
70 | jstestdriver.attachListener({ |
71 | finish : function(tc, name, result, e) { | |
72 | console.log("Result:", tc.name, name, result, e); | |
73 | if (result) { | |
74 | // console.log(testCase + '.' + test + ' passed'); | |
75 | num_passing++; | |
76 | } else { | |
77 | num_failing++; | |
78 | failures.push(tc.name + '.' + name); | |
79 | } | |
80 | } | |
81 | }); | |
86a3e64f | 82 | var testCases = getAllTestCases(); |
86a3e64f DV |
83 | for (var idx in testCases) { |
84 | var entry = testCases[idx]; | |
85 | ||
86 | var prototype = entry.testCase; | |
87 | var tc = new entry.testCase(); | |
88 | var result = tc.runAllTests(); | |
86a3e64f | 89 | } |
0c59a428 RK |
90 | return { |
91 | num_passing : num_passing, | |
92 | num_failing : num_failing, | |
93 | failures : failures | |
94 | }; | |
86a3e64f | 95 | }); |
08fcae0c DV |
96 | var end = new Date().getTime(); |
97 | var elapsed = (end - start) / 1000; | |
86a3e64f | 98 | |
0c59a428 RK |
99 | console.log('Ran ' + (results.num_passing + results.num_failing) + ' tests in ' + elapsed + 's.'); |
100 | console.log(results.num_passing + ' test(s) passed'); | |
101 | console.log(results.num_failing + ' test(s) failed:'); | |
102 | for (var i = 0; i < results.failures.length; i++) { | |
08fcae0c | 103 | // TODO(danvk): print an auto_test/misc/local URL that runs this test. |
0c59a428 | 104 | console.log(' ' + results.failures[i] + ' failed.'); |
08fcae0c | 105 | } |
86a3e64f | 106 | |
0c59a428 | 107 | done_callback(results.num_failing, results.num_passing); |
300c5ff0 DV |
108 | }); |
109 | ||
110 | }; | |
111 | ||
112 | // Load all "tests/" pages. | |
113 | var LoadAllManualTests = function(totally_done_callback) { | |
114 | ||
115 | var fs = require('fs'); | |
116 | var tests = fs.list('tests'); | |
117 | var pages = []; | |
118 | ||
119 | function make_barrier_closure(n, fn) { | |
120 | var calls = 0; | |
121 | return function() { | |
122 | calls++; | |
123 | if (calls == n) { | |
124 | fn(); | |
125 | } else { | |
126 | // console.log('' + calls + ' done, ' + (n - calls) + ' remain'); | |
127 | } | |
128 | }; | |
129 | } | |
130 | ||
131 | var tasks = []; | |
132 | for (var i = 0; i < tests.length; i++) { | |
133 | if (tests[i].substr(-5) != '.html') continue; | |
134 | tasks.push(tests[i]); | |
135 | } | |
136 | tasks = [ 'independent-series.html' ]; | |
137 | ||
138 | var loaded_page = make_barrier_closure(tasks.length, function() { | |
139 | // Wait 2 secs to allow JS errors to happen after page load. | |
140 | setTimeout(function() { | |
141 | var success = 0, failures = 0; | |
142 | for (var i = 0; i < pages.length; i++) { | |
143 | if (pages[i].success && !pages[i].hasErrors) { | |
144 | success++; | |
145 | } else { | |
146 | failures++; | |
147 | } | |
148 | } | |
149 | console.log('Successfully loaded ' + success + ' / ' + | |
150 | (success + failures) + ' test pages.'); | |
151 | totally_done_callback(failures, success); | |
152 | }, 2000); | |
153 | }); | |
154 | ||
155 | ||
156 | for (var i = 0; i < tasks.length; i++) { | |
157 | var url = 'file://' + fs.absolute('tests/' + tasks[i]); | |
158 | pages.push(function(path, url) { | |
159 | var page = require('webpage').create(); | |
160 | page.success = false; | |
161 | page.hasErrors = false; | |
162 | page.onError = function (msg, trace) { | |
163 | console.log(path + ': ' + msg); | |
164 | page.hasErrors = true; | |
165 | trace.forEach(function(item) { | |
166 | console.log(' ', item.file, ':', item.line); | |
167 | }); | |
168 | }; | |
169 | page.onLoadFinished = function(status) { | |
170 | if (status == 'success') { | |
171 | page.success = true; | |
172 | } | |
173 | if (!page.done) loaded_page(); | |
174 | page.done = true; | |
175 | }; | |
176 | page.open(url); | |
177 | return page; | |
178 | }(tasks[i], url)); | |
179 | } | |
180 | ||
181 | }; | |
182 | ||
183 | ||
184 | // First run all auto_tests. | |
185 | // If they all pass, load the manual tests. | |
186 | RunAllAutoTests(function(num_failing, num_passing) { | |
187 | if (num_failing !== 0) { | |
86a3e64f | 188 | console.log('FAIL'); |
300c5ff0 | 189 | phantom.exit(); |
5776905d RK |
190 | } else { |
191 | console.log('PASS'); | |
86a3e64f | 192 | } |
86a3e64f | 193 | phantom.exit(); |
300c5ff0 DV |
194 | |
195 | // This is not yet reliable enough to be useful: | |
196 | /* | |
197 | LoadAllManualTests(function(failing, passing) { | |
198 | if (failing !== 0) { | |
199 | console.log('FAIL'); | |
200 | } else { | |
201 | console.log('PASS'); | |
202 | } | |
203 | phantom.exit(); | |
204 | }); | |
205 | */ | |
86a3e64f | 206 | }); |