1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/bind.h"
6#include "base/bind_helpers.h"
7#include "base/files/file_path.h"
8#include "base/files/file_util.h"
9#include "base/message_loop/message_loop.h"
10#include "base/path_service.h"
11#include "components/crx_file/id_util.h"
12#include "content/public/test/test_browser_thread.h"
13#include "extensions/browser/file_reader.h"
14#include "extensions/common/extension_paths.h"
15#include "extensions/common/extension_resource.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18using content::BrowserThread;
19
20namespace extensions {
21
22class FileReaderTest : public testing::Test {
23 public:
24  FileReaderTest() : file_thread_(BrowserThread::FILE) {
25    file_thread_.Start();
26  }
27 private:
28  base::MessageLoop message_loop_;
29  content::TestBrowserThread file_thread_;
30};
31
32class Receiver {
33 public:
34  Receiver() : succeeded_(false) {
35  }
36
37  FileReader::Callback NewCallback() {
38    return base::Bind(&Receiver::DidReadFile, base::Unretained(this));
39  }
40
41  bool succeeded() const { return succeeded_; }
42  const std::string& data() const { return data_; }
43
44 private:
45  void DidReadFile(bool success, const std::string& data) {
46    succeeded_ = success;
47    data_ = data;
48    base::MessageLoop::current()->Quit();
49  }
50
51  bool succeeded_;
52  std::string data_;
53};
54
55void RunBasicTest(const char* filename) {
56  base::FilePath path;
57  PathService::Get(DIR_TEST_DATA, &path);
58  std::string extension_id = crx_file::id_util::GenerateId("test");
59  ExtensionResource resource(
60      extension_id, path, base::FilePath().AppendASCII(filename));
61  path = path.AppendASCII(filename);
62
63  std::string file_contents;
64  ASSERT_TRUE(base::ReadFileToString(path, &file_contents));
65
66  Receiver receiver;
67
68  scoped_refptr<FileReader> file_reader(
69      new FileReader(resource, receiver.NewCallback()));
70  file_reader->Start();
71
72  base::MessageLoop::current()->Run();
73
74  EXPECT_TRUE(receiver.succeeded());
75  EXPECT_EQ(file_contents, receiver.data());
76}
77
78TEST_F(FileReaderTest, SmallFile) {
79  RunBasicTest("smallfile");
80}
81
82TEST_F(FileReaderTest, BiggerFile) {
83  RunBasicTest("bigfile");
84}
85
86TEST_F(FileReaderTest, NonExistantFile) {
87  base::FilePath path;
88  PathService::Get(DIR_TEST_DATA, &path);
89  std::string extension_id = crx_file::id_util::GenerateId("test");
90  ExtensionResource resource(extension_id, path, base::FilePath(
91      FILE_PATH_LITERAL("file_that_does_not_exist")));
92  path = path.AppendASCII("file_that_does_not_exist");
93
94  Receiver receiver;
95
96  scoped_refptr<FileReader> file_reader(
97      new FileReader(resource, receiver.NewCallback()));
98  file_reader->Start();
99
100  base::MessageLoop::current()->Run();
101
102  EXPECT_FALSE(receiver.succeeded());
103}
104
105}  // namespace extensions
106