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