OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 13 matching lines...) Expand all Loading... |
24 */ | 24 */ |
25 | 25 |
26 var unittest = unittest || {}; | 26 var unittest = unittest || {}; |
27 | 27 |
28 (function () { | 28 (function () { |
29 | 29 |
30 module("results"); | 30 module("results"); |
31 | 31 |
32 var MockResultsBaseURL = 'https://storage.googleapis.com/chromium-layout-test-ar
chives/Mock_Builder/results/layout-test-results'; | 32 var MockResultsBaseURL = 'https://storage.googleapis.com/chromium-layout-test-ar
chives/Mock_Builder/results/layout-test-results'; |
33 | 33 |
34 unittest.kExampleResultsJSON = { | |
35 "tests": { | |
36 "scrollbars": { | |
37 "custom-scrollbar-with-incomplete-style.html": { | |
38 "expected": "IMAGE", | |
39 "actual": "IMAGE", | |
40 }, | |
41 "expected-wontfix": { | |
42 "expected": "WONTFIX", | |
43 "actual": "SKIP", | |
44 }, | |
45 "flaky-scrollbar.html": { | |
46 "expected": "PASS", | |
47 "actual": "PASS TEXT", | |
48 "is_unexpected": true, | |
49 }, | |
50 "unexpected-failing-flaky-scrollbar.html": { | |
51 "expected": "TEXT", | |
52 "actual": "TIMEOUT TEXT", | |
53 "is_unexpected": true, | |
54 }, | |
55 "unexpected-pass.html": { | |
56 "expected": "FAIL", | |
57 "actual": "PASS", | |
58 "is_unexpected": true, | |
59 } | |
60 }, | |
61 "userscripts": { | |
62 "user-script-video-document.html": { | |
63 "expected": "FAIL", | |
64 "actual": "TEXT", | |
65 }, | |
66 "another-test.html": { | |
67 "expected": "PASS", | |
68 "actual": "TEXT", | |
69 "is_unexpected": true, | |
70 } | |
71 }, | |
72 }, | |
73 "skipped": 339, | |
74 "num_regressions": 14, | |
75 "interrupted": false, | |
76 "layout_tests_dir": "\/mnt\/data\/b\/build\/slave\/Webkit_Linux\/build\/src\
/third_party\/WebKit\/LayoutTests", | |
77 "version": 3, | |
78 "num_passes": 15566, | |
79 "has_pretty_patch": false, | |
80 "fixable": 1233, | |
81 "num_flaky":1, | |
82 "has_wdiff": true, | |
83 "blink_revision": "90430" | |
84 }; | |
85 | |
86 test("ResultAnalyzer", 44, function() { | |
87 var analyzer; | |
88 | |
89 analyzer = new results.ResultAnalyzer({expected: 'PASS', actual: 'TEXT', is_
unexpected: true}); | |
90 ok(analyzer.hasUnexpectedFailures()); | |
91 deepEqual(analyzer.unexpectedResults(), ['TEXT']); | |
92 ok(!analyzer.succeeded()); | |
93 ok(!analyzer.flaky()); | |
94 | |
95 analyzer = new results.ResultAnalyzer({expected: 'PASS TIMEOUT', actual: 'TE
XT', is_unexpected: true}); | |
96 ok(analyzer.hasUnexpectedFailures()); | |
97 deepEqual(analyzer.unexpectedResults(), ['TEXT']); | |
98 ok(!analyzer.succeeded()); | |
99 ok(!analyzer.flaky()); | |
100 | |
101 analyzer = new results.ResultAnalyzer({expected: 'TEXT', actual: 'TEXT TIMEO
UT', is_unexpected: true}); | |
102 ok(analyzer.hasUnexpectedFailures()); | |
103 deepEqual(analyzer.unexpectedResults(), ['TIMEOUT']); | |
104 ok(!analyzer.succeeded()); | |
105 ok(analyzer.flaky()); | |
106 | |
107 analyzer = new results.ResultAnalyzer({expected: 'PASS', actual: 'TEXT TIMEO
UT', is_unexpected: true}); | |
108 ok(analyzer.hasUnexpectedFailures()); | |
109 deepEqual(analyzer.unexpectedResults(), ['TEXT', 'TIMEOUT']); | |
110 ok(!analyzer.succeeded()); | |
111 ok(analyzer.flaky()); | |
112 | |
113 analyzer = new results.ResultAnalyzer({expected: 'PASS TIMEOUT', actual: 'PA
SS TIMEOUT'}); | |
114 ok(!analyzer.hasUnexpectedFailures()); | |
115 deepEqual(analyzer.unexpectedResults(), []); | |
116 ok(analyzer.succeeded()); | |
117 ok(analyzer.flaky()); | |
118 | |
119 analyzer = new results.ResultAnalyzer({expected: 'PASS TIMEOUT', actual: 'TI
MEOUT PASS'}); | |
120 ok(!analyzer.hasUnexpectedFailures()); | |
121 deepEqual(analyzer.unexpectedResults(), []); | |
122 ok(analyzer.succeeded()); | |
123 ok(analyzer.flaky()); | |
124 | |
125 analyzer = new results.ResultAnalyzer({expected: 'FAIL', actual: 'TIMEOUT',
is_unexpected: true}); | |
126 ok(analyzer.hasUnexpectedFailures()); | |
127 deepEqual(analyzer.unexpectedResults(), ['TIMEOUT']); | |
128 ok(!analyzer.succeeded()); | |
129 ok(!analyzer.flaky()); | |
130 | |
131 analyzer = new results.ResultAnalyzer({expected: 'FAIL', actual: 'IMAGE', is
_unexpected: true}); | |
132 ok(analyzer.hasUnexpectedFailures()); | |
133 deepEqual(analyzer.unexpectedResults(), ['IMAGE']); | |
134 ok(!analyzer.succeeded()); | |
135 ok(!analyzer.flaky()); | |
136 | |
137 analyzer = new results.ResultAnalyzer({expected: 'FAIL', actual: 'AUDIO'}); | |
138 ok(!analyzer.hasUnexpectedFailures()); | |
139 deepEqual(analyzer.unexpectedResults(), []); | |
140 ok(!analyzer.succeeded()); | |
141 ok(!analyzer.flaky()); | |
142 | |
143 analyzer = new results.ResultAnalyzer({expected: 'FAIL', actual: 'TEXT'}); | |
144 ok(!analyzer.hasUnexpectedFailures()); | |
145 deepEqual(analyzer.unexpectedResults(), []); | |
146 ok(!analyzer.succeeded()); | |
147 ok(!analyzer.flaky()); | |
148 | |
149 analyzer = new results.ResultAnalyzer({expected: 'FAIL', actual: 'IMAGE+TEXT
'}); | |
150 ok(!analyzer.hasUnexpectedFailures()); | |
151 deepEqual(analyzer.unexpectedResults(), []); | |
152 ok(!analyzer.succeeded()); | |
153 ok(!analyzer.flaky()); | |
154 }); | |
155 | |
156 test("trimExtension", 6, function() { | 34 test("trimExtension", 6, function() { |
157 equals(results._trimExtension("xyz"), "xyz"); | 35 equals(results._trimExtension("xyz"), "xyz"); |
158 equals(results._trimExtension("xy.z"), "xy"); | 36 equals(results._trimExtension("xy.z"), "xy"); |
159 equals(results._trimExtension("x.yz"), "x"); | 37 equals(results._trimExtension("x.yz"), "x"); |
160 equals(results._trimExtension("x.y.z"), "x.y"); | 38 equals(results._trimExtension("x.y.z"), "x.y"); |
161 equals(results._trimExtension(".xyz"), ""); | 39 equals(results._trimExtension(".xyz"), ""); |
162 equals(results._trimExtension(""), ""); | 40 equals(results._trimExtension(""), ""); |
163 }); | 41 }); |
164 | 42 |
165 test("joinPath", 1, function() { | |
166 var value = results._joinPath("path/to", "test.html"); | |
167 equals(value, "path/to/test.html"); | |
168 }); | |
169 | |
170 test("joinPath with empty parent", 1, function() { | |
171 var value = results._joinPath("", "test.html"); | |
172 equals(value, "test.html"); | |
173 }); | |
174 | |
175 test("filterTree", 2, function() { | |
176 var tree = { | |
177 'path': { | |
178 'to': { | |
179 'test.html': { | |
180 'actual': 'PASS', | |
181 'expected': 'FAIL' | |
182 } | |
183 }, | |
184 'another.html': { | |
185 'actual': 'TEXT', | |
186 'expected': 'PASS' | |
187 } | |
188 } | |
189 } | |
190 | |
191 function isLeaf(node) | |
192 { | |
193 return !!node.actual; | |
194 } | |
195 | |
196 function actualIsText(node) | |
197 { | |
198 return node.actual == 'TEXT'; | |
199 } | |
200 | |
201 var all = results._filterTree(tree, isLeaf, function() { return true }); | |
202 deepEqual(all, { | |
203 'path/to/test.html': { | |
204 'actual': 'PASS', | |
205 'expected': 'FAIL' | |
206 }, | |
207 'path/another.html': { | |
208 'actual': 'TEXT', | |
209 'expected': 'PASS' | |
210 } | |
211 }); | |
212 | |
213 var text = results._filterTree(tree, isLeaf, actualIsText); | |
214 deepEqual(text, { | |
215 'path/another.html': { | |
216 'actual': 'TEXT', | |
217 'expected': 'PASS' | |
218 } | |
219 }); | |
220 }); | |
221 | |
222 test("unexpectedFailures", 1, function() { | |
223 var unexpectedFailures = results.unexpectedFailures(unittest.kExampleResults
JSON); | |
224 deepEqual(unexpectedFailures, { | |
225 "userscripts/another-test.html": { | |
226 "expected": "PASS", | |
227 "actual": "TEXT", | |
228 "is_unexpected": true, | |
229 } | |
230 }); | |
231 }); | |
232 | |
233 test("unexpectedFailuresByTest", 1, function() { | |
234 var unexpectedFailuresByTest = results.unexpectedFailuresByTest({ | |
235 "Mock Builder": unittest.kExampleResultsJSON | |
236 }); | |
237 deepEqual(unexpectedFailuresByTest, { | |
238 "userscripts/another-test.html": { | |
239 "Mock Builder": { | |
240 "expected": "PASS", | |
241 "actual": "TEXT", | |
242 "is_unexpected": true, | |
243 } | |
244 } | |
245 }); | |
246 }); | |
247 | |
248 test("failureInfo", 1, function() { | 43 test("failureInfo", 1, function() { |
249 var failureInfo = results.failureInfo("userscripts/another-test.html", "Mock
Builder", "FAIL PASS"); | 44 var failureInfo = results.failureInfo("userscripts/another-test.html", "Mock
Builder", "FAIL PASS"); |
250 deepEqual(failureInfo, { | 45 deepEqual(failureInfo, { |
251 "testName": "userscripts/another-test.html", | 46 "testName": "userscripts/another-test.html", |
252 "builderName": "Mock Builder", | 47 "builderName": "Mock Builder", |
253 "failureTypeList": ["FAIL", "PASS"], | 48 "failureTypeList": ["FAIL", "PASS"], |
254 }); | 49 }); |
255 }); | 50 }); |
256 | 51 |
257 test("resultKind", 12, function() { | 52 test("resultKind", 12, function() { |
(...skipping 19 matching lines...) Expand all Loading... |
277 equals(results.resultType("http://example.com/foo.bar-expected.txt"), "text"
); | 72 equals(results.resultType("http://example.com/foo.bar-expected.txt"), "text"
); |
278 equals(results.resultType("http://example.com/foo.bar-diff.txt"), "text"); | 73 equals(results.resultType("http://example.com/foo.bar-diff.txt"), "text"); |
279 equals(results.resultType("http://example.com/foo-actual.png"), "image"); | 74 equals(results.resultType("http://example.com/foo-actual.png"), "image"); |
280 equals(results.resultType("http://example.com/foo-expected.png"), "image"); | 75 equals(results.resultType("http://example.com/foo-expected.png"), "image"); |
281 equals(results.resultType("http://example.com/foo-diff.png"), "image"); | 76 equals(results.resultType("http://example.com/foo-diff.png"), "image"); |
282 equals(results.resultType("http://example.com/foo-pretty-diff.html"), "text"
); | 77 equals(results.resultType("http://example.com/foo-pretty-diff.html"), "text"
); |
283 equals(results.resultType("http://example.com/foo-wdiff.html"), "text"); | 78 equals(results.resultType("http://example.com/foo-wdiff.html"), "text"); |
284 equals(results.resultType("http://example.com/foo.xyz"), "text"); | 79 equals(results.resultType("http://example.com/foo.xyz"), "text"); |
285 }); | 80 }); |
286 | 81 |
287 test("resultNodeForTest", 4, function() { | |
288 deepEqual(results.resultNodeForTest(unittest.kExampleResultsJSON, "userscrip
ts/another-test.html"), { | |
289 "expected": "PASS", | |
290 "actual": "TEXT", | |
291 "is_unexpected": true, | |
292 }); | |
293 equals(results.resultNodeForTest(unittest.kExampleResultsJSON, "foo.html"),
null); | |
294 equals(results.resultNodeForTest(unittest.kExampleResultsJSON, "userscripts/
foo.html"), null); | |
295 equals(results.resultNodeForTest(unittest.kExampleResultsJSON, "userscripts/
foo/bar.html"), null); | |
296 }); | |
297 | |
298 asyncTest("walkHistory", 1, function() { | |
299 var simulator = new NetworkSimulator(); | |
300 | |
301 var keyMap = { | |
302 "Mock_Builder": { | |
303 "11108": { | |
304 "tests": { | |
305 "userscripts": { | |
306 "another-test.html": { | |
307 "expected": "PASS", | |
308 "actual": "TEXT", | |
309 "is_unexpected": true, | |
310 } | |
311 }, | |
312 }, | |
313 "blink_revision": "90430" | |
314 }, | |
315 "11107":{ | |
316 "tests": { | |
317 "userscripts": { | |
318 "user-script-video-document.html": { | |
319 "expected": "FAIL", | |
320 "actual": "TEXT", | |
321 "is_unexpected": false, | |
322 }, | |
323 "another-test.html": { | |
324 "expected": "PASS", | |
325 "actual": "TEXT", | |
326 "is_unexpected": true, | |
327 } | |
328 }, | |
329 }, | |
330 "blink_revision": "90429" | |
331 }, | |
332 "11106":{ | |
333 "tests": { | |
334 "userscripts": { | |
335 "another-test.html": { | |
336 "expected": "PASS", | |
337 "actual": "TEXT", | |
338 "is_unexpected": true, | |
339 } | |
340 }, | |
341 }, | |
342 "blink_revision": "90426" | |
343 }, | |
344 "11105":{ | |
345 "tests": { | |
346 "userscripts": { | |
347 "user-script-video-document.html": { | |
348 "expected": "FAIL", | |
349 "actual": "TEXT", | |
350 "is_unexpected": false, | |
351 }, | |
352 }, | |
353 }, | |
354 "blink_revision": "90424" | |
355 }, | |
356 }, | |
357 "Another_Builder": { | |
358 "22202":{ | |
359 "tests": { | |
360 "userscripts": { | |
361 "another-test.html": { | |
362 "expected": "PASS", | |
363 "actual": "TEXT", | |
364 "is_unexpected": true, | |
365 } | |
366 }, | |
367 }, | |
368 "blink_revision": "90426" | |
369 }, | |
370 "22201":{ | |
371 "tests": { | |
372 }, | |
373 "blink_revision": "90425" | |
374 }, | |
375 }, | |
376 }; | |
377 | |
378 simulator.jsonp = function(url) { | |
379 var result = keyMap[/[^/]+_Builder/.exec(url)][/\d+/.exec(url)]; | |
380 return Promise.resolve(result ? result : {}); | |
381 }; | |
382 | |
383 simulator.json = function(url) { | |
384 if (/Mock Builder/.test(url)) | |
385 return Promise.resolve({cachedBuilds: [11101, 11102, 11103, 11104, 1
1105, 11106, 11107, 11108]}); | |
386 else if (/Another Builder/.test(url)) | |
387 return Promise.resolve({cachedBuilds: [22201, 22202]}); | |
388 else | |
389 return Promise.reject(false, 'Unexpected URL: ' + url); | |
390 }; | |
391 | |
392 simulator.runTest(function() { | |
393 results.regressionRangeForFailure("Mock Builder", "userscripts/anoth
er-test.html") | |
394 .then(function(result) { | |
395 var oldestFailingRevision = result[0]; | |
396 var newestPassingRevision = result[1]; | |
397 equals(oldestFailingRevision, 90426); | |
398 equals(newestPassingRevision, 90424); | |
399 }); | |
400 results.unifyRegressionRanges(["Mock Builder", "Another Builder"], "
userscripts/another-test.html") | |
401 .then(function(result) { | |
402 var oldestFailingRevision = result[0]; | |
403 var newestPassingRevision = result[1]; | |
404 equals(oldestFailingRevision, 90426); | |
405 equals(newestPassingRevision, 90425); | |
406 }); | |
407 }).then(start); | |
408 }); | |
409 | |
410 asyncTest("walkHistory (no revision)", 3, function() { | |
411 var simulator = new NetworkSimulator(); | |
412 | |
413 var keyMap = { | |
414 "Mock_Builder": { | |
415 "11103": { | |
416 "tests": { | |
417 "userscripts": { | |
418 "another-test.html": { | |
419 "expected": "PASS", | |
420 "actual": "TEXT" | |
421 } | |
422 }, | |
423 }, | |
424 "blink_revision": "" | |
425 }, | |
426 "11102":{ | |
427 "tests": { | |
428 }, | |
429 "blink_revision": "" | |
430 }, | |
431 }, | |
432 }; | |
433 | |
434 simulator.jsonp = function(url) { | |
435 var result = keyMap[/[^/]+_Builder/.exec(url)][/\d+/.exec(url)]; | |
436 return Promise.resolve(result ? result : {}); | |
437 }; | |
438 | |
439 simulator.json = function(url) { | |
440 return Promise.resolve({}); | |
441 }; | |
442 | |
443 simulator.runTest(function() { | |
444 results.regressionRangeForFailure("Mock Builder", "userscripts/another-t
est.html").then(function(result) { | |
445 var oldestFailingRevision = result[0]; | |
446 var newestPassingRevision = result[1]; | |
447 equals(oldestFailingRevision, 0); | |
448 equals(newestPassingRevision, 0); | |
449 }).then(start); | |
450 }); | |
451 }); | |
452 | |
453 asyncTest("fetchResultsURLs", 5, function() { | 82 asyncTest("fetchResultsURLs", 5, function() { |
454 var simulator = new NetworkSimulator(); | 83 var simulator = new NetworkSimulator(); |
455 | 84 |
456 var probedURLs = []; | 85 var probedURLs = []; |
457 simulator.probe = function(url) | 86 simulator.probe = function(url) |
458 { | 87 { |
459 probedURLs.push(url); | 88 probedURLs.push(url); |
460 if (url.endsWith('.txt')) | 89 if (url.endsWith('.txt')) |
461 return Promise.resolve(); | 90 return Promise.resolve(); |
462 else if (/taco.+png$/.test(url)) | 91 else if (/taco.+png$/.test(url)) |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 MockResultsBaseURL + "/userscripts/taco-actual.png", | 135 MockResultsBaseURL + "/userscripts/taco-actual.png", |
507 MockResultsBaseURL + "/userscripts/taco-diff.png", | 136 MockResultsBaseURL + "/userscripts/taco-diff.png", |
508 MockResultsBaseURL + "/userscripts/taco-actual.txt", | 137 MockResultsBaseURL + "/userscripts/taco-actual.txt", |
509 MockResultsBaseURL + "/userscripts/taco-expected.txt", | 138 MockResultsBaseURL + "/userscripts/taco-expected.txt", |
510 MockResultsBaseURL + "/userscripts/taco-diff.txt", | 139 MockResultsBaseURL + "/userscripts/taco-diff.txt", |
511 ]); | 140 ]); |
512 start(); | 141 start(); |
513 }); | 142 }); |
514 }); | 143 }); |
515 | 144 |
516 asyncTest("fetchResultsByBuilder", 3, function() { | |
517 var simulator = new NetworkSimulator(); | |
518 | |
519 var probedURLs = []; | |
520 simulator.jsonp = function(url) | |
521 { | |
522 probedURLs.push(url); | |
523 return Promise.resolve(url.endsWith('results/layout-test-results/failing
_results.json')); | |
524 }; | |
525 | |
526 simulator.runTest(function() { | |
527 results.fetchResultsByBuilder(['MockBuilder1', 'MockBuilder2']).then(fun
ction(resultsByBuilder) { | |
528 deepEqual(resultsByBuilder, { | |
529 "MockBuilder1": true, | |
530 "MockBuilder2": true, | |
531 }); | |
532 }); | |
533 }).then(start); | |
534 | |
535 deepEqual(probedURLs, [ | |
536 MockResultsBaseURL.replace('Mock_Builder', 'MockBuilder1') + "/failing_r
esults.json", | |
537 MockResultsBaseURL.replace('Mock_Builder', 'MockBuilder2') + "/failing_r
esults.json" | |
538 ]); | |
539 | |
540 }); | |
541 | |
542 })(); | 145 })(); |
OLD | NEW |