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 "chrome/browser/chromeos/drive/file_system/move_operation.h"
7 #include "chrome/browser/chromeos/drive/file_system/copy_operation.h"
8 #include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
9 #include "chrome/browser/drive/drive_api_util.h"
10 #include "google_apis/drive/test_util.h"
11 #include "testing/gtest/include/gtest/gtest.h"
14 namespace file_system
{
16 class MoveOperationTest
: public OperationTestBase
{
18 virtual void SetUp() OVERRIDE
{
19 OperationTestBase::SetUp();
20 operation_
.reset(new MoveOperation(blocking_task_runner(),
23 copy_operation_
.reset(new CopyOperation(
24 blocking_task_runner(),
29 util::GetIdentityResourceIdCanonicalizer()));
32 scoped_ptr
<MoveOperation
> operation_
;
33 scoped_ptr
<CopyOperation
> copy_operation_
;
36 TEST_F(MoveOperationTest
, MoveFileInSameDirectory
) {
37 const base::FilePath
src_path(
38 FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt"));
39 const base::FilePath
dest_path(
40 FILE_PATH_LITERAL("drive/root/Directory 1/Test.log"));
42 ResourceEntry src_entry
, dest_entry
;
43 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(src_path
, &src_entry
));
44 ASSERT_EQ(FILE_ERROR_NOT_FOUND
,
45 GetLocalResourceEntry(dest_path
, &dest_entry
));
47 FileError error
= FILE_ERROR_FAILED
;
48 operation_
->Move(src_path
,
51 google_apis::test_util::CreateCopyResultCallback(&error
));
52 test_util::RunBlockingPoolTask();
53 EXPECT_EQ(FILE_ERROR_OK
, error
);
55 EXPECT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(dest_path
, &dest_entry
));
56 EXPECT_EQ(src_entry
.local_id(), dest_entry
.local_id());
57 EXPECT_EQ(ResourceEntry::DIRTY
, dest_entry
.metadata_edit_state());
58 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, GetLocalResourceEntry(src_path
, &src_entry
));
60 EXPECT_EQ(1U, observer()->get_changed_paths().size());
61 EXPECT_TRUE(observer()->get_changed_paths().count(src_path
.DirName()));
63 EXPECT_EQ(1U, observer()->updated_local_ids().size());
64 EXPECT_TRUE(observer()->updated_local_ids().count(src_entry
.local_id()));
67 TEST_F(MoveOperationTest
, MoveFileFromRootToSubDirectory
) {
68 base::FilePath
src_path(FILE_PATH_LITERAL("drive/root/File 1.txt"));
69 base::FilePath
dest_path(
70 FILE_PATH_LITERAL("drive/root/Directory 1/Test.log"));
72 ResourceEntry src_entry
, dest_entry
;
73 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(src_path
, &src_entry
));
74 ASSERT_EQ(FILE_ERROR_NOT_FOUND
,
75 GetLocalResourceEntry(dest_path
, &dest_entry
));
77 FileError error
= FILE_ERROR_FAILED
;
78 operation_
->Move(src_path
,
81 google_apis::test_util::CreateCopyResultCallback(&error
));
82 test_util::RunBlockingPoolTask();
83 EXPECT_EQ(FILE_ERROR_OK
, error
);
85 EXPECT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(dest_path
, &dest_entry
));
86 EXPECT_EQ(src_entry
.local_id(), dest_entry
.local_id());
87 EXPECT_EQ(ResourceEntry::DIRTY
, dest_entry
.metadata_edit_state());
88 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, GetLocalResourceEntry(src_path
, &src_entry
));
90 EXPECT_EQ(2U, observer()->get_changed_paths().size());
91 EXPECT_TRUE(observer()->get_changed_paths().count(src_path
.DirName()));
92 EXPECT_TRUE(observer()->get_changed_paths().count(dest_path
.DirName()));
94 EXPECT_EQ(1U, observer()->updated_local_ids().size());
95 EXPECT_TRUE(observer()->updated_local_ids().count(src_entry
.local_id()));
98 TEST_F(MoveOperationTest
, MoveFileBetweenSubDirectoriesRenameWithTitle
) {
99 base::FilePath
src_path(
100 FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt"));
101 base::FilePath
dest_path(FILE_PATH_LITERAL(
102 "drive/root/Directory 1/Sub Directory Folder/"
103 "SubDirectory File 1 (1).txt"));
105 ResourceEntry src_entry
, dest_entry
;
106 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(src_path
, &src_entry
));
107 ASSERT_EQ(FILE_ERROR_NOT_FOUND
,
108 GetLocalResourceEntry(dest_path
, &dest_entry
));
110 FileError error
= FILE_ERROR_FAILED
;
111 // Copy the src file into the same directory. This will make inconsistency
112 // between title and path of the copied file.
113 copy_operation_
->Copy(
117 google_apis::test_util::CreateCopyResultCallback(&error
));
118 test_util::RunBlockingPoolTask();
119 EXPECT_EQ(FILE_ERROR_OK
, error
);
120 base::FilePath
copied_path(
121 FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1 (1).txt"));
122 ResourceEntry copied_entry
;
123 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(copied_path
, &copied_entry
));
124 ASSERT_EQ("SubDirectory File 1.txt", copied_entry
.title());
126 // Move the copied file.
127 operation_
->Move(copied_path
,
130 google_apis::test_util::CreateCopyResultCallback(&error
));
131 test_util::RunBlockingPoolTask();
132 EXPECT_EQ(FILE_ERROR_OK
, error
);
134 EXPECT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(dest_path
, &dest_entry
));
135 EXPECT_EQ("SubDirectory File 1 (1).txt", dest_entry
.title());
136 EXPECT_EQ(copied_entry
.local_id(), dest_entry
.local_id());
137 EXPECT_EQ(ResourceEntry::DIRTY
, dest_entry
.metadata_edit_state());
138 EXPECT_EQ(FILE_ERROR_NOT_FOUND
,
139 GetLocalResourceEntry(copied_path
, &copied_entry
));
141 EXPECT_EQ(2U, observer()->get_changed_paths().size());
142 EXPECT_TRUE(observer()->get_changed_paths().count(copied_path
.DirName()));
143 EXPECT_TRUE(observer()->get_changed_paths().count(dest_path
.DirName()));
145 EXPECT_EQ(1U, observer()->updated_local_ids().size());
146 EXPECT_TRUE(observer()->updated_local_ids().count(copied_entry
.local_id()));
149 TEST_F(MoveOperationTest
, MoveNotExistingFile
) {
150 base::FilePath
src_path(FILE_PATH_LITERAL("drive/root/Dummy file.txt"));
151 base::FilePath
dest_path(FILE_PATH_LITERAL("drive/root/Test.log"));
153 FileError error
= FILE_ERROR_OK
;
154 operation_
->Move(src_path
,
157 google_apis::test_util::CreateCopyResultCallback(&error
));
158 test_util::RunBlockingPoolTask();
159 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, error
);
162 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, GetLocalResourceEntry(src_path
, &entry
));
163 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, GetLocalResourceEntry(dest_path
, &entry
));
166 TEST_F(MoveOperationTest
, MoveFileToNonExistingDirectory
) {
167 base::FilePath
src_path(FILE_PATH_LITERAL("drive/root/File 1.txt"));
168 base::FilePath
dest_path(FILE_PATH_LITERAL("drive/root/Dummy/Test.log"));
170 FileError error
= FILE_ERROR_OK
;
171 operation_
->Move(src_path
,
174 google_apis::test_util::CreateCopyResultCallback(&error
));
175 test_util::RunBlockingPoolTask();
176 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, error
);
179 EXPECT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(src_path
, &entry
));
180 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, GetLocalResourceEntry(dest_path
, &entry
));
183 // Test the case where the parent of |dest_file_path| is a existing file,
185 TEST_F(MoveOperationTest
, MoveFileToInvalidPath
) {
186 base::FilePath
src_path(FILE_PATH_LITERAL("drive/root/File 1.txt"));
187 base::FilePath
dest_path(
188 FILE_PATH_LITERAL("drive/root/Duplicate Name.txt/Test.log"));
190 FileError error
= FILE_ERROR_OK
;
191 operation_
->Move(src_path
,
194 google_apis::test_util::CreateCopyResultCallback(&error
));
195 test_util::RunBlockingPoolTask();
196 EXPECT_EQ(FILE_ERROR_NOT_A_DIRECTORY
, error
);
199 EXPECT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(src_path
, &entry
));
200 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, GetLocalResourceEntry(dest_path
, &entry
));
203 TEST_F(MoveOperationTest
, PreserveLastModified
) {
204 const base::FilePath
src_path(
205 FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt"));
206 const base::FilePath
dest_path(
207 FILE_PATH_LITERAL("drive/root/Directory 1/Test.log"));
209 ResourceEntry src_entry
, dest_entry
;
210 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(src_path
, &src_entry
));
211 ASSERT_EQ(FILE_ERROR_NOT_FOUND
,
212 GetLocalResourceEntry(dest_path
, &dest_entry
));
214 FileError error
= FILE_ERROR_FAILED
;
215 operation_
->Move(src_path
,
217 true, // Preserve last modified.
218 google_apis::test_util::CreateCopyResultCallback(&error
));
219 test_util::RunBlockingPoolTask();
220 EXPECT_EQ(FILE_ERROR_OK
, error
);
222 EXPECT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(dest_path
, &dest_entry
));
223 EXPECT_EQ(src_entry
.local_id(), dest_entry
.local_id());
224 EXPECT_EQ(src_entry
.file_info().last_modified(),
225 dest_entry
.file_info().last_modified());
226 EXPECT_EQ(ResourceEntry::DIRTY
, dest_entry
.metadata_edit_state());
227 EXPECT_EQ(FILE_ERROR_NOT_FOUND
,
228 GetLocalResourceEntry(src_path
, &src_entry
));
231 } // namespace file_system