12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/create_directory_operation.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_utils.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace drive {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace file_system {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CreateDirectoryOperationTest : public OperationTestBase {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns FILE_ERROR_OK if a directory is found at |path|.
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FileError FindDirectory(const base::FilePath& path) {
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ResourceEntry entry;
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    FileError error = GetLocalResourceEntry(path, &entry);
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (error == FILE_ERROR_OK && !entry.file_info().is_directory())
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      error = FILE_ERROR_NOT_A_DIRECTORY;
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return error;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(CreateDirectoryOperationTest, CreateDirectory) {
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreateDirectoryOperation operation(blocking_task_runner(),
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     delegate(),
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     metadata());
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::FilePath kExistingFile(
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/File 1.txt"));
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::FilePath kExistingDirectory(
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/Directory 1"));
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::FilePath kNewDirectory1(
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/New Directory"));
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::FilePath kNewDirectory2 =
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kNewDirectory1.AppendASCII("New Directory 2/a/b/c");
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a new directory, not recursively.
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND, FindDirectory(kNewDirectory1));
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FileError error = FILE_ERROR_FAILED;
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateDirectory(
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kNewDirectory1,
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true, // is_exclusive
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false,  // is_recursive
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, FindDirectory(kNewDirectory1));
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, delegate()->get_changed_files().size());
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      1U,
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      delegate()->get_changed_files().CountDirectory(kNewDirectory1.DirName()));
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry entry;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kNewDirectory1, &entry));
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ResourceEntry::DIRTY, entry.metadata_edit_state());
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(entry.file_info().is_directory());
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(base::Time::FromInternalValue(
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      entry.file_info().last_modified()).is_null());
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(base::Time::FromInternalValue(
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      entry.file_info().last_accessed()).is_null());
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, delegate()->updated_local_ids().size());
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, delegate()->updated_local_ids().count(entry.local_id()));
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a new directory recursively.
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND, FindDirectory(kNewDirectory2));
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateDirectory(
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kNewDirectory2,
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true, // is_exclusive
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false,  // is_recursive
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND, error);
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND, FindDirectory(kNewDirectory2));
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateDirectory(
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kNewDirectory2,
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true, // is_exclusive
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true,  // is_recursive
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, FindDirectory(kNewDirectory2));
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Try to create an existing directory.
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateDirectory(
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kExistingDirectory,
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true, // is_exclusive
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false,  // is_recursive
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_EXISTS, error);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateDirectory(
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kExistingDirectory,
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false, // is_exclusive
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false,  // is_recursive
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Try to create a directory with a path for an existing file.
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateDirectory(
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kExistingFile,
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false, // is_exclusive
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true,  // is_recursive
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_A_DIRECTORY, error);
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Try to create a directory under a file.
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateDirectory(
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kExistingFile.AppendASCII("New Directory"),
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false, // is_exclusive
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true,  // is_recursive
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_A_DIRECTORY, error);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace file_system
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace drive
127