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/create_file_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"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_utils.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace drive {
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace file_system {
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef OperationTestBase CreateFileOperationTest;
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(CreateFileOperationTest, CreateFile) {
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreateFileOperation operation(blocking_task_runner(),
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                delegate(),
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                metadata());
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/New File.txt"));
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FileError error = FILE_ERROR_FAILED;
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  operation.CreateFile(
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kFilePath,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      true,  // is_exclusive
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string(),  // no predetermined mime type
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry entry;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry));
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ResourceEntry::DIRTY, entry.metadata_edit_state());
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(base::Time::FromInternalValue(
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      entry.file_info().last_modified()).is_null());
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(base::Time::FromInternalValue(
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      entry.file_info().last_accessed()).is_null());
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1u, delegate()->get_changed_files().size());
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1u, delegate()->get_changed_files().count(kFilePath));
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1u, delegate()->updated_local_ids().size());
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1u, delegate()->updated_local_ids().count(entry.local_id()));
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CreateFileOperationTest, CreateFileIsExclusive) {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateFileOperation operation(blocking_task_runner(),
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                delegate(),
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                metadata());
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::FilePath kExistingFile(
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/File 1.txt"));
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::FilePath kExistingDirectory(
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/Directory 1"));
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::FilePath kNonExistingFile(
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/Directory 1/not exist.png"));
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::FilePath kFileInNonExistingDirectory(
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FILE_PATH_LITERAL("drive/root/not exist/not exist.png"));
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create fails if is_exclusive = true and a file exists.
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FileError error = FILE_ERROR_FAILED;
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateFile(
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kExistingFile,
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true,  // is_exclusive
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // no predetermined mime type
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_EXISTS, error);
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create succeeds if is_exclusive = false and a file exists.
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateFile(
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kExistingFile,
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false,  // is_exclusive
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // no predetermined mime type
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create fails if a directory existed even when is_exclusive = false.
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateFile(
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kExistingDirectory,
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false,  // is_exclusive
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // no predetermined mime type
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_EXISTS, error);
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create succeeds if no entry exists.
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateFile(
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kNonExistingFile,
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      true,   // is_exclusive
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // no predetermined mime type
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create fails if the parent directory does not exist.
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operation.CreateFile(
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kFileInNonExistingDirectory,
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      false,  // is_exclusive
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // no predetermined mime type
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_A_DIRECTORY, error);
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(CreateFileOperationTest, CreateFileMimeType) {
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CreateFileOperation operation(blocking_task_runner(),
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                delegate(),
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                metadata());
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const base::FilePath kPng1(FILE_PATH_LITERAL("drive/root/1.png"));
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const base::FilePath kPng2(FILE_PATH_LITERAL("drive/root/2.png"));
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const base::FilePath kUnknown(FILE_PATH_LITERAL("drive/root/3.unknown"));
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const std::string kSpecialMimeType("application/x-createfile-test");
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FileError error = FILE_ERROR_FAILED;
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  operation.CreateFile(
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kPng1,
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      false,  // is_exclusive
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // no predetermined mime type
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // If no mime type is specified, it is guessed from the file name.
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry entry;
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kPng1, &entry));
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("image/png", entry.file_specific_info().content_mime_type());
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  error = FILE_ERROR_FAILED;
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  operation.CreateFile(
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kPng2,
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      false,  // is_exclusive
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kSpecialMimeType,
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // If the mime type is explicitly set, respect it.
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kPng2, &entry));
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(kSpecialMimeType, entry.file_specific_info().content_mime_type());
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  error = FILE_ERROR_FAILED;
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  operation.CreateFile(
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kUnknown,
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      false,  // is_exclusive
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // no predetermined mime type
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&error));
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, error);
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // If the mime type is not set and unknown, default to octet-stream.
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kUnknown, &entry));
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("application/octet-stream",
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            entry.file_specific_info().content_mime_type());
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace file_system
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace drive
162