1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/file_system_provider/request_manager.h"
11 #include "base/bind.h"
12 #include "base/callback.h"
13 #include "base/files/file.h"
14 #include "base/files/file_path.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/memory/scoped_vector.h"
17 #include "base/memory/weak_ptr.h"
18 #include "base/run_loop.h"
19 #include "chrome/browser/chromeos/file_system_provider/notification_manager_interface.h"
20 #include "chrome/browser/chromeos/file_system_provider/request_value.h"
21 #include "content/public/test/test_browser_thread_bundle.h"
22 #include "testing/gtest/include/gtest/gtest.h"
25 namespace file_system_provider {
28 // Fake implementation for the notification manager. Simulates user action on
30 class FakeNotificationManager : public NotificationManagerInterface {
32 FakeNotificationManager() {}
33 virtual ~FakeNotificationManager() {}
35 // NotificationManagerInterface overrides:
36 virtual void ShowUnresponsiveNotification(
38 const NotificationCallback& callback) OVERRIDE {
39 callbacks_[id] = callback;
42 virtual void HideUnresponsiveNotification(int id) OVERRIDE {
46 // Aborts all of the virtually shown notifications.
47 void Abort() { OnNotificationResult(ABORT); }
49 // Discards all of the virtually shown notifications.
50 void Continue() { OnNotificationResult(CONTINUE); }
52 // Returns number of currently shown notifications.
53 size_t size() { return callbacks_.size(); }
56 typedef std::map<int, NotificationCallback> CallbackMap;
58 // Handles a notification result by calling all registered callbacks and
60 void OnNotificationResult(NotificationResult result) {
61 CallbackMap::iterator it = callbacks_.begin();
62 while (it != callbacks_.end()) {
63 CallbackMap::iterator current_it = it++;
64 NotificationCallback callback = current_it->second;
65 callbacks_.erase(current_it);
70 CallbackMap callbacks_;
72 DISALLOW_COPY_AND_ASSIGN(FakeNotificationManager);
75 // Logs calls of the success and error callbacks on requests.
80 explicit ExecuteEvent(int request_id) : request_id_(request_id) {}
81 virtual ~ExecuteEvent() {}
83 int request_id() { return request_id_; }
91 SuccessEvent(int request_id, scoped_ptr<RequestValue> result, bool has_more)
92 : request_id_(request_id),
93 result_(result.Pass()),
94 has_more_(has_more) {}
95 virtual ~SuccessEvent() {}
97 int request_id() { return request_id_; }
98 RequestValue* result() { return result_.get(); }
99 bool has_more() { return has_more_; }
103 scoped_ptr<RequestValue> result_;
109 ErrorEvent(int request_id,
110 scoped_ptr<RequestValue> result,
111 base::File::Error error)
112 : request_id_(request_id), result_(result.Pass()), error_(error) {}
113 virtual ~ErrorEvent() {}
115 int request_id() { return request_id_; }
116 RequestValue* result() { return result_.get(); }
117 base::File::Error error() { return error_; }
121 scoped_ptr<RequestValue> result_;
122 base::File::Error error_;
125 EventLogger() : weak_ptr_factory_(this) {}
126 virtual ~EventLogger() {}
128 void OnExecute(int request_id) {
129 execute_events_.push_back(new ExecuteEvent(request_id));
132 void OnSuccess(int request_id,
133 scoped_ptr<RequestValue> result,
135 success_events_.push_back(
136 new SuccessEvent(request_id, result.Pass(), has_more));
139 void OnError(int request_id,
140 scoped_ptr<RequestValue> result,
141 base::File::Error error) {
142 error_events_.push_back(new ErrorEvent(request_id, result.Pass(), error));
145 ScopedVector<ExecuteEvent>& execute_events() { return execute_events_; }
146 ScopedVector<SuccessEvent>& success_events() { return success_events_; }
147 ScopedVector<ErrorEvent>& error_events() { return error_events_; }
149 base::WeakPtr<EventLogger> GetWeakPtr() {
150 return weak_ptr_factory_.GetWeakPtr();
154 ScopedVector<ExecuteEvent> execute_events_;
155 ScopedVector<SuccessEvent> success_events_;
156 ScopedVector<ErrorEvent> error_events_;
157 base::WeakPtrFactory<EventLogger> weak_ptr_factory_;
159 DISALLOW_COPY_AND_ASSIGN(EventLogger);
162 // Fake handler, which forwards callbacks to the logger. The handler is owned
163 // by a request manager, however the logger is owned by tests.
164 class FakeHandler : public RequestManager::HandlerInterface {
166 // The handler can outlive the passed logger, so using a weak pointer. The
167 // |execute_reply| value will be returned for the Execute() call.
168 FakeHandler(base::WeakPtr<EventLogger> logger, bool execute_reply)
169 : logger_(logger), execute_reply_(execute_reply) {}
171 // RequestManager::Handler overrides.
172 virtual bool Execute(int request_id) OVERRIDE {
174 logger_->OnExecute(request_id);
176 return execute_reply_;
179 // RequestManager::Handler overrides.
180 virtual void OnSuccess(int request_id,
181 scoped_ptr<RequestValue> result,
182 bool has_more) OVERRIDE {
184 logger_->OnSuccess(request_id, result.Pass(), has_more);
187 // RequestManager::Handler overrides.
188 virtual void OnError(int request_id,
189 scoped_ptr<RequestValue> result,
190 base::File::Error error) OVERRIDE {
192 logger_->OnError(request_id, result.Pass(), error);
195 virtual ~FakeHandler() {}
198 base::WeakPtr<EventLogger> logger_;
200 DISALLOW_COPY_AND_ASSIGN(FakeHandler);
203 // Observer the request manager for request events.
204 class RequestObserver : public RequestManager::Observer {
208 explicit Event(int request_id) : request_id_(request_id) {}
210 int request_id() const { return request_id_; }
216 class CreatedEvent : public Event {
218 CreatedEvent(int request_id, RequestType type)
219 : Event(request_id), type_(type) {}
220 virtual ~CreatedEvent() {}
222 RequestType type() const { return type_; }
228 class FulfilledEvent : public Event {
230 FulfilledEvent(int request_id, bool has_more)
231 : Event(request_id), has_more_(has_more) {}
232 virtual ~FulfilledEvent() {}
234 bool has_more() const { return has_more_; }
240 class RejectedEvent : public Event {
242 RejectedEvent(int request_id, base::File::Error error)
243 : Event(request_id), error_(error) {}
244 virtual ~RejectedEvent() {}
246 base::File::Error error() const { return error_; }
249 base::File::Error error_;
253 virtual ~RequestObserver() {}
255 // RequestManager::Observer overrides.
256 virtual void OnRequestCreated(int request_id, RequestType type) OVERRIDE {
257 created_.push_back(CreatedEvent(request_id, type));
260 // RequestManager::Observer overrides.
261 virtual void OnRequestDestroyed(int request_id) OVERRIDE {
262 destroyed_.push_back(Event(request_id));
265 // RequestManager::Observer overrides.
266 virtual void OnRequestExecuted(int request_id) OVERRIDE {
267 executed_.push_back(Event(request_id));
270 // RequestManager::Observer overrides.
271 virtual void OnRequestFulfilled(int request_id,
272 const RequestValue& result,
273 bool has_more) OVERRIDE {
274 fulfilled_.push_back(FulfilledEvent(request_id, has_more));
277 // RequestManager::Observer overrides.
278 virtual void OnRequestRejected(int request_id,
279 const RequestValue& result,
280 base::File::Error error) OVERRIDE {
281 rejected_.push_back(RejectedEvent(request_id, error));
284 // RequestManager::Observer overrides.
285 virtual void OnRequestTimeouted(int request_id) OVERRIDE {
286 timeouted_.push_back(Event(request_id));
289 const std::vector<CreatedEvent>& created() const { return created_; }
290 const std::vector<Event>& destroyed() const { return destroyed_; }
291 const std::vector<Event>& executed() const { return executed_; }
292 const std::vector<FulfilledEvent>& fulfilled() const { return fulfilled_; }
293 const std::vector<RejectedEvent>& rejected() const { return rejected_; }
294 const std::vector<Event>& timeouted() const { return timeouted_; }
297 std::vector<CreatedEvent> created_;
298 std::vector<Event> destroyed_;
299 std::vector<Event> executed_;
300 std::vector<FulfilledEvent> fulfilled_;
301 std::vector<RejectedEvent> rejected_;
302 std::vector<Event> timeouted_;
304 DISALLOW_COPY_AND_ASSIGN(RequestObserver);
309 class FileSystemProviderRequestManagerTest : public testing::Test {
311 FileSystemProviderRequestManagerTest() {}
312 virtual ~FileSystemProviderRequestManagerTest() {}
314 virtual void SetUp() OVERRIDE {
315 notification_manager_.reset(new FakeNotificationManager);
316 request_manager_.reset(new RequestManager(notification_manager_.get()));
319 content::TestBrowserThreadBundle thread_bundle_;
320 scoped_ptr<FakeNotificationManager> notification_manager_;
321 scoped_ptr<RequestManager> request_manager_;
324 TEST_F(FileSystemProviderRequestManagerTest, CreateFailure) {
326 RequestObserver observer;
327 request_manager_->AddObserver(&observer);
329 const int request_id = request_manager_->CreateRequest(
331 make_scoped_ptr<RequestManager::HandlerInterface>(
332 new FakeHandler(logger.GetWeakPtr(), false /* execute_reply */)));
334 EXPECT_EQ(0, request_id);
335 EXPECT_EQ(0u, logger.success_events().size());
336 EXPECT_EQ(0u, logger.error_events().size());
338 EXPECT_EQ(1u, observer.created().size());
339 EXPECT_EQ(TESTING, observer.created()[0].type());
340 EXPECT_EQ(1u, observer.destroyed().size());
341 EXPECT_EQ(0u, observer.executed().size());
343 request_manager_->RemoveObserver(&observer);
346 TEST_F(FileSystemProviderRequestManagerTest, CreateAndFulFill) {
348 RequestObserver observer;
349 request_manager_->AddObserver(&observer);
351 const int request_id = request_manager_->CreateRequest(
353 make_scoped_ptr<RequestManager::HandlerInterface>(
354 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
356 EXPECT_EQ(1, request_id);
357 EXPECT_EQ(0u, logger.success_events().size());
358 EXPECT_EQ(0u, logger.error_events().size());
360 ASSERT_EQ(1u, observer.created().size());
361 EXPECT_EQ(request_id, observer.created()[0].request_id());
362 EXPECT_EQ(TESTING, observer.created()[0].type());
364 ASSERT_EQ(1u, observer.executed().size());
365 EXPECT_EQ(request_id, observer.executed()[0].request_id());
367 scoped_ptr<RequestValue> response(
368 RequestValue::CreateForTesting("i-like-vanilla"));
369 const bool has_more = false;
372 request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
375 ASSERT_EQ(1u, observer.fulfilled().size());
376 EXPECT_EQ(request_id, observer.fulfilled()[0].request_id());
377 EXPECT_FALSE(observer.fulfilled()[0].has_more());
379 // Validate if the callback has correct arguments.
380 ASSERT_EQ(1u, logger.success_events().size());
381 EXPECT_EQ(0u, logger.error_events().size());
382 EventLogger::SuccessEvent* event = logger.success_events()[0];
383 ASSERT_TRUE(event->result());
384 const std::string* response_test_string = event->result()->testing_params();
385 ASSERT_TRUE(response_test_string);
386 EXPECT_EQ("i-like-vanilla", *response_test_string);
387 EXPECT_FALSE(event->has_more());
389 // Confirm, that the request is removed. Basically, fulfilling again for the
390 // same request, should fail.
392 bool retry = request_manager_->FulfillRequest(
393 request_id, scoped_ptr<RequestValue>(new RequestValue), has_more);
395 EXPECT_EQ(1u, observer.fulfilled().size());
398 // Rejecting should also fail.
400 bool retry = request_manager_->RejectRequest(
402 scoped_ptr<RequestValue>(new RequestValue()),
403 base::File::FILE_ERROR_FAILED);
405 EXPECT_EQ(0u, observer.rejected().size());
408 ASSERT_EQ(1u, observer.destroyed().size());
409 EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
410 EXPECT_EQ(0u, observer.timeouted().size());
412 request_manager_->RemoveObserver(&observer);
415 TEST_F(FileSystemProviderRequestManagerTest, CreateAndFulFill_WithHasNext) {
417 RequestObserver observer;
418 request_manager_->AddObserver(&observer);
420 const int request_id = request_manager_->CreateRequest(
422 make_scoped_ptr<RequestManager::HandlerInterface>(
423 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
425 EXPECT_EQ(1, request_id);
426 EXPECT_EQ(0u, logger.success_events().size());
427 EXPECT_EQ(0u, logger.error_events().size());
429 ASSERT_EQ(1u, observer.created().size());
430 EXPECT_EQ(request_id, observer.created()[0].request_id());
431 EXPECT_EQ(TESTING, observer.created()[0].type());
433 ASSERT_EQ(1u, observer.executed().size());
434 EXPECT_EQ(request_id, observer.executed()[0].request_id());
436 const bool has_more = true;
438 bool result = request_manager_->FulfillRequest(
439 request_id, scoped_ptr<RequestValue>(new RequestValue), has_more);
442 // Validate if the callback has correct arguments.
443 ASSERT_EQ(1u, logger.success_events().size());
444 EXPECT_EQ(0u, logger.error_events().size());
445 EventLogger::SuccessEvent* event = logger.success_events()[0];
446 EXPECT_TRUE(event->result());
447 EXPECT_TRUE(event->has_more());
449 ASSERT_EQ(1u, observer.fulfilled().size());
450 EXPECT_EQ(request_id, observer.fulfilled()[0].request_id());
451 EXPECT_TRUE(observer.fulfilled()[0].has_more());
453 // Confirm, that the request is not removed (since it has has_more == true).
454 // Basically, fulfilling again for the same request, should not fail.
456 bool new_has_more = false;
457 bool retry = request_manager_->FulfillRequest(
458 request_id, scoped_ptr<RequestValue>(new RequestValue), new_has_more);
461 ASSERT_EQ(2u, observer.fulfilled().size());
462 EXPECT_EQ(request_id, observer.fulfilled()[1].request_id());
463 EXPECT_FALSE(observer.fulfilled()[1].has_more());
466 // Since |new_has_more| is false, then the request should be removed. To check
467 // it, try to fulfill again, what should fail.
469 bool new_has_more = false;
470 bool retry = request_manager_->FulfillRequest(
471 request_id, scoped_ptr<RequestValue>(new RequestValue), new_has_more);
473 EXPECT_EQ(0u, observer.rejected().size());
476 ASSERT_EQ(1u, observer.destroyed().size());
477 EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
478 EXPECT_EQ(0u, observer.timeouted().size());
480 request_manager_->RemoveObserver(&observer);
483 TEST_F(FileSystemProviderRequestManagerTest, CreateAndReject) {
485 RequestObserver observer;
486 request_manager_->AddObserver(&observer);
488 const int request_id = request_manager_->CreateRequest(
490 make_scoped_ptr<RequestManager::HandlerInterface>(
491 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
493 EXPECT_EQ(1, request_id);
494 EXPECT_EQ(0u, logger.success_events().size());
495 EXPECT_EQ(0u, logger.error_events().size());
497 ASSERT_EQ(1u, observer.created().size());
498 EXPECT_EQ(request_id, observer.created()[0].request_id());
499 EXPECT_EQ(TESTING, observer.created()[0].type());
501 ASSERT_EQ(1u, observer.executed().size());
502 EXPECT_EQ(request_id, observer.executed()[0].request_id());
504 base::File::Error error = base::File::FILE_ERROR_NO_MEMORY;
505 bool result = request_manager_->RejectRequest(
506 request_id, scoped_ptr<RequestValue>(new RequestValue()), error);
509 // Validate if the callback has correct arguments.
510 ASSERT_EQ(1u, logger.error_events().size());
511 EXPECT_EQ(0u, logger.success_events().size());
512 EventLogger::ErrorEvent* event = logger.error_events()[0];
513 EXPECT_EQ(error, event->error());
515 ASSERT_EQ(1u, observer.rejected().size());
516 EXPECT_EQ(request_id, observer.rejected()[0].request_id());
517 EXPECT_EQ(error, observer.rejected()[0].error());
519 // Confirm, that the request is removed. Basically, fulfilling again for the
520 // same request, should fail.
522 bool has_more = false;
523 bool retry = request_manager_->FulfillRequest(
524 request_id, scoped_ptr<RequestValue>(new RequestValue), has_more);
526 EXPECT_EQ(0u, observer.fulfilled().size());
529 // Rejecting should also fail.
531 bool retry = request_manager_->RejectRequest(
532 request_id, scoped_ptr<RequestValue>(new RequestValue()), error);
534 EXPECT_EQ(1u, observer.rejected().size());
537 ASSERT_EQ(1u, observer.destroyed().size());
538 EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
539 EXPECT_EQ(0u, observer.timeouted().size());
541 request_manager_->RemoveObserver(&observer);
544 TEST_F(FileSystemProviderRequestManagerTest,
545 CreateAndFulfillWithWrongRequestId) {
547 RequestObserver observer;
548 request_manager_->AddObserver(&observer);
550 const int request_id = request_manager_->CreateRequest(
552 make_scoped_ptr<RequestManager::HandlerInterface>(
553 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
555 EXPECT_EQ(1, request_id);
556 EXPECT_EQ(0u, logger.success_events().size());
557 EXPECT_EQ(0u, logger.error_events().size());
559 ASSERT_EQ(1u, observer.created().size());
560 EXPECT_EQ(request_id, observer.created()[0].request_id());
561 EXPECT_EQ(TESTING, observer.created()[0].type());
563 ASSERT_EQ(1u, observer.executed().size());
564 EXPECT_EQ(request_id, observer.executed()[0].request_id());
566 const bool has_more = true;
568 const bool result = request_manager_->FulfillRequest(
569 request_id + 1, scoped_ptr<RequestValue>(new RequestValue), has_more);
570 EXPECT_FALSE(result);
572 // Callbacks should not be called.
573 EXPECT_EQ(0u, logger.error_events().size());
574 EXPECT_EQ(0u, logger.success_events().size());
576 EXPECT_EQ(0u, observer.fulfilled().size());
577 EXPECT_EQ(request_id, observer.executed()[0].request_id());
579 // Confirm, that the request hasn't been removed, by fulfilling it correctly.
581 const bool retry = request_manager_->FulfillRequest(
582 request_id, scoped_ptr<RequestValue>(new RequestValue), has_more);
584 EXPECT_EQ(1u, observer.fulfilled().size());
587 request_manager_->RemoveObserver(&observer);
590 TEST_F(FileSystemProviderRequestManagerTest,
591 CreateAndRejectWithWrongRequestId) {
593 RequestObserver observer;
594 request_manager_->AddObserver(&observer);
596 const int request_id = request_manager_->CreateRequest(
598 make_scoped_ptr<RequestManager::HandlerInterface>(
599 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
601 EXPECT_EQ(1, request_id);
602 EXPECT_EQ(0u, logger.success_events().size());
603 EXPECT_EQ(0u, logger.error_events().size());
605 ASSERT_EQ(1u, observer.created().size());
606 EXPECT_EQ(request_id, observer.created()[0].request_id());
607 EXPECT_EQ(TESTING, observer.created()[0].type());
609 ASSERT_EQ(1u, observer.executed().size());
610 EXPECT_EQ(request_id, observer.executed()[0].request_id());
612 base::File::Error error = base::File::FILE_ERROR_NO_MEMORY;
613 bool result = request_manager_->RejectRequest(
614 request_id + 1, scoped_ptr<RequestValue>(new RequestValue()), error);
615 EXPECT_FALSE(result);
617 // Callbacks should not be called.
618 EXPECT_EQ(0u, logger.error_events().size());
619 EXPECT_EQ(0u, logger.success_events().size());
621 EXPECT_EQ(0u, observer.rejected().size());
623 // Confirm, that the request hasn't been removed, by rejecting it correctly.
625 bool retry = request_manager_->RejectRequest(
626 request_id, scoped_ptr<RequestValue>(new RequestValue()), error);
628 EXPECT_EQ(1u, observer.rejected().size());
631 request_manager_->RemoveObserver(&observer);
634 TEST_F(FileSystemProviderRequestManagerTest, UniqueIds) {
637 const int first_request_id = request_manager_->CreateRequest(
639 make_scoped_ptr<RequestManager::HandlerInterface>(
640 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
642 const int second_request_id = request_manager_->CreateRequest(
644 make_scoped_ptr<RequestManager::HandlerInterface>(
645 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
647 EXPECT_EQ(1, first_request_id);
648 EXPECT_EQ(2, second_request_id);
651 TEST_F(FileSystemProviderRequestManagerTest, AbortOnDestroy) {
653 RequestObserver observer;
657 RequestManager request_manager(NULL);
658 request_manager.AddObserver(&observer);
660 request_id = request_manager.CreateRequest(
662 make_scoped_ptr<RequestManager::HandlerInterface>(
663 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
665 EXPECT_EQ(1, request_id);
666 EXPECT_EQ(0u, logger.success_events().size());
667 EXPECT_EQ(0u, logger.error_events().size());
669 ASSERT_EQ(1u, observer.created().size());
670 EXPECT_EQ(request_id, observer.created()[0].request_id());
671 EXPECT_EQ(TESTING, observer.created()[0].type());
673 ASSERT_EQ(1u, observer.executed().size());
674 EXPECT_EQ(request_id, observer.executed()[0].request_id());
676 EXPECT_EQ(0u, observer.fulfilled().size());
677 EXPECT_EQ(0u, observer.rejected().size());
678 EXPECT_EQ(0u, observer.destroyed().size());
679 EXPECT_EQ(0u, observer.timeouted().size());
681 // Do not remove the observer, to catch events while destructing.
684 // All active requests should be aborted in the destructor of RequestManager.
685 ASSERT_EQ(1u, logger.error_events().size());
686 EventLogger::ErrorEvent* event = logger.error_events()[0];
687 EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error());
689 EXPECT_EQ(0u, logger.success_events().size());
691 EXPECT_EQ(0u, observer.fulfilled().size());
692 EXPECT_EQ(0u, observer.timeouted().size());
693 ASSERT_EQ(1u, observer.rejected().size());
694 EXPECT_EQ(request_id, observer.rejected()[0].request_id());
695 EXPECT_EQ(base::File::FILE_ERROR_ABORT, observer.rejected()[0].error());
696 ASSERT_EQ(1u, observer.destroyed().size());
699 TEST_F(FileSystemProviderRequestManagerTest, AbortOnTimeout) {
701 RequestObserver observer;
702 request_manager_->AddObserver(&observer);
704 request_manager_->SetTimeoutForTesting(base::TimeDelta::FromSeconds(0));
705 const int request_id = request_manager_->CreateRequest(
707 make_scoped_ptr<RequestManager::HandlerInterface>(
708 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
709 EXPECT_EQ(1, request_id);
710 EXPECT_EQ(0u, logger.success_events().size());
711 EXPECT_EQ(0u, logger.error_events().size());
712 EXPECT_EQ(0u, notification_manager_->size());
714 ASSERT_EQ(1u, observer.created().size());
715 EXPECT_EQ(request_id, observer.created()[0].request_id());
716 EXPECT_EQ(TESTING, observer.created()[0].type());
718 ASSERT_EQ(1u, observer.executed().size());
719 EXPECT_EQ(request_id, observer.executed()[0].request_id());
721 // Wait until the request is timeouted.
722 base::RunLoop().RunUntilIdle();
724 // Abort the request.
725 EXPECT_EQ(1u, notification_manager_->size());
726 notification_manager_->Abort();
727 EXPECT_EQ(0u, notification_manager_->size());
729 ASSERT_EQ(1u, logger.error_events().size());
730 EventLogger::ErrorEvent* event = logger.error_events()[0];
731 EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error());
733 ASSERT_EQ(1u, observer.rejected().size());
734 EXPECT_EQ(request_id, observer.rejected()[0].request_id());
735 EXPECT_EQ(base::File::FILE_ERROR_ABORT, observer.rejected()[0].error());
736 ASSERT_EQ(1u, observer.timeouted().size());
737 EXPECT_EQ(request_id, observer.timeouted()[0].request_id());
738 ASSERT_EQ(1u, observer.destroyed().size());
739 EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
741 request_manager_->RemoveObserver(&observer);
744 TEST_F(FileSystemProviderRequestManagerTest, ContinueOnTimeout) {
746 RequestObserver observer;
747 request_manager_->AddObserver(&observer);
749 request_manager_->SetTimeoutForTesting(base::TimeDelta::FromSeconds(0));
750 const int request_id = request_manager_->CreateRequest(
752 make_scoped_ptr<RequestManager::HandlerInterface>(
753 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
754 EXPECT_EQ(1, request_id);
755 EXPECT_EQ(0u, logger.success_events().size());
756 EXPECT_EQ(0u, logger.error_events().size());
757 EXPECT_EQ(0u, notification_manager_->size());
759 ASSERT_EQ(1u, observer.created().size());
760 EXPECT_EQ(request_id, observer.created()[0].request_id());
761 EXPECT_EQ(TESTING, observer.created()[0].type());
763 ASSERT_EQ(1u, observer.executed().size());
764 EXPECT_EQ(request_id, observer.executed()[0].request_id());
766 // Wait until the request is timeouted.
767 base::RunLoop().RunUntilIdle();
769 // Let the extension more time by closing the notification.
770 EXPECT_EQ(1u, notification_manager_->size());
771 notification_manager_->Continue();
772 EXPECT_EQ(0u, notification_manager_->size());
774 // The request is still active.
775 EXPECT_EQ(0u, logger.success_events().size());
776 EXPECT_EQ(0u, logger.error_events().size());
778 // Wait until the request is timeouted again.
779 base::RunLoop().RunUntilIdle();
780 EXPECT_EQ(1u, notification_manager_->size());
782 request_manager_->RemoveObserver(&observer);
785 } // namespace file_system_provider
786 } // namespace chromeos