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