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/remove_operation.h"
7 #include "components/drive/file_change.h"
8 #include "components/drive/file_system/operation_test_base.h"
9 #include "components/drive/file_system_core_util.h"
10 #include "content/public/test/test_utils.h"
11 #include "google_apis/drive/test_util.h"
12 #include "testing/gtest/include/gtest/gtest.h"
15 namespace file_system
{
17 typedef OperationTestBase RemoveOperationTest
;
19 TEST_F(RemoveOperationTest
, RemoveFile
) {
20 RemoveOperation
operation(blocking_task_runner(), delegate(), metadata(),
23 base::FilePath
nonexisting_file(
24 FILE_PATH_LITERAL("drive/root/Dummy file.txt"));
25 base::FilePath
file_in_root(FILE_PATH_LITERAL("drive/root/File 1.txt"));
26 base::FilePath
file_in_subdir(
27 FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt"));
29 // Remove a file in root.
31 FileError error
= FILE_ERROR_FAILED
;
32 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(file_in_root
, &entry
));
33 operation
.Remove(file_in_root
,
34 false, // is_recursive
35 google_apis::test_util::CreateCopyResultCallback(&error
));
36 content::RunAllBlockingPoolTasksUntilIdle();
37 EXPECT_EQ(FILE_ERROR_OK
, error
);
38 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, GetLocalResourceEntry(file_in_root
, &entry
));
40 const std::string id_file_in_root
= entry
.local_id();
41 EXPECT_EQ(FILE_ERROR_OK
, GetLocalResourceEntryById(id_file_in_root
, &entry
));
42 EXPECT_EQ(util::kDriveTrashDirLocalId
, entry
.parent_local_id());
44 // Remove a file in subdirectory.
45 error
= FILE_ERROR_FAILED
;
46 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(file_in_subdir
, &entry
));
47 const std::string resource_id
= entry
.resource_id();
49 operation
.Remove(file_in_subdir
,
50 false, // is_recursive
51 google_apis::test_util::CreateCopyResultCallback(&error
));
52 content::RunAllBlockingPoolTasksUntilIdle();
53 EXPECT_EQ(FILE_ERROR_OK
, error
);
54 EXPECT_EQ(FILE_ERROR_NOT_FOUND
,
55 GetLocalResourceEntry(file_in_subdir
, &entry
));
57 const std::string id_file_in_subdir
= entry
.local_id();
58 EXPECT_EQ(FILE_ERROR_OK
,
59 GetLocalResourceEntryById(id_file_in_subdir
, &entry
));
60 EXPECT_EQ(util::kDriveTrashDirLocalId
, entry
.parent_local_id());
62 // Try removing non-existing file.
63 error
= FILE_ERROR_FAILED
;
64 ASSERT_EQ(FILE_ERROR_NOT_FOUND
,
65 GetLocalResourceEntry(nonexisting_file
, &entry
));
66 operation
.Remove(nonexisting_file
,
67 false, // is_recursive
68 google_apis::test_util::CreateCopyResultCallback(&error
));
69 content::RunAllBlockingPoolTasksUntilIdle();
70 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, error
);
72 // Verify delegate notifications.
73 EXPECT_EQ(2U, delegate()->get_changed_files().size());
74 EXPECT_TRUE(delegate()->get_changed_files().count(file_in_root
));
75 EXPECT_TRUE(delegate()->get_changed_files().count(file_in_subdir
));
77 EXPECT_EQ(2U, delegate()->updated_local_ids().size());
78 EXPECT_TRUE(delegate()->updated_local_ids().count(id_file_in_root
));
79 EXPECT_TRUE(delegate()->updated_local_ids().count(id_file_in_subdir
));
82 TEST_F(RemoveOperationTest
, RemoveDirectory
) {
83 RemoveOperation
operation(blocking_task_runner(), delegate(), metadata(),
86 base::FilePath
empty_dir(FILE_PATH_LITERAL(
87 "drive/root/Directory 1/Sub Directory Folder/Sub Sub Directory Folder"));
88 base::FilePath
non_empty_dir(FILE_PATH_LITERAL(
89 "drive/root/Directory 1"));
90 base::FilePath
file_in_non_empty_dir(FILE_PATH_LITERAL(
91 "drive/root/Directory 1/SubDirectory File 1.txt"));
93 // Empty directory can be removed even with is_recursive = false.
94 FileError error
= FILE_ERROR_FAILED
;
96 operation
.Remove(empty_dir
,
97 false, // is_recursive
98 google_apis::test_util::CreateCopyResultCallback(&error
));
99 content::RunAllBlockingPoolTasksUntilIdle();
100 EXPECT_EQ(FILE_ERROR_OK
, error
);
101 EXPECT_EQ(FILE_ERROR_NOT_FOUND
,
102 GetLocalResourceEntry(empty_dir
, &entry
));
104 // Non-empty directory, cannot.
105 error
= FILE_ERROR_FAILED
;
106 ASSERT_EQ(FILE_ERROR_OK
, GetLocalResourceEntry(non_empty_dir
, &entry
));
107 operation
.Remove(non_empty_dir
,
108 false, // is_recursive
109 google_apis::test_util::CreateCopyResultCallback(&error
));
110 content::RunAllBlockingPoolTasksUntilIdle();
111 EXPECT_EQ(FILE_ERROR_NOT_EMPTY
, error
);
112 EXPECT_EQ(FILE_ERROR_OK
,
113 GetLocalResourceEntry(non_empty_dir
, &entry
));
115 // With is_recursive = true, it can be deleted, however. Descendant entries
116 // are removed together.
117 error
= FILE_ERROR_FAILED
;
118 ASSERT_EQ(FILE_ERROR_OK
,
119 GetLocalResourceEntry(file_in_non_empty_dir
, &entry
));
120 operation
.Remove(non_empty_dir
,
121 true, // is_recursive
122 google_apis::test_util::CreateCopyResultCallback(&error
));
123 content::RunAllBlockingPoolTasksUntilIdle();
124 EXPECT_EQ(FILE_ERROR_OK
, error
);
125 EXPECT_EQ(FILE_ERROR_NOT_FOUND
,
126 GetLocalResourceEntry(non_empty_dir
, &entry
));
127 EXPECT_EQ(FILE_ERROR_NOT_FOUND
,
128 GetLocalResourceEntry(file_in_non_empty_dir
, &entry
));
131 } // namespace file_system