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