1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/local_file_reader.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/rand_util.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/thread.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/io_buffer.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/test_completion_callback.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace drive { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace util { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// An adapter to use test_util::ReadAllData. 27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LocalFileReaderAdapter { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) explicit LocalFileReaderAdapter(LocalFileReader* reader) : reader_(reader) {} 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int Read(net::IOBuffer* buffer, 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int buffer_length, 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::CompletionCallback& callback) { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reader_->Read(buffer, buffer_length, callback); 34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // As LocalFileReader::Read always works asynchronously, 35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // return ERR_IO_PENDING. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::ERR_IO_PENDING; 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LocalFileReader* reader_; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LocalFileReaderTest : public ::testing::Test { 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) worker_thread_.reset(new base::Thread("LocalFileReaderTest")); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(worker_thread_->Start()); 51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) file_reader_.reset( 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new LocalFileReader(worker_thread_->message_loop_proxy().get())); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ScopedTempDir temp_dir_; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Thread> worker_thread_; 58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<LocalFileReader> file_reader_; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LocalFileReaderTest, NonExistingFile) { 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath kTestFile = 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) temp_dir_.path().AppendASCII("non-existing"); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestCompletionCallback callback; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_reader_->Open(kTestFile, 0, callback.callback()); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(net::ERR_FILE_NOT_FOUND, callback.WaitForResult()); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LocalFileReaderTest, FullRead) { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath test_file; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string expected_content; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(google_apis::test_util::CreateFileOfSpecifiedSize( 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) temp_dir_.path(), 1024, &test_file, &expected_content)); 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestCompletionCallback callback; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_reader_->Open(test_file, 0, callback.callback()); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, callback.WaitForResult()); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LocalFileReaderAdapter adapter(file_reader_.get()); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string content; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, test_util::ReadAllData(&adapter, &content)); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected_content, content); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(LocalFileReaderTest, OpenWithOffset) { 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath test_file; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string expected_content; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(google_apis::test_util::CreateFileOfSpecifiedSize( 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) temp_dir_.path(), 1024, &test_file, &expected_content)); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t offset = expected_content.size() / 2; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_content.erase(0, offset); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestCompletionCallback callback; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_reader_->Open( 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_file, static_cast<int64>(offset), callback.callback()); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, callback.WaitForResult()); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LocalFileReaderAdapter adapter(file_reader_.get()); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string content; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(net::OK, test_util::ReadAllData(&adapter, &content)); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected_content, content); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace util 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace drive 108