1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <string>
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector>
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/bind.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/callback.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file_path.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/scoped_ptr.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/scoped_vector.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/weak_ptr.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/run_loop.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/chromeos/file_system_provider/request_manager.h"
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chromeos/file_system_provider/request_value.h"
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/test/test_browser_thread_bundle.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace chromeos {
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace file_system_provider {
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Logs calls of the success and error callbacks on requests.
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass EventLogger {
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  class ExecuteEvent {
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   public:
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    explicit ExecuteEvent(int request_id) : request_id_(request_id) {}
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    virtual ~ExecuteEvent() {}
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int request_id() { return request_id_; }
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu   private:
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int request_id_;
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  };
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  class SuccessEvent {
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu   public:
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SuccessEvent(int request_id, scoped_ptr<RequestValue> result, bool has_more)
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        : request_id_(request_id),
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          result_(result.Pass()),
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          has_more_(has_more) {}
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    virtual ~SuccessEvent() {}
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int request_id() { return request_id_; }
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    RequestValue* result() { return result_.get(); }
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool has_more() { return has_more_; }
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   private:
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int request_id_;
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    scoped_ptr<RequestValue> result_;
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool has_more_;
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  class ErrorEvent {
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   public:
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ErrorEvent(int request_id, base::File::Error error)
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        : request_id_(request_id), error_(error) {}
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    virtual ~ErrorEvent() {}
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int request_id() { return request_id_; }
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::File::Error error() { return error_; }
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   private:
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int request_id_;
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::File::Error error_;
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger() : weak_ptr_factory_(this) {}
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~EventLogger() {}
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void OnExecute(int request_id) {
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    execute_events_.push_back(new ExecuteEvent(request_id));
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void OnSuccess(int request_id,
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 scoped_ptr<RequestValue> result,
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 bool has_more) {
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    success_events_.push_back(
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new SuccessEvent(request_id, result.Pass(), has_more));
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void OnError(int request_id, base::File::Error error) {
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    error_events_.push_back(new ErrorEvent(request_id, error));
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ExecuteEvent>& execute_events() { return execute_events_; }
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ScopedVector<SuccessEvent>& success_events() { return success_events_; }
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ScopedVector<ErrorEvent>& error_events() { return error_events_; }
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::WeakPtr<EventLogger> GetWeakPtr() {
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return weak_ptr_factory_.GetWeakPtr();
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ExecuteEvent> execute_events_;
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ScopedVector<SuccessEvent> success_events_;
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ScopedVector<ErrorEvent> error_events_;
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::WeakPtrFactory<EventLogger> weak_ptr_factory_;
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(EventLogger);
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Fake handler, which forwards callbacks to the logger. The handler is owned
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// by a request manager, however the logger is owned by tests.
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass FakeHandler : public RequestManager::HandlerInterface {
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The handler can outlive the passed logger, so using a weak pointer. The
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // |execute_reply| value will be returned for the Execute() call.
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FakeHandler(base::WeakPtr<EventLogger> logger, bool execute_reply)
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : logger_(logger), execute_reply_(execute_reply) {}
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // RequestManager::Handler overrides.
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool Execute(int request_id) OVERRIDE {
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (logger_.get())
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      logger_->OnExecute(request_id);
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return execute_reply_;
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // RequestManager::Handler overrides.
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnSuccess(int request_id,
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                         scoped_ptr<RequestValue> result,
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                         bool has_more) OVERRIDE {
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (logger_.get())
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      logger_->OnSuccess(request_id, result.Pass(), has_more);
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // RequestManager::Handler overrides.
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnError(int request_id, base::File::Error error) OVERRIDE {
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (logger_.get())
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      logger_->OnError(request_id, error);
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~FakeHandler() {}
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::WeakPtr<EventLogger> logger_;
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool execute_reply_;
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(FakeHandler);
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Observer the request manager for request events.
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class RequestObserver : public RequestManager::Observer {
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  class Event {
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   public:
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    explicit Event(int request_id) : request_id_(request_id) {}
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual ~Event() {}
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int request_id() const { return request_id_; }
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   private:
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int request_id_;
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  class CreatedEvent : public Event {
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   public:
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CreatedEvent(int request_id, RequestType type)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        : Event(request_id), type_(type) {}
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual ~CreatedEvent() {}
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RequestType type() const { return type_; }
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   private:
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RequestType type_;
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  class FulfilledEvent : public Event {
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   public:
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FulfilledEvent(int request_id, bool has_more)
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        : Event(request_id), has_more_(has_more) {}
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual ~FulfilledEvent() {}
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool has_more() const { return has_more_; }
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   private:
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool has_more_;
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  class RejectedEvent : public Event {
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   public:
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RejectedEvent(int request_id, base::File::Error error)
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        : Event(request_id), error_(error) {}
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual ~RejectedEvent() {}
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::File::Error error() const { return error_; }
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   private:
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::File::Error error_;
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver() {}
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~RequestObserver() {}
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // RequestManager::Observer overrides.
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void OnRequestCreated(int request_id, RequestType type) OVERRIDE {
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    created_.push_back(CreatedEvent(request_id, type));
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // RequestManager::Observer overrides.
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnRequestDestroyed(int request_id) OVERRIDE {
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    destroyed_.push_back(Event(request_id));
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // RequestManager::Observer overrides.
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnRequestExecuted(int request_id) OVERRIDE {
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    executed_.push_back(Event(request_id));
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // RequestManager::Observer overrides.
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnRequestFulfilled(int request_id, bool has_more) OVERRIDE {
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    fulfilled_.push_back(FulfilledEvent(request_id, has_more));
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // RequestManager::Observer overrides.
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnRequestRejected(int request_id,
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 base::File::Error error) OVERRIDE {
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    rejected_.push_back(RejectedEvent(request_id, error));
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // RequestManager::Observer overrides.
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnRequestTimeouted(int request_id) OVERRIDE {
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    timeouted_.push_back(Event(request_id));
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::vector<CreatedEvent>& created() const { return created_; }
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::vector<Event>& destroyed() const { return destroyed_; }
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::vector<Event>& executed() const { return executed_; }
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::vector<FulfilledEvent>& fulfilled() const { return fulfilled_; }
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::vector<RejectedEvent>& rejected() const { return rejected_; }
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::vector<Event>& timeouted() const { return timeouted_; }
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<CreatedEvent> created_;
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<Event> destroyed_;
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<Event> executed_;
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<FulfilledEvent> fulfilled_;
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<RejectedEvent> rejected_;
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<Event> timeouted_;
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RequestObserver);
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace
247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass FileSystemProviderRequestManagerTest : public testing::Test {
249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FileSystemProviderRequestManagerTest() {}
251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~FileSystemProviderRequestManagerTest() {}
252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUp() OVERRIDE {
254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    request_manager_.reset(new RequestManager());
255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  content::TestBrowserThreadBundle thread_bundle_;
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<RequestManager> request_manager_;
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(FileSystemProviderRequestManagerTest, CreateFailure) {
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EventLogger logger;
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver observer;
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->AddObserver(&observer);
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int request_id = request_manager_->CreateRequest(
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      make_scoped_ptr<RequestManager::HandlerInterface>(
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          new FakeHandler(logger.GetWeakPtr(), false /* execute_reply */)));
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, request_id);
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, logger.success_events().size());
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, logger.error_events().size());
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1u, observer.created().size());
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(TESTING, observer.created()[0].type());
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1u, observer.destroyed().size());
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, observer.executed().size());
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->RemoveObserver(&observer);
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderRequestManagerTest, CreateAndFulFill) {
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger logger;
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver observer;
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->AddObserver(&observer);
287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const int request_id = request_manager_->CreateRequest(
28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      make_scoped_ptr<RequestManager::HandlerInterface>(
2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1, request_id);
294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.created().size());
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.created()[0].request_id());
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(TESTING, observer.created()[0].type());
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.executed().size());
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.executed()[0].request_id());
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<RequestValue> response(
3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      RequestValue::CreateForTesting("i-like-vanilla"));
30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const bool has_more = false;
307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool result =
30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(result);
311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.fulfilled().size());
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.fulfilled()[0].request_id());
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(observer.fulfilled()[0].has_more());
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Validate if the callback has correct arguments.
317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(1u, logger.success_events().size());
318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger::SuccessEvent* event = logger.success_events()[0];
320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(event->result());
3215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const std::string* response_test_string = event->result()->testing_params();
3225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(response_test_string);
3235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ("i-like-vanilla", *response_test_string);
32446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(event->has_more());
325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Confirm, that the request is removed. Basically, fulfilling again for the
327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // same request, should fail.
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    scoped_ptr<RequestValue> response;
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool retry =
33146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(retry);
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(1u, observer.fulfilled().size());
334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
336c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Rejecting should also fail.
337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool retry = request_manager_->RejectRequest(request_id,
3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                 base::File::FILE_ERROR_FAILED);
340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(retry);
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(0u, observer.rejected().size());
342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.destroyed().size());
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, observer.timeouted().size());
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->RemoveObserver(&observer);
349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderRequestManagerTest, CreateAndFulFill_WithHasNext) {
352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger logger;
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver observer;
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->AddObserver(&observer);
355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const int request_id = request_manager_->CreateRequest(
35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      make_scoped_ptr<RequestManager::HandlerInterface>(
3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1, request_id);
362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.created().size());
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.created()[0].request_id());
36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(TESTING, observer.created()[0].type());
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.executed().size());
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.executed()[0].request_id());
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<RequestValue> response;
37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const bool has_more = true;
374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool result =
37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(result);
378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Validate if the callback has correct arguments.
380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(1u, logger.success_events().size());
381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger::SuccessEvent* event = logger.success_events()[0];
383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(event->result());
38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(event->has_more());
385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.fulfilled().size());
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.fulfilled()[0].request_id());
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(observer.fulfilled()[0].has_more());
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Confirm, that the request is not removed (since it has has_more == true).
391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Basically, fulfilling again for the same request, should not fail.
392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool new_has_more = false;
394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool retry = request_manager_->FulfillRequest(
39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request_id, response.Pass(), new_has_more);
396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(retry);
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_EQ(2u, observer.fulfilled().size());
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(request_id, observer.fulfilled()[1].request_id());
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(observer.fulfilled()[1].has_more());
401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Since |new_has_more| is false, then the request should be removed. To check
404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // it, try to fulfill again, what should fail.
405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool new_has_more = false;
407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool retry = request_manager_->FulfillRequest(
40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request_id, response.Pass(), new_has_more);
409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(retry);
410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(0u, observer.rejected().size());
411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.destroyed().size());
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, observer.timeouted().size());
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->RemoveObserver(&observer);
418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderRequestManagerTest, CreateAndReject) {
421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger logger;
422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver observer;
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->AddObserver(&observer);
424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const int request_id = request_manager_->CreateRequest(
42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
4275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      make_scoped_ptr<RequestManager::HandlerInterface>(
4285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1, request_id);
431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.created().size());
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.created()[0].request_id());
43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(TESTING, observer.created()[0].type());
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.executed().size());
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.executed()[0].request_id());
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::File::Error error = base::File::FILE_ERROR_NO_MEMORY;
4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool result = request_manager_->RejectRequest(request_id, error);
443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(result);
444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Validate if the callback has correct arguments.
446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(1u, logger.error_events().size());
447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
448c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger::ErrorEvent* event = logger.error_events()[0];
449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(error, event->error());
450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.rejected().size());
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.rejected()[0].request_id());
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error, observer.rejected()[0].error());
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Confirm, that the request is removed. Basically, fulfilling again for the
456c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // same request, should fail.
457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    scoped_ptr<RequestValue> response;
45946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool has_more = false;
4600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool retry =
46146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(retry);
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(0u, observer.fulfilled().size());
464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Rejecting should also fail.
467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
4680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool retry = request_manager_->RejectRequest(request_id, error);
469c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(retry);
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(1u, observer.rejected().size());
471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.destroyed().size());
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, observer.timeouted().size());
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->RemoveObserver(&observer);
478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderRequestManagerTest,
481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       CreateAndFulfillWithWrongRequestId) {
482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger logger;
483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver observer;
484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->AddObserver(&observer);
485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const int request_id = request_manager_->CreateRequest(
48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
4885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      make_scoped_ptr<RequestManager::HandlerInterface>(
4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
491c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1, request_id);
492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.created().size());
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.created()[0].request_id());
49746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(TESTING, observer.created()[0].type());
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.executed().size());
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.executed()[0].request_id());
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<RequestValue> response;
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool has_more = true;
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool result = request_manager_->FulfillRequest(
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      request_id + 1, response.Pass(), has_more);
507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(result);
508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Callbacks should not be called.
510c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
512c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, observer.fulfilled().size());
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.executed()[0].request_id());
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Confirm, that the request hasn't been removed, by fulfilling it correctly.
517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const bool retry =
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(retry);
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(1u, observer.fulfilled().size());
522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->RemoveObserver(&observer);
525c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderRequestManagerTest,
528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       CreateAndRejectWithWrongRequestId) {
529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger logger;
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver observer;
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->AddObserver(&observer);
532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const int request_id = request_manager_->CreateRequest(
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
5355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      make_scoped_ptr<RequestManager::HandlerInterface>(
5365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
538c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1, request_id);
539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
541c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.created().size());
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.created()[0].request_id());
54446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(TESTING, observer.created()[0].type());
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.executed().size());
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.executed()[0].request_id());
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::File::Error error = base::File::FILE_ERROR_NO_MEMORY;
5500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool result = request_manager_->RejectRequest(request_id + 1, error);
551c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(result);
552c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Callbacks should not be called.
554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.error_events().size());
555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
556c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, observer.rejected().size());
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Confirm, that the request hasn't been removed, by rejecting it correctly.
560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
5610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool retry = request_manager_->RejectRequest(request_id, error);
562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(retry);
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(1u, observer.rejected().size());
564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->RemoveObserver(&observer);
567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5690529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FileSystemProviderRequestManagerTest, UniqueIds) {
570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger logger;
571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const int first_request_id = request_manager_->CreateRequest(
57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
5745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      make_scoped_ptr<RequestManager::HandlerInterface>(
5755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
576c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const int second_request_id = request_manager_->CreateRequest(
57846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
5795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      make_scoped_ptr<RequestManager::HandlerInterface>(
5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
581c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1, first_request_id);
5830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(2, second_request_id);
5840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
585c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5860529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FileSystemProviderRequestManagerTest, AbortOnDestroy) {
5870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventLogger logger;
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver observer;
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int request_id;
590c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
591c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  {
5920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    RequestManager request_manager;
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    request_manager.AddObserver(&observer);
594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    request_id = request_manager.CreateRequest(
59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        TESTING,
5975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        make_scoped_ptr<RequestManager::HandlerInterface>(
5985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
5990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(1, request_id);
6010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(0u, logger.success_events().size());
6020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(0u, logger.error_events().size());
603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_EQ(1u, observer.created().size());
605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(request_id, observer.created()[0].request_id());
60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(TESTING, observer.created()[0].type());
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_EQ(1u, observer.executed().size());
609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(request_id, observer.executed()[0].request_id());
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(0u, observer.fulfilled().size());
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(0u, observer.rejected().size());
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(0u, observer.destroyed().size());
614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(0u, observer.timeouted().size());
615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Do not remove the observer, to catch events while destructing.
617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
6180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // All active requests should be aborted in the destructor of RequestManager.
6200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(1u, logger.error_events().size());
6215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EventLogger::ErrorEvent* event = logger.error_events()[0];
6220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error());
6230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0u, logger.success_events().size());
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, observer.fulfilled().size());
627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, observer.timeouted().size());
628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.rejected().size());
629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.rejected()[0].request_id());
630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_ABORT, observer.rejected()[0].error());
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.destroyed().size());
632c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
633c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
6340529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FileSystemProviderRequestManagerTest, AbortOnTimeout) {
635c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EventLogger logger;
636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestObserver observer;
637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->AddObserver(&observer);
638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  request_manager_->SetTimeoutForTesting(base::TimeDelta::FromSeconds(0));
6405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const int request_id = request_manager_->CreateRequest(
64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      TESTING,
6425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      make_scoped_ptr<RequestManager::HandlerInterface>(
6435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1, request_id);
645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, logger.success_events().size());
646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0u, logger.error_events().size());
647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.created().size());
649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.created()[0].request_id());
65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(TESTING, observer.created()[0].type());
651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.executed().size());
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.executed()[0].request_id());
654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
6550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Wait until the request is timeouted.
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
6580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(1u, logger.error_events().size());
6590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventLogger::ErrorEvent* event = logger.error_events()[0];
6600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error());
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.rejected().size());
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.rejected()[0].request_id());
664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_ABORT, observer.rejected()[0].error());
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.timeouted().size());
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.timeouted()[0].request_id());
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, observer.destroyed().size());
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  request_manager_->RemoveObserver(&observer);
671c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
672c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
673c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace file_system_provider
674c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace chromeos
675