Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: tools/skimage_main.cpp

Issue 22293006: Truly ignore failures in skimage. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: More tests! Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "gm_expectations.h" 8 #include "gm_expectations.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 static SkTArray<SkString, false> gMissingCodecs; 97 static SkTArray<SkString, false> gMissingCodecs;
98 static SkTArray<SkString, false> gDecodeFailures; 98 static SkTArray<SkString, false> gDecodeFailures;
99 static SkTArray<SkString, false> gEncodeFailures; 99 static SkTArray<SkString, false> gEncodeFailures;
100 static SkTArray<SkString, false> gSuccessfulDecodes; 100 static SkTArray<SkString, false> gSuccessfulDecodes;
101 static SkTArray<SkString, false> gSuccessfulSubsetDecodes; 101 static SkTArray<SkString, false> gSuccessfulSubsetDecodes;
102 static SkTArray<SkString, false> gFailedSubsetDecodes; 102 static SkTArray<SkString, false> gFailedSubsetDecodes;
103 // Files/subsets that do not have expectations. Not reported as a failure of the test so 103 // Files/subsets that do not have expectations. Not reported as a failure of the test so
104 // the bots will not turn red with each new image test. 104 // the bots will not turn red with each new image test.
105 static SkTArray<SkString, false> gMissingExpectations; 105 static SkTArray<SkString, false> gMissingExpectations;
106 static SkTArray<SkString, false> gMissingSubsetExpectations; 106 static SkTArray<SkString, false> gMissingSubsetExpectations;
107 // For files that are expected to fail.
108 static SkTArray<SkString, false> gKnownFailures;
107 109
108 static SkBitmap::Config gPrefConfig(SkBitmap::kNo_Config); 110 static SkBitmap::Config gPrefConfig(SkBitmap::kNo_Config);
109 111
110 // Expections read from a file specified by readExpectationsPath. The expectatio ns must have been 112 // Expections read from a file specified by readExpectationsPath. The expectatio ns must have been
111 // previously written using createExpectationsPath. 113 // previously written using createExpectationsPath.
112 SkAutoTUnref<skiagm::JsonExpectationsSource> gJsonExpectations; 114 SkAutoTUnref<skiagm::JsonExpectationsSource> gJsonExpectations;
113 115
114 static bool write_bitmap(const char outName[], const SkBitmap& bm) { 116 static bool write_bitmap(const char outName[], const SkBitmap& bm) {
115 if (SkImageEncoder::EncodeFile(outName, bm, SkImageEncoder::kPNG_Type, 100)) { 117 if (SkImageEncoder::EncodeFile(outName, bm, SkImageEncoder::kPNG_Type, 100)) {
116 return true; 118 return true;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 static void write_expectations(const SkBitmap& bitmap, const char* filename) { 183 static void write_expectations(const SkBitmap& bitmap, const char* filename) {
182 if (!FLAGS_createExpectationsPath.isEmpty()) { 184 if (!FLAGS_createExpectationsPath.isEmpty()) {
183 // Creates an Expectations object, and add it to the list to write. 185 // Creates an Expectations object, and add it to the list to write.
184 skiagm::Expectations expectation(bitmap); 186 skiagm::Expectations expectation(bitmap);
185 Json::Value value = expectation.asJsonValue(); 187 Json::Value value = expectation.asJsonValue();
186 gExpectationsToWrite[filename] = value; 188 gExpectationsToWrite[filename] = value;
187 } 189 }
188 } 190 }
189 191
190 /** 192 /**
191 * Return true if this filename is a known failure, and therefore a failure
192 * to decode should be ignored.
193 */
194 static bool expect_to_fail(const char* filename) {
195 if (NULL == gJsonExpectations.get()) {
196 return false;
197 }
198 skiagm::Expectations jsExpectations = gJsonExpectations->get(filename);
199 return jsExpectations.ignoreFailure();
200 }
201
202 /**
203 * Compare against an expectation for this filename, if there is one. 193 * Compare against an expectation for this filename, if there is one.
204 * @param digest GmResultDigest, computed from the decoded bitmap, to compare t o the 194 * @param digest GmResultDigest, computed from the decoded bitmap, to compare t o the
205 * expectation. 195 * expectation.
206 * @param filename String used to find the expected value. 196 * @param filename String used to find the expected value.
207 * @param failureArray Array to add a failure message to on failure. 197 * @param failureArray Array to add a failure message to on failure.
208 * @param missingArray Array to add missing expectation to on failure. 198 * @param missingArray Array to add missing expectation to on failure.
epoger 2013/10/15 15:31:03 maybe instead... @param missingArray Array to add
scroggo 2013/10/15 19:50:59 Done.
209 * @return bool True in any of these cases: 199 * @return bool True in any of these cases:
210 * - the bitmap matches the expectation. 200 * - the bitmap matches the expectation.
211 * False in any of these cases: 201 * False in any of these cases:
212 * - there is no expectations file. 202 * - there is no expectations file.
213 * - there is an expectations file, but no expectation for this bitmap. 203 * - there is an expectations file, but no expectation for this bitmap.
214 * - there is an expectation for this bitmap, but it did not ma tch. 204 * - there is an expectation for this bitmap, but it did not ma tch.
215 * - expectation could not be computed from the bitmap. 205 * - expectation could not be computed from the bitmap.
216 */ 206 */
217 static bool compare_to_expectations_if_necessary(const skiagm::GmResultDigest& d igest, 207 static bool compare_to_expectations_if_necessary(const skiagm::GmResultDigest& d igest,
218 const char* filename, 208 const char* filename,
219 SkTArray<SkString, false>* fail ureArray, 209 SkTArray<SkString, false>* fail ureArray,
220 SkTArray<SkString, false>* miss ingArray) { 210 SkTArray<SkString, false>* miss ingArray) {
221 if (!digest.isValid()) { 211 if (!digest.isValid()) {
222 if (failureArray != NULL) { 212 if (failureArray != NULL) {
223 failureArray->push_back().printf("decoded %s, but could not create a GmResultDigest.", 213 failureArray->push_back().printf("decoded %s, but could not create a GmResultDigest.",
224 filename); 214 filename);
225 } 215 }
226 return false; 216 return false;
227 } 217 }
228 218
229 if (NULL == gJsonExpectations.get()) { 219 if (NULL == gJsonExpectations.get()) {
230 return false; 220 return false;
231 } 221 }
232 222
233 skiagm::Expectations jsExpectation = gJsonExpectations->get(filename); 223 skiagm::Expectations jsExpectation = gJsonExpectations->get(filename);
234 if (jsExpectation.empty()) { 224 if (jsExpectation.empty()) {
235 if (missingArray != NULL) { 225 if (missingArray != NULL) {
236 missingArray->push_back().printf("decoded %s, but could not find exp ectation.", 226 missingArray->push_back().printf("decoded %s, but could not find exp ectation.",
epoger 2013/10/15 15:31:03 Why are failureArray and missingArray passed as pa
scroggo 2013/10/15 19:50:59 Good question. The first two are passed as paramet
237 filename); 227 filename);
238 } 228 }
239 return false; 229 return false;
240 } 230 }
241 231
242 if (jsExpectation.match(digest)) { 232 if (jsExpectation.match(digest)) {
243 return true; 233 return true;
244 } 234 }
245 235
246 if (failureArray != NULL) { 236 if (jsExpectation.ignoreFailure()) {
237 gKnownFailures.push_back().printf("%s does not match expectation, but th is is known.",
epoger 2013/10/15 15:31:03 You can handle this in a separate CL if you like (
scroggo 2013/10/15 19:50:59 Added a FIXME (up by the declaration of the arrays
238 filename);
239 } else if (failureArray != NULL) {
247 failureArray->push_back().printf("decoded %s, but the result does not ma tch " 240 failureArray->push_back().printf("decoded %s, but the result does not ma tch "
248 "expectations.", 241 "expectations.",
249 filename); 242 filename);
250 } 243 }
251 return false; 244 return false;
252 } 245 }
253 246
254 /** 247 /**
255 * Helper function to write a bitmap subset to a file. Only called if subsets w ere created 248 * Helper function to write a bitmap subset to a file. Only called if subsets w ere created
256 * and a writePath was provided. Creates a subdirectory called 'subsets' and wr ites a PNG to 249 * and a writePath was provided. Creates a subdirectory called 'subsets' and wr ites a PNG to
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 codec->setSkipWritingZeroes(FLAGS_skip); 396 codec->setSkipWritingZeroes(FLAGS_skip);
404 codec->setSampleSize(FLAGS_sampleSize); 397 codec->setSampleSize(FLAGS_sampleSize);
405 stream.rewind(); 398 stream.rewind();
406 399
407 // Create a string representing just the filename itself, for use in json ex pectations. 400 // Create a string representing just the filename itself, for use in json ex pectations.
408 SkString basename = SkOSPath::SkBasename(srcPath); 401 SkString basename = SkOSPath::SkBasename(srcPath);
409 const char* filename = basename.c_str(); 402 const char* filename = basename.c_str();
410 403
411 if (!codec->decode(&stream, &bitmap, gPrefConfig, 404 if (!codec->decode(&stream, &bitmap, gPrefConfig,
412 SkImageDecoder::kDecodePixels_Mode)) { 405 SkImageDecoder::kDecodePixels_Mode)) {
413 if (expect_to_fail(filename)) { 406 if (NULL != gJsonExpectations.get()) {
414 gSuccessfulDecodes.push_back().appendf( 407 skiagm::Expectations jsExpectations = gJsonExpectations->get(filenam e);
415 "failed to decode %s, which is a known failure.", srcPath); 408 if (jsExpectations.ignoreFailure()) {
416 } else { 409 // This is a known failure.
417 gDecodeFailures.push_back().set(srcPath); 410 gKnownFailures.push_back().appendf(
411 "failed to decode %s, which is a known failure.", srcPath);
412 return;
413 }
414 if (jsExpectations.empty()) {
415 // This is a failure, but it is a new file. Mark it as missing, with
416 // a note that it should be marked failing.
417 gMissingExpectations.push_back().appendf(
418 "new file %s (with no expectations) FAILED to decode.", srcP ath);
419 return;
420 }
418 } 421 }
422
423 // If there was a failure, and either there was no expectations file, or
424 // the expectations file listed a valid expectation, report the failure.
425 gDecodeFailures.push_back().set(srcPath);
419 return; 426 return;
420 } 427 }
421 428
422 // Test decoding just the bounds. The bounds should always match. 429 // Test decoding just the bounds. The bounds should always match.
423 { 430 {
424 stream.rewind(); 431 stream.rewind();
425 SkBitmap dim; 432 SkBitmap dim;
426 if (!codec->decode(&stream, &dim, SkImageDecoder::kDecodeBounds_Mode)) { 433 if (!codec->decode(&stream, &dim, SkImageDecoder::kDecodeBounds_Mode)) {
427 SkString failure = SkStringPrintf("failed to decode bounds for %s", srcPath); 434 SkString failure = SkStringPrintf("failed to decode bounds for %s", srcPath);
428 gDecodeFailures.push_back() = failure; 435 gDecodeFailures.push_back() = failure;
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 failed |= print_strings("Failed to encode", gEncodeFailures); 716 failed |= print_strings("Failed to encode", gEncodeFailures);
710 print_strings("Decoded", gSuccessfulDecodes); 717 print_strings("Decoded", gSuccessfulDecodes);
711 print_strings("Missing expectations", gMissingExpectations); 718 print_strings("Missing expectations", gMissingExpectations);
712 719
713 if (FLAGS_testSubsetDecoding) { 720 if (FLAGS_testSubsetDecoding) {
714 failed |= print_strings("Failed subset decodes", gFailedSubsetDecodes); 721 failed |= print_strings("Failed subset decodes", gFailedSubsetDecodes);
715 print_strings("Decoded subsets", gSuccessfulSubsetDecodes); 722 print_strings("Decoded subsets", gSuccessfulSubsetDecodes);
716 print_strings("Missing subset expectations", gMissingSubsetExpectations) ; 723 print_strings("Missing subset expectations", gMissingSubsetExpectations) ;
717 } 724 }
718 725
726 print_strings("Known failures", gKnownFailures);
727
719 return failed ? -1 : 0; 728 return failed ? -1 : 0;
720 } 729 }
721 730
722 #if !defined SK_BUILD_FOR_IOS 731 #if !defined SK_BUILD_FOR_IOS
723 int main(int argc, char * const argv[]) { 732 int main(int argc, char * const argv[]) {
724 return tool_main(argc, (char**) argv); 733 return tool_main(argc, (char**) argv);
725 } 734 }
726 #endif 735 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698