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