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/write_file.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string> 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/ref_counted.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_vector.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/values.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/test_util.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" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/io_buffer.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace chromeos { 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace file_system_provider { 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace operations { 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace { 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kFileSystemId[] = "testing-file-system"; 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kRequestId = 2; 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kFileHandle = 3; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kWriteData[] = "Welcome to my world!"; 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kOffset = 10; 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class FileSystemProviderOperationsWriteFileTest : public testing::Test { 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FileSystemProviderOperationsWriteFileTest() {} 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~FileSystemProviderOperationsWriteFileTest() {} 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetUp() OVERRIDE { 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_ = 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProvidedFileSystemInfo(kExtensionId, 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileSystemId, 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "" /* display_name */, 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* writable */, 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath() /* mount_path */); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_buffer_ = make_scoped_refptr(new net::StringIOBuffer(kWriteData)); 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProvidedFileSystemInfo file_system_info_; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<net::StringIOBuffer> io_buffer_; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, Execute) { 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using extensions::api::file_system_provider::WriteFileRequestedOptions; 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WriteFile write_file(NULL, 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileHandle, 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) io_buffer_.get(), 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kOffset, 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_buffer_->size(), 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) write_file.SetDispatchEventImplForTesting( 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(write_file.Execute(kRequestId)); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, dispatcher.events().size()); 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::Event* event = dispatcher.events()[0]; 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::api::file_system_provider::OnWriteFileRequested::kEventName, 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event->event_name); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ListValue* event_args = event->event_args.get(); 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, event_args->GetSize()); 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue* options_as_value = NULL; 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value)); 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WriteFileRequestedOptions options; 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(WriteFileRequestedOptions::Populate(*options_as_value, &options)); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFileSystemId, options.file_system_id); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kRequestId, options.request_id); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFileHandle, options.open_request_id); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kOffset, static_cast<double>(options.offset)); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(std::string(kWriteData), options.data); 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, Execute_NoListener) { 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */); 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WriteFile write_file(NULL, 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileHandle, 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) io_buffer_.get(), 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kOffset, 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_buffer_->size(), 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) write_file.SetDispatchEventImplForTesting( 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(write_file.Execute(kRequestId)); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, Execute_ReadOnly) { 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ProvidedFileSystemInfo read_only_file_system_info( 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kExtensionId, 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileSystemId, 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "" /* file_system_name */, 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* writable */, 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath() /* mount_path */); 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WriteFile write_file(NULL, 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) read_only_file_system_info, 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileHandle, 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) io_buffer_.get(), 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kOffset, 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_buffer_->size(), 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) write_file.SetDispatchEventImplForTesting( 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(write_file.Execute(kRequestId)); 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, OnSuccess) { 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WriteFile write_file(NULL, 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileHandle, 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) io_buffer_.get(), 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kOffset, 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_buffer_->size(), 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) write_file.SetDispatchEventImplForTesting( 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(write_file.Execute(kRequestId)); 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) write_file.OnSuccess(kRequestId, 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<RequestValue>(new RequestValue()), 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* has_more */); 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, callback_log.size()); 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(base::File::FILE_OK, callback_log[0]); 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, OnError) { 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WriteFile write_file(NULL, 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileHandle, 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) io_buffer_.get(), 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kOffset, 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_buffer_->size(), 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) write_file.SetDispatchEventImplForTesting( 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(write_file.Execute(kRequestId)); 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) write_file.OnError(kRequestId, 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<RequestValue>(new RequestValue()), 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::File::FILE_ERROR_TOO_MANY_OPENED); 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, callback_log.size()); 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, callback_log[0]); 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace operations 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace file_system_provider 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace chromeos 190