15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/image_decoder_test.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/md5.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebData.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebImage.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebImageDecoder.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Uncomment this to recalculate the MD5 sums; see header comments.
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// #define CALCULATE_MD5_SUMS
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFirstFrameIndex = 0;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Determine if we should test with file specified by |path| based
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on |file_selection| and the |threshold| for the file size.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldSkipFile(const base::FilePath& path,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ImageDecoderTestFileSelection file_selection,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const int64 threshold) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (file_selection == TEST_ALL)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 image_size = 0;
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::GetFileSize(path, &image_size);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (file_selection == TEST_SMALLER) == (image_size > threshold);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ReadFileToVector(const base::FilePath& path, std::vector<char>* contents) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string raw_image_data;
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ReadFileToString(path, &raw_image_data);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contents->resize(raw_image_data.size());
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  memcpy(&contents->front(), raw_image_data.data(), raw_image_data.size());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetMD5SumPath(const base::FilePath& path) {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::StringType kDecodedDataExtension(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL(".md5sum"));
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath(path.value() + kDecodedDataExtension);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CALCULATE_MD5_SUMS)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SaveMD5Sum(const base::FilePath& path, const blink::WebImage& web_image) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculate MD5 sum.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MD5Digest digest;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_image.getSkBitmap().lockPixels();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MD5Sum(web_image.getSkBitmap().getPixels(),
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               web_image.getSkBitmap().width() *
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   web_image.getSkBitmap().height() * sizeof(uint32_t),
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               &digest);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write sum to disk.
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int bytes_written = base::WriteFile(
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      path, reinterpret_cast<const char*>(&digest), sizeof digest);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(sizeof digest, bytes_written);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_image.getSkBitmap().unlockPixels();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(CALCULATE_MD5_SUMS)
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void VerifyImage(const blink::WebImageDecoder& decoder,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::FilePath& path,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::FilePath& md5_sum_path,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 size_t frame_index) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure decoding can complete successfully.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(decoder.isSizeAvailable()) << path.value();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(decoder.frameCount(), frame_index) << path.value();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(decoder.isFrameCompleteAtIndex(frame_index)) << path.value();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(decoder.isFailed());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculate MD5 sum.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MD5Digest actual_digest;
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebImage web_image = decoder.getFrameAtIndex(frame_index);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_image.getSkBitmap().lockPixels();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MD5Sum(web_image.getSkBitmap().getPixels(),
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               web_image.getSkBitmap().width() *
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   web_image.getSkBitmap().height() * sizeof(uint32_t),
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               &actual_digest);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read the MD5 sum off disk.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string file_bytes;
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ReadFileToString(md5_sum_path, &file_bytes);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MD5Digest expected_digest;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(sizeof expected_digest, file_bytes.size()) << path.value();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(&expected_digest, file_bytes.data(), sizeof expected_digest);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the sums are the same.
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0, memcmp(&expected_digest, &actual_digest, sizeof actual_digest))
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      << path.value();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_image.getSkBitmap().unlockPixels();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageDecoderTest::SetUp() {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_dir;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  data_dir_ = data_dir.AppendASCII("webkit").AppendASCII("data").AppendASCII(
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      format_ + "_decoder");
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::PathExists(data_dir_)) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const testing::TestInfo* const test_info =
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        testing::UnitTest::GetInstance()->current_test_info();
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VLOG(0) << test_info->name()
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            << " not running because test data wasn't found.";
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_dir_.clear();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::vector<base::FilePath> ImageDecoderTest::GetImageFiles() const {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pattern = "*." + format_;
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::FileEnumerator enumerator(data_dir_, false,
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  base::FileEnumerator::FILES);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath> image_files;
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (base::FilePath next_file_name = enumerator.Next();
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       !next_file_name.empty(); next_file_name = enumerator.Next()) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath base_name = next_file_name.BaseName();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    std::string base_name_ascii = base::UTF16ToASCII(base_name.value());
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string base_name_ascii = base_name.value();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (MatchPattern(base_name_ascii, pattern))
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      image_files.push_back(next_file_name);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image_files;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ImageDecoderTest::ShouldImageFail(const base::FilePath& path) const {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath::StringType kBadSuffix(FILE_PATH_LITERAL(".bad."));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (path.value().length() > (kBadSuffix.length() + format_.length()) &&
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !path.value().compare(path.value().length() - format_.length() -
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    kBadSuffix.length(),
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                kBadSuffix.length(), kBadSuffix));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageDecoderTest::TestDecoding(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImageDecoderTestFileSelection file_selection,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int64 threshold) {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (data_dir_.empty())
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<base::FilePath> image_files(GetImageFiles());
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<base::FilePath>::const_iterator i = image_files.begin();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != image_files.end(); ++i) {
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (!ShouldSkipFile(*i, file_selection, threshold))
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      TestWebKitImageDecoder(*i, GetMD5SumPath(*i), kFirstFrameIndex);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ImageDecoderTest::TestWebKitImageDecoder(
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const base::FilePath& image_path,
165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const base::FilePath& md5_sum_path,
166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int desired_frame_index) const {
167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(CALCULATE_MD5_SUMS)
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // If we're just calculating the MD5 sums, skip failing images quickly.
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (ShouldImageFail(image_path))
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> image_contents;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadFileToVector(image_path, &image_contents);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(image_contents.size());
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<blink::WebImageDecoder> decoder(CreateWebKitImageDecoder());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(decoder->isFailed());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(CALCULATE_MD5_SUMS)
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Test chunking file into half.
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const int partial_size = image_contents.size()/2;
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  blink::WebData partial_data(
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    reinterpret_cast<const char*>(&(image_contents.at(0))), partial_size);
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Make Sure the image decoder doesn't fail when we ask for the frame
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // buffer for this partial image.
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // NOTE: We can't check that frame 0 is non-NULL, because if this is an
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // ICO and we haven't yet supplied enough data to read the directory,
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // there is no framecount and thus no first frame.
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  decoder->setData(const_cast<blink::WebData&>(partial_data), false);
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(decoder->isFailed()) << image_path.value();
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure passing the complete image results in successful decoding.
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebData data(reinterpret_cast<const char*>(&(image_contents.at(0))),
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image_contents.size());
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  decoder->setData(const_cast<blink::WebData&>(data), true);
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (ShouldImageFail(image_path)) {
200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_FALSE(decoder->isFrameCompleteAtIndex(kFirstFrameIndex));
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_TRUE(decoder->isFailed());
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  } else {
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_FALSE(decoder->isFailed()) << image_path.value();
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(CALCULATE_MD5_SUMS)
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    SaveMD5Sum(md5_sum_path, decoder->getFrameAtIndex(desired_frame_index));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VerifyImage(*decoder, image_path, md5_sum_path, desired_frame_index);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
211