Teach TestFailures how to load, parse, and interpret NRWT test results
[WebKit-https.git] / Tools / BuildSlaveSupport / build.webkit.org-config / public_html / TestFailures / NRWTResultsParser.js
1 /*
2  * Copyright (C) 2011 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 function NRWTResultsParser() {
27 }
28
29 NRWTResultsParser.prototype = {
30     parse: function(unexpectedResultsJS) {
31         var data;
32         function ADD_RESULTS(x) {
33             data = x;
34         }
35
36         eval(unexpectedResultsJS);
37         console.assert(data);
38
39         var result = { tests: {}, tooManyFailures: data.interrupted };
40
41         function forEachTest(tree, handler, opt_prefix) {
42             var prefix = opt_prefix || '';
43
44             for (var key in tree) {
45                 var newPrefix = prefix ? (prefix + '/' + key) : key;
46                 if ('actual' in tree[key]) {
47                     var testObject = tree[key];
48                     testObject.name = newPrefix;
49                     handler(testObject);
50                 } else
51                     forEachTest(tree[key], handler, newPrefix);
52             }
53         }
54
55         function isFailureExpected(expected, actual) {
56             if (actual === 'SKIP')
57                 return true;
58
59             var expectedArray = expected.split(' ');
60             var actualArray = actual.split(' ');
61             for (var i = 0; i < actualArray.length; i++) {
62                 var actualValue = actualArray[i];
63                 if (expectedArray.contains(actualValue))
64                     continue;
65                 if (expectedArray.contains('FAIL') && ['IMAGE', 'TEXT', 'IMAGE+TEXT'].contains(actualValue))
66                     continue;
67                 return false;
68             }
69
70             return true;
71         }
72
73         function convertNRWTResultString(nrwtResult) {
74             const translations = {
75                 CRASH: 'crash',
76                 'IMAGE+TEXT': 'fail',
77                 IMAGE: 'fail',
78                 TEXT: 'fail',
79                 TIMEOUT: 'timeout',
80             };
81
82             if (nrwtResult in translations)
83                 return translations[nrwtResult];
84
85             if (nrwtResult.contains(' '))
86                 return 'flaky';
87
88             return 'unknown failure type ' + nrwtResult;
89         }
90
91         forEachTest(data.tests, function(test) {
92             if (isFailureExpected(test.expected, test.actual))
93                 return;
94             result.tests[test.name] = { failureType: convertNRWTResultString(test.actual) };
95         });
96
97         return result;
98     },
99 };