open_file_operation_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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/file_system/open_file_operation.h"
6
7#include <map>
8
9#include "base/file_util.h"
10#include "base/files/file_path.h"
11#include "base/memory/scoped_ptr.h"
12#include "chrome/browser/chromeos/drive/drive.pb.h"
13#include "chrome/browser/chromeos/drive/file_errors.h"
14#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
15#include "chrome/browser/google_apis/test_util.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18namespace drive {
19namespace file_system {
20
21class OpenFileOperationTest : public OperationTestBase {
22 protected:
23  virtual void SetUp() OVERRIDE {
24    OperationTestBase::SetUp();
25
26    operation_.reset(new OpenFileOperation(
27        blocking_task_runner(), observer(), scheduler(), metadata(), cache(),
28        temp_dir()));
29  }
30
31  scoped_ptr<OpenFileOperation> operation_;
32};
33
34TEST_F(OpenFileOperationTest, OpenExistingFile) {
35  const base::FilePath file_in_root(
36      FILE_PATH_LITERAL("drive/root/File 1.txt"));
37  ResourceEntry src_entry;
38  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
39  const int64 file_size = src_entry.file_info().size();
40
41  FileError error = FILE_ERROR_FAILED;
42  base::FilePath file_path;
43  base::Closure close_callback;
44  operation_->OpenFile(
45      file_in_root,
46      OPEN_FILE,
47      std::string(),  // mime_type
48      google_apis::test_util::CreateCopyResultCallback(
49          &error, &file_path, &close_callback));
50  test_util::RunBlockingPoolTask();
51
52  EXPECT_EQ(FILE_ERROR_OK, error);
53  ASSERT_TRUE(base::PathExists(file_path));
54  int64 local_file_size;
55  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
56  EXPECT_EQ(file_size, local_file_size);
57
58  ASSERT_FALSE(close_callback.is_null());
59  close_callback.Run();
60  EXPECT_EQ(
61      1U,
62      observer()->upload_needed_local_ids().count(src_entry.resource_id()));
63}
64
65TEST_F(OpenFileOperationTest, OpenNonExistingFile) {
66  const base::FilePath file_in_root(
67      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
68
69  FileError error = FILE_ERROR_FAILED;
70  base::FilePath file_path;
71  base::Closure close_callback;
72  operation_->OpenFile(
73      file_in_root,
74      OPEN_FILE,
75      std::string(),  // mime_type
76      google_apis::test_util::CreateCopyResultCallback(
77          &error, &file_path, &close_callback));
78  test_util::RunBlockingPoolTask();
79  EXPECT_EQ(FILE_ERROR_NOT_FOUND, error);
80  EXPECT_TRUE(close_callback.is_null());
81}
82
83TEST_F(OpenFileOperationTest, CreateExistingFile) {
84  const base::FilePath file_in_root(
85      FILE_PATH_LITERAL("drive/root/File 1.txt"));
86  ResourceEntry src_entry;
87  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
88
89  FileError error = FILE_ERROR_FAILED;
90  base::FilePath file_path;
91  base::Closure close_callback;
92  operation_->OpenFile(
93      file_in_root,
94      CREATE_FILE,
95      std::string(),  // mime_type
96      google_apis::test_util::CreateCopyResultCallback(
97          &error, &file_path, &close_callback));
98  test_util::RunBlockingPoolTask();
99
100  EXPECT_EQ(FILE_ERROR_EXISTS, error);
101  EXPECT_TRUE(close_callback.is_null());
102}
103
104TEST_F(OpenFileOperationTest, CreateNonExistingFile) {
105  const base::FilePath file_in_root(
106      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
107
108  FileError error = FILE_ERROR_FAILED;
109  base::FilePath file_path;
110  base::Closure close_callback;
111  operation_->OpenFile(
112      file_in_root,
113      CREATE_FILE,
114      std::string(),  // mime_type
115      google_apis::test_util::CreateCopyResultCallback(
116          &error, &file_path, &close_callback));
117  test_util::RunBlockingPoolTask();
118
119  EXPECT_EQ(1U, observer()->get_changed_paths().size());
120  EXPECT_TRUE(observer()->get_changed_paths().count(file_in_root.DirName()));
121
122  EXPECT_EQ(FILE_ERROR_OK, error);
123  ASSERT_TRUE(base::PathExists(file_path));
124  int64 local_file_size;
125  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
126  EXPECT_EQ(0, local_file_size);  // Should be an empty file.
127
128  ASSERT_FALSE(close_callback.is_null());
129  close_callback.Run();
130  // Here we don't know about the resource id, so just make sure
131  // OnCacheFileUploadNeededByOperation is called actually.
132  EXPECT_EQ(1U, observer()->upload_needed_local_ids().size());
133}
134
135TEST_F(OpenFileOperationTest, OpenOrCreateExistingFile) {
136  const base::FilePath file_in_root(
137      FILE_PATH_LITERAL("drive/root/File 1.txt"));
138  ResourceEntry src_entry;
139  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
140  const int64 file_size = src_entry.file_info().size();
141
142  FileError error = FILE_ERROR_FAILED;
143  base::FilePath file_path;
144  base::Closure close_callback;
145  operation_->OpenFile(
146      file_in_root,
147      OPEN_OR_CREATE_FILE,
148      std::string(),  // mime_type
149      google_apis::test_util::CreateCopyResultCallback(
150          &error, &file_path, &close_callback));
151  test_util::RunBlockingPoolTask();
152
153  // Notified because 'available offline' status of the existing file changes.
154  EXPECT_EQ(1U, observer()->get_changed_paths().size());
155  EXPECT_TRUE(observer()->get_changed_paths().count(file_in_root.DirName()));
156
157  EXPECT_EQ(FILE_ERROR_OK, error);
158  ASSERT_TRUE(base::PathExists(file_path));
159  int64 local_file_size;
160  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
161  EXPECT_EQ(file_size, local_file_size);
162
163  ASSERT_FALSE(close_callback.is_null());
164  close_callback.Run();
165  EXPECT_EQ(
166      1U,
167      observer()->upload_needed_local_ids().count(src_entry.resource_id()));
168
169  bool success = false;
170  FileCacheEntry cache_entry;
171  cache()->GetCacheEntryOnUIThread(
172      src_entry.resource_id(),
173      google_apis::test_util::CreateCopyResultCallback(&success, &cache_entry));
174  test_util::RunBlockingPoolTask();
175  EXPECT_TRUE(success);
176  EXPECT_TRUE(cache_entry.is_present());
177  EXPECT_TRUE(cache_entry.is_dirty());
178}
179
180TEST_F(OpenFileOperationTest, OpenOrCreateNonExistingFile) {
181  const base::FilePath file_in_root(
182      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
183
184  FileError error = FILE_ERROR_FAILED;
185  base::FilePath file_path;
186  base::Closure close_callback;
187  operation_->OpenFile(
188      file_in_root,
189      OPEN_OR_CREATE_FILE,
190      std::string(),  // mime_type
191      google_apis::test_util::CreateCopyResultCallback(
192          &error, &file_path, &close_callback));
193  test_util::RunBlockingPoolTask();
194
195  EXPECT_EQ(FILE_ERROR_OK, error);
196  ASSERT_TRUE(base::PathExists(file_path));
197  int64 local_file_size;
198  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
199  EXPECT_EQ(0, local_file_size);  // Should be an empty file.
200
201  ASSERT_FALSE(close_callback.is_null());
202  close_callback.Run();
203  // Here we don't know about the resource id, so just make sure
204  // OnCacheFileUploadNeededByOperation is called actually.
205  EXPECT_EQ(1U, observer()->upload_needed_local_ids().size());
206}
207
208TEST_F(OpenFileOperationTest, OpenFileTwice) {
209  const base::FilePath file_in_root(
210      FILE_PATH_LITERAL("drive/root/File 1.txt"));
211  ResourceEntry src_entry;
212  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
213  const int64 file_size = src_entry.file_info().size();
214
215  FileError error = FILE_ERROR_FAILED;
216  base::FilePath file_path;
217  base::Closure close_callback;
218  operation_->OpenFile(
219      file_in_root,
220      OPEN_FILE,
221      std::string(),  // mime_type
222      google_apis::test_util::CreateCopyResultCallback(
223          &error, &file_path, &close_callback));
224  test_util::RunBlockingPoolTask();
225
226  EXPECT_EQ(FILE_ERROR_OK, error);
227  ASSERT_TRUE(base::PathExists(file_path));
228  int64 local_file_size;
229  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
230  EXPECT_EQ(file_size, local_file_size);
231
232  // Open again.
233  error = FILE_ERROR_FAILED;
234  base::Closure close_callback2;
235  operation_->OpenFile(
236      file_in_root,
237      OPEN_FILE,
238      std::string(),  // mime_type
239      google_apis::test_util::CreateCopyResultCallback(
240          &error, &file_path, &close_callback2));
241  test_util::RunBlockingPoolTask();
242
243  EXPECT_EQ(FILE_ERROR_OK, error);
244  ASSERT_TRUE(base::PathExists(file_path));
245  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
246  EXPECT_EQ(file_size, local_file_size);
247
248  ASSERT_FALSE(close_callback.is_null());
249  ASSERT_FALSE(close_callback2.is_null());
250
251  close_callback.Run();
252
253  // There still remains a client opening the file, so it shouldn't be
254  // uploaded yet.
255  EXPECT_TRUE(observer()->upload_needed_local_ids().empty());
256
257  close_callback2.Run();
258
259  // Here, all the clients close the file, so it should be uploaded then.
260  EXPECT_EQ(
261      1U,
262      observer()->upload_needed_local_ids().count(src_entry.resource_id()));
263}
264
265}  // namespace file_system
266}  // namespace drive
267