1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/bind.h"
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/files/file_path.h"
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/path_service.h"
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/run_loop.h"
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/common/chrome_paths.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/utility/media_galleries/image_metadata_extractor.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "media/filters/file_data_source.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace metadata {
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid QuitLoop(base::RunLoop* loop, bool* output, bool success) {
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  loop->Quit();
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  *output = success;
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbase::FilePath GetTestDataFilePath(const std::string& filename) {
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::FilePath path;
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path));
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  path = path.AppendASCII("extensions").AppendASCII("api_test")
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      .AppendASCII("wallpaper").AppendASCII(filename);
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return path;
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochscoped_ptr<ImageMetadataExtractor> GetExtractor(
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const std::string& filename,
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool expected_result) {
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(ImageMetadataExtractor::InitializeLibraryForTesting());
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  media::FileDataSource source;
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::FilePath test_path;
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(source.Initialize(GetTestDataFilePath(filename)));
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<ImageMetadataExtractor> extractor(new ImageMetadataExtractor);
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::RunLoop loop;
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool extracted = false;
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  extractor->Extract(&source, base::Bind(&QuitLoop, &loop, &extracted));
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(expected_result, extracted);
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return extractor.Pass();
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
49a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(ImageMetadataExtractorTest, JPGFile) {
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<ImageMetadataExtractor> extractor =
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GetExtractor("test.jpg", true);
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(5616, extractor->width());
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(3744, extractor->height());
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0, extractor->rotation());
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(300.0, extractor->x_resolution());
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(300.0, extractor->y_resolution());
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("2012:03:01 17:06:07", extractor->date());
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("Canon", extractor->camera_make());
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("Canon EOS 5D Mark II", extractor->camera_model());
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0.01, extractor->exposure_time_sec());
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(extractor->flash_fired());
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(3.2, extractor->f_number());
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(100, extractor->focal_length_mm());
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1600, extractor->iso_equivalent());
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
68a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(ImageMetadataExtractorTest, PNGFile) {
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  GetExtractor("test.png", false);
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
72a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(ImageMetadataExtractorTest, NonImageFile) {
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  GetExtractor("test.js", false);
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace metadata
77