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