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