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