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.
5 #include "components/drive/file_system/open_file_operation.h"
9 #include "base/files/file_path.h"
10 #include "base/files/file_util.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/task_runner_util.h"
13 #include "components/drive/drive.pb.h"
14 #include "components/drive/file_cache.h"
15 #include "components/drive/file_change.h"
16 #include "components/drive/file_errors.h"
17 #include "components/drive/file_system/operation_test_base.h"
18 #include "content/public/test/test_utils.h"
19 #include "google_apis/drive/test_util.h"
20 #include "testing/gtest/include/gtest/gtest.h"
23 namespace file_system
{
25 class OpenFileOperationTest
: public OperationTestBase
{
27 void SetUp() override
{
28 OperationTestBase::SetUp();
30 operation_
.reset(new OpenFileOperation(
31 blocking_task_runner(), delegate(), scheduler(), metadata(), cache(),
35 scoped_ptr
<OpenFileOperation
> operation_
;
38 TEST_F(OpenFileOperationTest
, OpenExistingFile
) {
39 const base::FilePath
file_in_root(
40 FILE_PATH_LITERAL("drive/root/File 1.txt"));
41 ResourceEntry src_entry
;
42 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(file_in_root
, &src_entry
));
43 const int64 file_size
= src_entry
.file_info().size();
45 FileError error
= FILE_ERROR_FAILED
;
46 base::FilePath file_path
;
47 base::Closure close_callback
;
51 std::string(), // mime_type
52 google_apis::test_util::CreateCopyResultCallback(
53 &error
, &file_path
, &close_callback
));
54 content::RunAllBlockingPoolTasksUntilIdle();
56 EXPECT_EQ(FILE_ERROR_OK
, error
);
57 ASSERT_TRUE(base::PathExists(file_path
));
58 int64 local_file_size
;
59 ASSERT_TRUE(base::GetFileSize(file_path
, &local_file_size
));
60 EXPECT_EQ(file_size
, local_file_size
);
62 ASSERT_FALSE(close_callback
.is_null());
64 EXPECT_EQ(1U, delegate()->updated_local_ids().count(src_entry
.local_id()));
67 TEST_F(OpenFileOperationTest
, OpenNonExistingFile
) {
68 const base::FilePath
file_in_root(
69 FILE_PATH_LITERAL("drive/root/not-exist.txt"));
71 FileError error
= FILE_ERROR_FAILED
;
72 base::FilePath file_path
;
73 base::Closure close_callback
;
77 std::string(), // mime_type
78 google_apis::test_util::CreateCopyResultCallback(
79 &error
, &file_path
, &close_callback
));
80 content::RunAllBlockingPoolTasksUntilIdle();
81 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, error
);
82 EXPECT_TRUE(close_callback
.is_null());
85 TEST_F(OpenFileOperationTest
, CreateExistingFile
) {
86 const base::FilePath
file_in_root(
87 FILE_PATH_LITERAL("drive/root/File 1.txt"));
88 ResourceEntry src_entry
;
89 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(file_in_root
, &src_entry
));
91 FileError error
= FILE_ERROR_FAILED
;
92 base::FilePath file_path
;
93 base::Closure close_callback
;
97 std::string(), // mime_type
98 google_apis::test_util::CreateCopyResultCallback(
99 &error
, &file_path
, &close_callback
));
100 content::RunAllBlockingPoolTasksUntilIdle();
102 EXPECT_EQ(FILE_ERROR_EXISTS
, error
);
103 EXPECT_TRUE(close_callback
.is_null());
106 TEST_F(OpenFileOperationTest
, CreateNonExistingFile
) {
107 const base::FilePath
file_in_root(
108 FILE_PATH_LITERAL("drive/root/not-exist.txt"));
110 FileError error
= FILE_ERROR_FAILED
;
111 base::FilePath file_path
;
112 base::Closure close_callback
;
113 operation_
->OpenFile(
116 std::string(), // mime_type
117 google_apis::test_util::CreateCopyResultCallback(
118 &error
, &file_path
, &close_callback
));
119 content::RunAllBlockingPoolTasksUntilIdle();
121 EXPECT_EQ(1U, delegate()->get_changed_files().size());
122 EXPECT_TRUE(delegate()->get_changed_files().count(file_in_root
));
124 EXPECT_EQ(FILE_ERROR_OK
, error
);
125 ASSERT_TRUE(base::PathExists(file_path
));
126 int64 local_file_size
;
127 ASSERT_TRUE(base::GetFileSize(file_path
, &local_file_size
));
128 EXPECT_EQ(0, local_file_size
); // Should be an empty file.
130 ASSERT_FALSE(close_callback
.is_null());
131 close_callback
.Run();
133 delegate()->updated_local_ids().count(GetLocalId(file_in_root
)));
136 TEST_F(OpenFileOperationTest
, OpenOrCreateExistingFile
) {
137 const base::FilePath
file_in_root(
138 FILE_PATH_LITERAL("drive/root/File 1.txt"));
139 ResourceEntry src_entry
;
140 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(file_in_root
, &src_entry
));
141 const int64 file_size
= src_entry
.file_info().size();
143 FileError error
= FILE_ERROR_FAILED
;
144 base::FilePath file_path
;
145 base::Closure close_callback
;
146 operation_
->OpenFile(
149 std::string(), // mime_type
150 google_apis::test_util::CreateCopyResultCallback(
151 &error
, &file_path
, &close_callback
));
152 content::RunAllBlockingPoolTasksUntilIdle();
154 // Notified because 'available offline' status of the existing file changes.
155 EXPECT_EQ(1U, delegate()->get_changed_files().size());
156 EXPECT_TRUE(delegate()->get_changed_files().count(file_in_root
));
158 EXPECT_EQ(FILE_ERROR_OK
, error
);
159 ASSERT_TRUE(base::PathExists(file_path
));
160 int64 local_file_size
;
161 ASSERT_TRUE(base::GetFileSize(file_path
, &local_file_size
));
162 EXPECT_EQ(file_size
, local_file_size
);
164 ASSERT_FALSE(close_callback
.is_null());
165 close_callback
.Run();
166 EXPECT_EQ(1U, delegate()->updated_local_ids().count(src_entry
.local_id()));
168 ResourceEntry result_entry
;
169 EXPECT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(file_in_root
, &result_entry
));
170 EXPECT_TRUE(result_entry
.file_specific_info().cache_state().is_present());
171 EXPECT_TRUE(result_entry
.file_specific_info().cache_state().is_dirty());
174 TEST_F(OpenFileOperationTest
, OpenOrCreateNonExistingFile
) {
175 const base::FilePath
file_in_root(
176 FILE_PATH_LITERAL("drive/root/not-exist.txt"));
178 FileError error
= FILE_ERROR_FAILED
;
179 base::FilePath file_path
;
180 base::Closure close_callback
;
181 operation_
->OpenFile(
184 std::string(), // mime_type
185 google_apis::test_util::CreateCopyResultCallback(
186 &error
, &file_path
, &close_callback
));
187 content::RunAllBlockingPoolTasksUntilIdle();
189 EXPECT_EQ(FILE_ERROR_OK
, error
);
190 ASSERT_TRUE(base::PathExists(file_path
));
191 int64 local_file_size
;
192 ASSERT_TRUE(base::GetFileSize(file_path
, &local_file_size
));
193 EXPECT_EQ(0, local_file_size
); // Should be an empty file.
195 ASSERT_FALSE(close_callback
.is_null());
196 close_callback
.Run();
198 delegate()->updated_local_ids().count(GetLocalId(file_in_root
)));
201 TEST_F(OpenFileOperationTest
, OpenFileTwice
) {
202 const base::FilePath
file_in_root(
203 FILE_PATH_LITERAL("drive/root/File 1.txt"));
204 ResourceEntry src_entry
;
205 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(file_in_root
, &src_entry
));
206 const int64 file_size
= src_entry
.file_info().size();
208 FileError error
= FILE_ERROR_FAILED
;
209 base::FilePath file_path
;
210 base::Closure close_callback
;
211 operation_
->OpenFile(
214 std::string(), // mime_type
215 google_apis::test_util::CreateCopyResultCallback(
216 &error
, &file_path
, &close_callback
));
217 content::RunAllBlockingPoolTasksUntilIdle();
219 EXPECT_EQ(FILE_ERROR_OK
, error
);
220 ASSERT_TRUE(base::PathExists(file_path
));
221 int64 local_file_size
;
222 ASSERT_TRUE(base::GetFileSize(file_path
, &local_file_size
));
223 EXPECT_EQ(file_size
, local_file_size
);
226 error
= FILE_ERROR_FAILED
;
227 base::Closure close_callback2
;
228 operation_
->OpenFile(
231 std::string(), // mime_type
232 google_apis::test_util::CreateCopyResultCallback(
233 &error
, &file_path
, &close_callback2
));
234 content::RunAllBlockingPoolTasksUntilIdle();
236 EXPECT_EQ(FILE_ERROR_OK
, error
);
237 ASSERT_TRUE(base::PathExists(file_path
));
238 ASSERT_TRUE(base::GetFileSize(file_path
, &local_file_size
));
239 EXPECT_EQ(file_size
, local_file_size
);
241 ASSERT_FALSE(close_callback
.is_null());
242 ASSERT_FALSE(close_callback2
.is_null());
244 close_callback
.Run();
246 // There still remains a client opening the file, so it shouldn't be
248 EXPECT_TRUE(delegate()->updated_local_ids().empty());
250 close_callback2
.Run();
252 // Here, all the clients close the file, so it should be uploaded then.
253 EXPECT_EQ(1U, delegate()->updated_local_ids().count(src_entry
.local_id()));
256 } // namespace file_system