190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/remove_operation.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/drive/file_change.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_utils.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace drive {
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace file_system {
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef OperationTestBase RemoveOperationTest;
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(RemoveOperationTest, RemoveFile) {
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RemoveOperation operation(blocking_task_runner(), delegate(), metadata(),
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            cache());
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath nonexisting_file(
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/Dummy file.txt"));
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath file_in_root(FILE_PATH_LITERAL("drive/root/File 1.txt"));
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath file_in_subdir(
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt"));
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Remove a file in root.
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ResourceEntry entry;
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FileError error = FILE_ERROR_FAILED;
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &entry));
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.Remove(file_in_root,
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   false,  // is_recursive
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   google_apis::test_util::CreateCopyResultCallback(&error));
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntry(file_in_root, &entry));
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string id_file_in_root = entry.local_id();
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntryById(id_file_in_root, &entry));
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(util::kDriveTrashDirLocalId, entry.parent_local_id());
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Remove a file in subdirectory.
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  error = FILE_ERROR_FAILED;
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_subdir, &entry));
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const std::string resource_id = entry.resource_id();
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.Remove(file_in_subdir,
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   false,  // is_recursive
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   google_apis::test_util::CreateCopyResultCallback(&error));
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND,
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetLocalResourceEntry(file_in_subdir, &entry));
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string id_file_in_subdir = entry.local_id();
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK,
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            GetLocalResourceEntryById(id_file_in_subdir, &entry));
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(util::kDriveTrashDirLocalId, entry.parent_local_id());
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Try removing non-existing file.
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  error = FILE_ERROR_FAILED;
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(FILE_ERROR_NOT_FOUND,
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetLocalResourceEntry(nonexisting_file, &entry));
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  operation.Remove(nonexisting_file,
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   false,  // is_recursive
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   google_apis::test_util::CreateCopyResultCallback(&error));
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND, error);
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Verify delegate notifications.
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2U, delegate()->get_changed_files().size());
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(delegate()->get_changed_files().count(file_in_root));
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(delegate()->get_changed_files().count(file_in_subdir));
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2U, delegate()->updated_local_ids().size());
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(delegate()->updated_local_ids().count(id_file_in_root));
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(delegate()->updated_local_ids().count(id_file_in_subdir));
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(RemoveOperationTest, RemoveDirectory) {
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RemoveOperation operation(blocking_task_runner(), delegate(), metadata(),
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            cache());
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath empty_dir(FILE_PATH_LITERAL(
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "drive/root/Directory 1/Sub Directory Folder/Sub Sub Directory Folder"));
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath non_empty_dir(FILE_PATH_LITERAL(
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "drive/root/Directory 1"));
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath file_in_non_empty_dir(FILE_PATH_LITERAL(
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "drive/root/Directory 1/SubDirectory File 1.txt"));
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Empty directory can be removed even with is_recursive = false.
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FileError error = FILE_ERROR_FAILED;
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ResourceEntry entry;
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.Remove(empty_dir,
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   false,  // is_recursive
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   google_apis::test_util::CreateCopyResultCallback(&error));
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND,
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetLocalResourceEntry(empty_dir, &entry));
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Non-empty directory, cannot.
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  error = FILE_ERROR_FAILED;
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(non_empty_dir, &entry));
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.Remove(non_empty_dir,
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   false,  // is_recursive
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   google_apis::test_util::CreateCopyResultCallback(&error));
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_EMPTY, error);
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK,
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetLocalResourceEntry(non_empty_dir, &entry));
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // With is_recursive = true, it can be deleted, however. Descendant entries
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // are removed together.
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  error = FILE_ERROR_FAILED;
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(FILE_ERROR_OK,
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetLocalResourceEntry(file_in_non_empty_dir, &entry));
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.Remove(non_empty_dir,
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   true,  // is_recursive
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   google_apis::test_util::CreateCopyResultCallback(&error));
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND,
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetLocalResourceEntry(non_empty_dir, &entry));
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND,
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetLocalResourceEntry(file_in_non_empty_dir, &entry));
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace file_system
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace drive
133