2 * Copyright (C) 2011 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 var results = results || {};
31 var TIMEOUT = 'TIMEOUT';
35 var IMAGE_TEXT = 'IMAGE+TEXT';
37 var MISSING = 'MISSING';
39 var kFailingResults = [TEXT, IMAGE_TEXT, AUDIO];
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';
51 var kPreferredSuffixOrder = [
64 results.kActualKind = 'actual';
65 results.kExpectedKind = 'expected';
66 results.kDiffKind = 'diff';
67 results.kUnknownKind = 'unknown';
70 results.kImageType = 'image';
71 results.kAudioType = 'audio';
72 results.kTextType = 'text';
74 function possibleSuffixListFor(failureTypeList)
78 function pushImageSuffixes()
80 suffixList.push(kExpectedImageSuffix);
81 suffixList.push(kActualImageSuffix);
82 suffixList.push(kImageDiffSuffix);
85 function pushAudioSuffixes()
87 suffixList.push(kExpectedAudioSuffix);
88 suffixList.push(kActualAudioSuffix);
91 function pushTextSuffixes()
93 suffixList.push(kActualTextSuffix);
94 suffixList.push(kExpectedTextSuffix);
95 suffixList.push(kDiffTextSuffix);
98 failureTypeList.forEach(function(failureType) {
114 suffixList.push(kCrashLogSuffix);
121 // FIXME: Add support for the rest of the result types.
123 // '-expected-mismatch.html',
124 // ... and possibly more.
129 return suffixList.unique();
132 function failureTypeList(failureBlob)
134 return failureBlob.split(' ');
137 function resultsDirectoryURL(builderName)
139 return 'https://storage.googleapis.com/chromium-layout-test-archives/' +
140 builderName.replace(/[ .()]/g, '_') + '/results/layout-test-results/';
143 results.failureInfo = function(testName, builderName, result)
146 'testName': testName,
147 'builderName': builderName,
148 'failureTypeList': failureTypeList(result),
152 results.resultKind = function(url)
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;
163 results.resultType = function(url)
165 if (/\.png$/.test(url))
166 return results.kImageType;
167 if (/\.wav$/.test(url))
168 return results.kAudioType;
169 return results.kTextType;
172 function sortResultURLsBySuffix(urls)
175 kPreferredSuffixOrder.forEach(function(suffix) {
176 urls.forEach(function(url) {
177 if (!url.endsWith(suffix))
179 sortedURLs.push(url);
182 if (sortedURLs.length != urls.length)
183 throw "sortResultURLsBySuffix failed to return the same number of URLs.";
187 results._trimExtension = function(url)
189 var index = url.lastIndexOf('.');
192 return url.substr(0, index);
195 results.fetchResultsURLs = function(failureInfo)
197 var testNameStem = results._trimExtension(failureInfo.testName);
198 var urlStem = resultsDirectoryURL(failureInfo.builderName);
200 var suffixList = possibleSuffixListFor(failureInfo.failureTypeList);
202 var probePromises = [];
203 suffixList.forEach(function(suffix) {
204 var url = urlStem + testNameStem + suffix;
205 probePromises.push(net.probe(url).then(
207 resultURLs.push(url);
211 return Promise.all(probePromises).then(function() {
212 return sortResultURLsBySuffix(resultURLs);