15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/create_file.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string> 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector> 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_vector.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/test_util.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider_internal.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/event_router.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace chromeos { 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace file_system_provider { 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace operations { 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace { 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kFileSystemId[] = "testing-file-system"; 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kRequestId = 2; 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const base::FilePath::CharType kFilePath[] = "/kitty/and/puppy/happy"; 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class FileSystemProviderOperationsCreateFileTest : public testing::Test { 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FileSystemProviderOperationsCreateFileTest() {} 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~FileSystemProviderOperationsCreateFileTest() {} 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetUp() OVERRIDE { 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_ = 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProvidedFileSystemInfo(kExtensionId, 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileSystemId, 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "" /* file_system_name */, 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* writable */, 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath() /* mount_path */); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProvidedFileSystemInfo file_system_info_; 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, Execute) { 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using extensions::api::file_system_provider::CreateFileRequestedOptions; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateFile create_file(NULL, 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) create_file.SetDispatchEventImplForTesting( 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(create_file.Execute(kRequestId)); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, dispatcher.events().size()); 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::Event* event = dispatcher.events()[0]; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::api::file_system_provider::OnCreateFileRequested::kEventName, 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event->event_name); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ListValue* event_args = event->event_args.get(); 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, event_args->GetSize()); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue* options_as_value = NULL; 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value)); 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFileRequestedOptions options; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE( 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateFileRequestedOptions::Populate(*options_as_value, &options)); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFileSystemId, options.file_system_id); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kRequestId, options.request_id); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFilePath, options.file_path); 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, Execute_NoListener) { 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */); 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateFile create_file(NULL, 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) create_file.SetDispatchEventImplForTesting( 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(create_file.Execute(kRequestId)); 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, Execute_ReadOnly) { 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ProvidedFileSystemInfo read_only_file_system_info( 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kExtensionId, 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileSystemId, 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "" /* file_system_name */, 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* writable */, 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath() /* mount_path */); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateFile create_file(NULL, 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) read_only_file_system_info, 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) create_file.SetDispatchEventImplForTesting( 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(create_file.Execute(kRequestId)); 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, OnSuccess) { 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateFile create_file(NULL, 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) create_file.SetDispatchEventImplForTesting( 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(create_file.Execute(kRequestId)); 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) create_file.OnSuccess(kRequestId, 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<RequestValue>(new RequestValue()), 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* has_more */); 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, callback_log.size()); 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(base::File::FILE_OK, callback_log[0]); 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, OnError) { 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateFile create_file(NULL, 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) create_file.SetDispatchEventImplForTesting( 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(create_file.Execute(kRequestId)); 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) create_file.OnError(kRequestId, 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<RequestValue>(new RequestValue()), 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::File::FILE_ERROR_TOO_MANY_OPENED); 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, callback_log.size()); 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, callback_log[0]); 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace operations 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace file_system_provider 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace chromeos 168