1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/operations/close_file.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <string>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector>
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/operations/test_util.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider_internal.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/event_router.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chromeos {
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace file_system_provider {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace operations {
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kFileSystemId[] = "testing-file-system";
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kRequestId = 2;
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kOpenRequestId = 3;
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class FileSystemProviderOperationsCloseFileTest : public testing::Test {
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FileSystemProviderOperationsCloseFileTest() {}
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~FileSystemProviderOperationsCloseFileTest() {}
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file_system_info_ =
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ProvidedFileSystemInfo(kExtensionId,
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               kFileSystemId,
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               "" /* display_name */,
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               false /* writable */,
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               base::FilePath() /* mount_path */);
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProvidedFileSystemInfo file_system_info_;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(FileSystemProviderOperationsCloseFileTest, Execute) {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_system_provider::CloseFileRequestedOptions;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::StatusCallbackLog callback_log;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CloseFile close_file(NULL,
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       file_system_info_,
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       kOpenRequestId,
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       base::Bind(&util::LogStatusCallback, &callback_log));
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  close_file.SetDispatchEventImplForTesting(
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&dispatcher)));
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(close_file.Execute(kRequestId));
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, dispatcher.events().size());
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  extensions::Event* event = dispatcher.events()[0];
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::api::file_system_provider::OnCloseFileRequested::kEventName,
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event->event_name);
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ListValue* event_args = event->event_args.get();
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, event_args->GetSize());
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::DictionaryValue* options_as_value = NULL;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value));
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CloseFileRequestedOptions options;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(CloseFileRequestedOptions::Populate(*options_as_value, &options));
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFileSystemId, options.file_system_id);
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kRequestId, options.request_id);
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kOpenRequestId, options.open_request_id);
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(FileSystemProviderOperationsCloseFileTest, Execute_NoListener) {
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */);
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::StatusCallbackLog callback_log;
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CloseFile close_file(NULL,
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       file_system_info_,
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       kOpenRequestId,
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       base::Bind(&util::LogStatusCallback, &callback_log));
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  close_file.SetDispatchEventImplForTesting(
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&dispatcher)));
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(close_file.Execute(kRequestId));
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(FileSystemProviderOperationsCloseFileTest, OnSuccess) {
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::StatusCallbackLog callback_log;
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CloseFile close_file(NULL,
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       file_system_info_,
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       kOpenRequestId,
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       base::Bind(&util::LogStatusCallback, &callback_log));
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  close_file.SetDispatchEventImplForTesting(
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&dispatcher)));
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(close_file.Execute(kRequestId));
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  close_file.OnSuccess(kRequestId,
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       scoped_ptr<RequestValue>(new RequestValue()),
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       false /* has_more */);
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, callback_log.size());
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(base::File::FILE_OK, callback_log[0]);
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(FileSystemProviderOperationsCloseFileTest, OnError) {
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::StatusCallbackLog callback_log;
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CloseFile close_file(NULL,
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       file_system_info_,
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       kOpenRequestId,
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       base::Bind(&util::LogStatusCallback, &callback_log));
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  close_file.SetDispatchEventImplForTesting(
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&dispatcher)));
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(close_file.Execute(kRequestId));
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  close_file.OnError(kRequestId,
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     scoped_ptr<RequestValue>(new RequestValue()),
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     base::File::FILE_ERROR_TOO_MANY_OPENED);
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, callback_log.size());
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, callback_log[0]);
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace operations
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace file_system_provider
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace chromeos
144