1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/operations/get_metadata.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string> 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/files/file.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/files/file_path.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/json/json_reader.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/memory/scoped_vector.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/values.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/operations/test_util.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider.h" 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider_internal.h" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/browser/event_router.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h" 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace chromeos { 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace file_system_provider { 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace operations { 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kFileSystemId[] = "testing-file-system"; 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kMimeType[] = "text/plain"; 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kRequestId = 2; 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const base::FilePath::CharType kDirectoryPath[] = "/directory"; 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// URLs are case insensitive, so it should pass the sanity check. 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kThumbnail[] = "DaTa:ImAgE/pNg;base64,"; 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Callback invocation logger. Acts as a fileapi end-point. 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class CallbackLogger { 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) class Event { 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Event(scoped_ptr<EntryMetadata> metadata, base::File::Error result) 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : metadata_(metadata.Pass()), result_(result) {} 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual ~Event() {} 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const EntryMetadata* metadata() const { return metadata_.get(); } 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::File::Error result() const { return result_; } 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<EntryMetadata> metadata_; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::File::Error result_; 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Event); 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CallbackLogger() {} 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual ~CallbackLogger() {} 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnGetMetadata(scoped_ptr<EntryMetadata> metadata, 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::File::Error result) { 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci events_.push_back(new Event(metadata.Pass(), result)); 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ScopedVector<Event>& events() const { return events_; } 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedVector<Event> events_; 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool dispatch_reply_; 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackLogger); 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class FileSystemProviderOperationsGetMetadataTest : public testing::Test { 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected: 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FileSystemProviderOperationsGetMetadataTest() {} 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual ~FileSystemProviderOperationsGetMetadataTest() {} 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetUp() OVERRIDE { 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) file_system_info_ = 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProvidedFileSystemInfo(kExtensionId, 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kFileSystemId, 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "" /* display_name */, 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* writable */, 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath() /* mount_path */); 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ProvidedFileSystemInfo file_system_info_; 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(FileSystemProviderOperationsGetMetadataTest, Execute) { 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using extensions::api::file_system_provider::GetMetadataRequestedOptions; 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallbackLogger callback_logger; 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadata get_metadata( 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL, 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_info_, 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath::FromUTF8Unsafe(kDirectoryPath), 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProvidedFileSystemInterface::METADATA_FIELD_THUMBNAIL, 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&CallbackLogger::OnGetMetadata, 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(&callback_logger))); 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) get_metadata.SetDispatchEventImplForTesting( 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(&dispatcher))); 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(get_metadata.Execute(kRequestId)); 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1u, dispatcher.events().size()); 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extensions::Event* event = dispatcher.events()[0]; 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ( 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extensions::api::file_system_provider::OnGetMetadataRequested::kEventName, 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) event->event_name); 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::ListValue* event_args = event->event_args.get(); 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, event_args->GetSize()); 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue* options_as_value = NULL; 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value)); 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadataRequestedOptions options; 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE( 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadataRequestedOptions::Populate(*options_as_value, &options)); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFileSystemId, options.file_system_id); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kRequestId, options.request_id); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kDirectoryPath, options.entry_path); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(options.thumbnail); 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(FileSystemProviderOperationsGetMetadataTest, Execute_NoListener) { 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */); 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallbackLogger callback_logger; 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadata get_metadata( 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL, 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_info_, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath::FromUTF8Unsafe(kDirectoryPath), 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProvidedFileSystemInterface::METADATA_FIELD_THUMBNAIL, 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&CallbackLogger::OnGetMetadata, 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(&callback_logger))); 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) get_metadata.SetDispatchEventImplForTesting( 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(&dispatcher))); 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(get_metadata.Execute(kRequestId)); 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(FileSystemProviderOperationsGetMetadataTest, OnSuccess) { 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) using extensions::api::file_system_provider_internal:: 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetMetadataRequestedSuccess::Params; 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallbackLogger callback_logger; 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadata get_metadata( 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL, 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_info_, 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath::FromUTF8Unsafe(kDirectoryPath), 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProvidedFileSystemInterface::METADATA_FIELD_THUMBNAIL, 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&CallbackLogger::OnGetMetadata, 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(&callback_logger))); 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) get_metadata.SetDispatchEventImplForTesting( 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(&dispatcher))); 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(get_metadata.Execute(kRequestId)); 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Sample input as JSON. Keep in sync with file_system_provider_api.idl. 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // As for now, it is impossible to create *::Params class directly, not from 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // base::Value. 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string input = 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "[\n" 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"testing-file-system\",\n" // kFileSystemId 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " 2,\n" // kRequestId 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " {\n" 176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"isDirectory\": false,\n" 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"name\": \"blueberries.txt\",\n" 178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"size\": 4096,\n" 179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"modificationTime\": {\n" 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " \"value\": \"Thu Apr 24 00:46:52 UTC 2014\"\n" 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " },\n" 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"mimeType\": \"text/plain\",\n" // kMimeType 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"thumbnail\": \"DaTa:ImAgE/pNg;base64,\"\n" // kThumbnail 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " },\n" 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " 0\n" // execution_time 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "]\n"; 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int json_error_code; 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string json_error_msg; 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError( 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input, base::JSON_PARSE_RFC, &json_error_code, &json_error_msg)); 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(value.get()) << json_error_msg; 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::ListValue* value_as_list; 195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(value->GetAsList(&value_as_list)); 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<Params> params(Params::Create(*value_as_list)); 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(params.get()); 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<RequestValue> request_value( 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RequestValue::CreateForGetMetadataSuccess(params.Pass())); 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(request_value.get()); 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const bool has_more = false; 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) get_metadata.OnSuccess(kRequestId, request_value.Pass(), has_more); 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1u, callback_logger.events().size()); 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallbackLogger::Event* event = callback_logger.events()[0]; 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::File::FILE_OK, event->result()); 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const EntryMetadata* metadata = event->metadata(); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(metadata->is_directory); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4096, metadata->size); 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Time expected_time; 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE( 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Time::FromString("Thu Apr 24 00:46:52 UTC 2014", &expected_time)); 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(expected_time, metadata->modification_time); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kMimeType, metadata->mime_type); 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kThumbnail, metadata->thumbnail); 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(FileSystemProviderOperationsGetMetadataTest, 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnSuccess_InvalidThumbnail) { 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using extensions::api::file_system_provider_internal:: 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadataRequestedSuccess::Params; 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CallbackLogger callback_logger; 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadata get_metadata( 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL, 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_info_, 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath::FromUTF8Unsafe(kDirectoryPath), 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProvidedFileSystemInterface::METADATA_FIELD_THUMBNAIL, 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&CallbackLogger::OnGetMetadata, 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(&callback_logger))); 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci get_metadata.SetDispatchEventImplForTesting( 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(&dispatcher))); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(get_metadata.Execute(kRequestId)); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sample input as JSON. Keep in sync with file_system_provider_api.idl. 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // As for now, it is impossible to create *::Params class directly, not from 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // base::Value. 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string input = 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "[\n" 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"testing-file-system\",\n" // kFileSystemId 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " 2,\n" // kRequestId 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " {\n" 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"isDirectory\": false,\n" 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"name\": \"blueberries.txt\",\n" 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"size\": 4096,\n" 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"modificationTime\": {\n" 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"value\": \"Thu Apr 24 00:46:52 UTC 2014\"\n" 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " },\n" 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"mimeType\": \"text/plain\",\n" // kMimeType 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"thumbnail\": \"http://www.foobar.com/evil\"\n" // kThumbnail 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " },\n" 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " 0\n" // execution_time 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "]\n"; 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int json_error_code; 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string json_error_msg; 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError( 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input, base::JSON_PARSE_RFC, &json_error_code, &json_error_msg)); 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(value.get()) << json_error_msg; 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::ListValue* value_as_list; 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(value->GetAsList(&value_as_list)); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Params> params(Params::Create(*value_as_list)); 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(params.get()); 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<RequestValue> request_value( 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RequestValue::CreateForGetMetadataSuccess(params.Pass())); 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(request_value.get()); 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const bool has_more = false; 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci get_metadata.OnSuccess(kRequestId, request_value.Pass(), has_more); 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1u, callback_logger.events().size()); 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CallbackLogger::Event* event = callback_logger.events()[0]; 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(base::File::FILE_ERROR_IO, event->result()); 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const EntryMetadata* metadata = event->metadata(); 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(metadata); 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(FileSystemProviderOperationsGetMetadataTest, OnError) { 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallbackLogger callback_logger; 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadata get_metadata( 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL, 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_info_, 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath::FromUTF8Unsafe(kDirectoryPath), 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProvidedFileSystemInterface::METADATA_FIELD_THUMBNAIL, 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&CallbackLogger::OnGetMetadata, 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(&callback_logger))); 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) get_metadata.SetDispatchEventImplForTesting( 298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl, 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(&dispatcher))); 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(get_metadata.Execute(kRequestId)); 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch get_metadata.OnError(kRequestId, 304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<RequestValue>(new RequestValue()), 305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::File::FILE_ERROR_TOO_MANY_OPENED); 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1u, callback_logger.events().size()); 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallbackLogger::Event* event = callback_logger.events()[0]; 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, event->result()); 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace operations 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace file_system_provider 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace chromeos 315