Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Tools / GardeningServer / scripts / results.js
1 /*
2  * Copyright (C) 2011 Google 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 var results = results || {};
27
28 (function() {
29
30 var PASS = 'PASS';
31 var TIMEOUT = 'TIMEOUT';
32 var TEXT = 'TEXT';
33 var CRASH = 'CRASH';
34 var IMAGE = 'IMAGE';
35 var IMAGE_TEXT = 'IMAGE+TEXT';
36 var AUDIO = 'AUDIO';
37 var MISSING = 'MISSING';
38
39 var kFailingResults = [TEXT, IMAGE_TEXT, AUDIO];
40
41 var kExpectedImageSuffix = '-expected.png';
42 var kActualImageSuffix = '-actual.png';
43 var kImageDiffSuffix = '-diff.png';
44 var kExpectedAudioSuffix = '-expected.wav';
45 var kActualAudioSuffix = '-actual.wav';
46 var kExpectedTextSuffix = '-expected.txt';
47 var kActualTextSuffix = '-actual.txt';
48 var kDiffTextSuffix = '-diff.txt';
49 var kCrashLogSuffix = '-crash-log.txt';
50
51 var kPreferredSuffixOrder = [
52     kExpectedImageSuffix,
53     kActualImageSuffix,
54     kImageDiffSuffix,
55     kExpectedTextSuffix,
56     kActualTextSuffix,
57     kDiffTextSuffix,
58     kCrashLogSuffix,
59     kExpectedAudioSuffix,
60     kActualAudioSuffix,
61 ];
62
63 // Kinds of results.
64 results.kActualKind = 'actual';
65 results.kExpectedKind = 'expected';
66 results.kDiffKind = 'diff';
67 results.kUnknownKind = 'unknown';
68
69 // Types of tests.
70 results.kImageType = 'image';
71 results.kAudioType = 'audio';
72 results.kTextType = 'text';
73
74 function possibleSuffixListFor(failureTypeList)
75 {
76     var suffixList = [];
77
78     function pushImageSuffixes()
79     {
80         suffixList.push(kExpectedImageSuffix);
81         suffixList.push(kActualImageSuffix);
82         suffixList.push(kImageDiffSuffix);
83     }
84
85     function pushAudioSuffixes()
86     {
87         suffixList.push(kExpectedAudioSuffix);
88         suffixList.push(kActualAudioSuffix);
89     }
90
91     function pushTextSuffixes()
92     {
93         suffixList.push(kActualTextSuffix);
94         suffixList.push(kExpectedTextSuffix);
95         suffixList.push(kDiffTextSuffix);
96     }
97
98     failureTypeList.forEach(function(failureType) {
99         switch(failureType) {
100         case IMAGE:
101             pushImageSuffixes();
102             break;
103         case TEXT:
104             pushTextSuffixes();
105             break;
106         case AUDIO:
107             pushAudioSuffixes();
108             break;
109         case IMAGE_TEXT:
110             pushImageSuffixes();
111             pushTextSuffixes();
112             break;
113         case CRASH:
114             suffixList.push(kCrashLogSuffix);
115             break;
116         case MISSING:
117             pushImageSuffixes();
118             pushTextSuffixes();
119             break;
120         default:
121             // FIXME: Add support for the rest of the result types.
122             // '-expected.html',
123             // '-expected-mismatch.html',
124             // ... and possibly more.
125             break;
126         }
127     });
128
129     return suffixList.unique();
130 }
131
132 function failureTypeList(failureBlob)
133 {
134     return failureBlob.split(' ');
135 };
136
137 function resultsDirectoryURL(builderName)
138 {
139     return 'https://storage.googleapis.com/chromium-layout-test-archives/' +
140         builderName.replace(/[ .()]/g, '_') + '/results/layout-test-results/';
141 }
142
143 results.failureInfo = function(testName, builderName, result)
144 {
145     return {
146         'testName': testName,
147         'builderName': builderName,
148         'failureTypeList': failureTypeList(result),
149     };
150 }
151
152 results.resultKind = function(url)
153 {
154     if (/-actual\.[a-z]+$/.test(url))
155         return results.kActualKind;
156     else if (/-expected\.[a-z]+$/.test(url))
157         return results.kExpectedKind;
158     else if (/diff\.[a-z]+$/.test(url))
159         return results.kDiffKind;
160     return results.kUnknownKind;
161 }
162
163 results.resultType = function(url)
164 {
165     if (/\.png$/.test(url))
166         return results.kImageType;
167     if (/\.wav$/.test(url))
168         return results.kAudioType;
169     return results.kTextType;
170 }
171
172 function sortResultURLsBySuffix(urls)
173 {
174     var sortedURLs = [];
175     kPreferredSuffixOrder.forEach(function(suffix) {
176         urls.forEach(function(url) {
177             if (!url.endsWith(suffix))
178                 return;
179             sortedURLs.push(url);
180         });
181     });
182     if (sortedURLs.length != urls.length)
183         throw "sortResultURLsBySuffix failed to return the same number of URLs.";
184     return sortedURLs;
185 }
186
187 results._trimExtension = function(url)
188 {
189     var index = url.lastIndexOf('.');
190     if (index == -1)
191         return url;
192     return url.substr(0, index);
193 }
194
195 results.fetchResultsURLs = function(failureInfo)
196 {
197     var testNameStem = results._trimExtension(failureInfo.testName);
198     var urlStem = resultsDirectoryURL(failureInfo.builderName);
199
200     var suffixList = possibleSuffixListFor(failureInfo.failureTypeList);
201     var resultURLs = [];
202     var probePromises = [];
203     suffixList.forEach(function(suffix) {
204         var url = urlStem + testNameStem + suffix;
205         probePromises.push(net.probe(url).then(
206             function() {
207                 resultURLs.push(url);
208             },
209             function() {}));
210     });
211     return Promise.all(probePromises).then(function() {
212         return sortResultURLsBySuffix(resultURLs);
213     });
214 };
215
216 })();