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/truncate.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)const int64 kTruncateLength = 64; 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class FileSystemProviderOperationsTruncateTest : public testing::Test { 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FileSystemProviderOperationsTruncateTest() {} 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~FileSystemProviderOperationsTruncateTest() {} 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetUp() OVERRIDE { 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_ = 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProvidedFileSystemInfo(kExtensionId, 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileSystemId, 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "" /* file_system_name */, 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* writable */, 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath() /* mount_path */); 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProvidedFileSystemInfo file_system_info_; 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsTruncateTest, Execute) { 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using extensions::api::file_system_provider::TruncateRequestedOptions; 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Truncate truncate(NULL, 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTruncateLength, 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) truncate.SetDispatchEventImplForTesting( 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(truncate.Execute(kRequestId)); 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, dispatcher.events().size()); 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::Event* event = dispatcher.events()[0]; 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::api::file_system_provider::OnTruncateRequested::kEventName, 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) event->event_name); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ListValue* event_args = event->event_args.get(); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, event_args->GetSize()); 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue* options_as_value = NULL; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value)); 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TruncateRequestedOptions options; 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(TruncateRequestedOptions::Populate(*options_as_value, &options)); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFileSystemId, options.file_system_id); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kRequestId, options.request_id); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFilePath, options.file_path); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kTruncateLength, static_cast<double>(options.length)); 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsTruncateTest, Execute_NoListener) { 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */); 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Truncate truncate(NULL, 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTruncateLength, 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) truncate.SetDispatchEventImplForTesting( 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(truncate.Execute(kRequestId)); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsTruncateTest, Execute_ReadOnly) { 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */); 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ProvidedFileSystemInfo read_only_file_system_info( 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kExtensionId, 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kFileSystemId, 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "" /* file_system_name */, 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* writable */, 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath() /* mount_path */); 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Truncate truncate(NULL, 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTruncateLength, 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) truncate.SetDispatchEventImplForTesting( 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(truncate.Execute(kRequestId)); 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsTruncateTest, OnSuccess) { 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Truncate truncate(NULL, 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTruncateLength, 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) truncate.SetDispatchEventImplForTesting( 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(truncate.Execute(kRequestId)); 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) truncate.OnSuccess(kRequestId, 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<RequestValue>(new RequestValue()), 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* has_more */); 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, callback_log.size()); 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(base::File::FILE_OK, callback_log[0]); 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsTruncateTest, OnError) { 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) util::StatusCallbackLog callback_log; 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Truncate truncate(NULL, 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_system_info_, 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(kFilePath), 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTruncateLength, 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LogStatusCallback, &callback_log)); 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) truncate.SetDispatchEventImplForTesting( 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(&dispatcher))); 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(truncate.Execute(kRequestId)); 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) truncate.OnError(kRequestId, 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<RequestValue>(new RequestValue()), 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::File::FILE_ERROR_TOO_MANY_OPENED); 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1u, callback_log.size()); 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, callback_log[0]); 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace operations 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace file_system_provider 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace chromeos 174