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)#ifndef CONTENT_TEST_IMAGE_DECODER_TEST_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_TEST_IMAGE_DECODER_TEST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { class WebImageDecoder; } 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Decodes a handful of image files and compares their MD5 sums to the stored 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// sums on disk. To recalculate the MD5 sums, uncomment the CALCULATE_MD5_SUMS 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// #define in the .cc file. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The image files and corresponding MD5 sums live in the directory 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome/test/data/*_decoder (where "*" is the format being tested). 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: The MD5 sums calculated in this test by little- and big-endian systems 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will differ, since no endianness correction is done. If we start compiling 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for big endian machines this should be fixed. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ImageDecoderTestFileSelection { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEST_ALL, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEST_SMALLER, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEST_BIGGER, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the path the decoded data is saved at. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetMD5SumPath(const base::FilePath& path); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageDecoderTest : public testing::Test { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ImageDecoderTest(const std::string& format) : format_(format) { } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the vector of image files for testing. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::FilePath> GetImageFiles() const; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the image is bogus and should not be successfully decoded. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ShouldImageFail(const base::FilePath& path) const; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests if decoder decodes image at image_path with underlying frame at 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // index desired_frame_index. The md5_sum_path is needed if the test is not 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // asked to generate one, i.e. if #define CALCULATE_MD5_SUMS is not set. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void TestWebKitImageDecoder(const base::FilePath& image_path, 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& md5_sum_path, 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int desired_frame_index) const; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies each of the test image files is decoded correctly and matches the 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expected state. |file_selection| and |threshold| can be used to select 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // files to test based on file size. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If just the MD5 sum is wanted, this skips chunking. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestDecoding(ImageDecoderTestFileSelection file_selection, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int64 threshold); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestDecoding() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDecoding(TEST_ALL, 0); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates WebKit API's decoder. 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebImageDecoder* CreateWebKitImageDecoder() const = 0; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The format to be decoded, like "bmp" or "ico". 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string format_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& data_dir() const { return data_dir_; } 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Path to the test files. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_dir_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ImageDecoderTest); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_TEST_IMAGE_DECODER_TEST_H_ 87