• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include <string>
6 #include <vector>
7 
8 #include "base/bind.h"
9 #include "base/callback.h"
10 #include "base/files/file.h"
11 #include "base/files/file_path.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/memory/weak_ptr.h"
15 #include "base/run_loop.h"
16 #include "chrome/browser/chromeos/file_system_provider/request_manager.h"
17 #include "chrome/browser/chromeos/file_system_provider/request_value.h"
18 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 
21 namespace chromeos {
22 namespace file_system_provider {
23 namespace {
24 
25 // Logs calls of the success and error callbacks on requests.
26 class EventLogger {
27  public:
28   class ExecuteEvent {
29    public:
ExecuteEvent(int request_id)30     explicit ExecuteEvent(int request_id) : request_id_(request_id) {}
~ExecuteEvent()31     virtual ~ExecuteEvent() {}
32 
request_id()33     int request_id() { return request_id_; }
34 
35    private:
36     int request_id_;
37   };
38 
39   class SuccessEvent {
40    public:
SuccessEvent(int request_id,scoped_ptr<RequestValue> result,bool has_more)41     SuccessEvent(int request_id, scoped_ptr<RequestValue> result, bool has_more)
42         : request_id_(request_id),
43           result_(result.Pass()),
44           has_more_(has_more) {}
~SuccessEvent()45     virtual ~SuccessEvent() {}
46 
request_id()47     int request_id() { return request_id_; }
result()48     RequestValue* result() { return result_.get(); }
has_more()49     bool has_more() { return has_more_; }
50 
51    private:
52     int request_id_;
53     scoped_ptr<RequestValue> result_;
54     bool has_more_;
55   };
56 
57   class ErrorEvent {
58    public:
ErrorEvent(int request_id,base::File::Error error)59     ErrorEvent(int request_id, base::File::Error error)
60         : request_id_(request_id), error_(error) {}
~ErrorEvent()61     virtual ~ErrorEvent() {}
62 
request_id()63     int request_id() { return request_id_; }
error()64     base::File::Error error() { return error_; }
65 
66    private:
67     int request_id_;
68     base::File::Error error_;
69   };
70 
EventLogger()71   EventLogger() : weak_ptr_factory_(this) {}
~EventLogger()72   virtual ~EventLogger() {}
73 
OnExecute(int request_id)74   void OnExecute(int request_id) {
75     execute_events_.push_back(new ExecuteEvent(request_id));
76   }
77 
OnSuccess(int request_id,scoped_ptr<RequestValue> result,bool has_more)78   void OnSuccess(int request_id,
79                  scoped_ptr<RequestValue> result,
80                  bool has_more) {
81     success_events_.push_back(
82         new SuccessEvent(request_id, result.Pass(), has_more));
83   }
84 
OnError(int request_id,base::File::Error error)85   void OnError(int request_id, base::File::Error error) {
86     error_events_.push_back(new ErrorEvent(request_id, error));
87   }
88 
execute_events()89   ScopedVector<ExecuteEvent>& execute_events() { return execute_events_; }
success_events()90   ScopedVector<SuccessEvent>& success_events() { return success_events_; }
error_events()91   ScopedVector<ErrorEvent>& error_events() { return error_events_; }
92 
GetWeakPtr()93   base::WeakPtr<EventLogger> GetWeakPtr() {
94     return weak_ptr_factory_.GetWeakPtr();
95   }
96 
97  private:
98   ScopedVector<ExecuteEvent> execute_events_;
99   ScopedVector<SuccessEvent> success_events_;
100   ScopedVector<ErrorEvent> error_events_;
101   base::WeakPtrFactory<EventLogger> weak_ptr_factory_;
102 
103   DISALLOW_COPY_AND_ASSIGN(EventLogger);
104 };
105 
106 // Fake handler, which forwards callbacks to the logger. The handler is owned
107 // by a request manager, however the logger is owned by tests.
108 class FakeHandler : public RequestManager::HandlerInterface {
109  public:
110   // The handler can outlive the passed logger, so using a weak pointer. The
111   // |execute_reply| value will be returned for the Execute() call.
FakeHandler(base::WeakPtr<EventLogger> logger,bool execute_reply)112   FakeHandler(base::WeakPtr<EventLogger> logger, bool execute_reply)
113       : logger_(logger), execute_reply_(execute_reply) {}
114 
115   // RequestManager::Handler overrides.
Execute(int request_id)116   virtual bool Execute(int request_id) OVERRIDE {
117     if (logger_.get())
118       logger_->OnExecute(request_id);
119 
120     return execute_reply_;
121   }
122 
123   // RequestManager::Handler overrides.
OnSuccess(int request_id,scoped_ptr<RequestValue> result,bool has_more)124   virtual void OnSuccess(int request_id,
125                          scoped_ptr<RequestValue> result,
126                          bool has_more) OVERRIDE {
127     if (logger_.get())
128       logger_->OnSuccess(request_id, result.Pass(), has_more);
129   }
130 
131   // RequestManager::Handler overrides.
OnError(int request_id,base::File::Error error)132   virtual void OnError(int request_id, base::File::Error error) OVERRIDE {
133     if (logger_.get())
134       logger_->OnError(request_id, error);
135   }
136 
~FakeHandler()137   virtual ~FakeHandler() {}
138 
139  private:
140   base::WeakPtr<EventLogger> logger_;
141   bool execute_reply_;
142   DISALLOW_COPY_AND_ASSIGN(FakeHandler);
143 };
144 
145 // Observer the request manager for request events.
146 class RequestObserver : public RequestManager::Observer {
147  public:
148   class Event {
149    public:
Event(int request_id)150     explicit Event(int request_id) : request_id_(request_id) {}
~Event()151     virtual ~Event() {}
request_id() const152     int request_id() const { return request_id_; }
153 
154    private:
155     int request_id_;
156   };
157 
158   class CreatedEvent : public Event {
159    public:
CreatedEvent(int request_id,RequestType type)160     CreatedEvent(int request_id, RequestType type)
161         : Event(request_id), type_(type) {}
~CreatedEvent()162     virtual ~CreatedEvent() {}
163 
type() const164     RequestType type() const { return type_; }
165 
166    private:
167     RequestType type_;
168   };
169 
170   class FulfilledEvent : public Event {
171    public:
FulfilledEvent(int request_id,bool has_more)172     FulfilledEvent(int request_id, bool has_more)
173         : Event(request_id), has_more_(has_more) {}
~FulfilledEvent()174     virtual ~FulfilledEvent() {}
175 
has_more() const176     bool has_more() const { return has_more_; }
177 
178    private:
179     bool has_more_;
180   };
181 
182   class RejectedEvent : public Event {
183    public:
RejectedEvent(int request_id,base::File::Error error)184     RejectedEvent(int request_id, base::File::Error error)
185         : Event(request_id), error_(error) {}
~RejectedEvent()186     virtual ~RejectedEvent() {}
187 
error() const188     base::File::Error error() const { return error_; }
189 
190    private:
191     base::File::Error error_;
192   };
193 
RequestObserver()194   RequestObserver() {}
~RequestObserver()195   virtual ~RequestObserver() {}
196 
197   // RequestManager::Observer overrides.
OnRequestCreated(int request_id,RequestType type)198   virtual void OnRequestCreated(int request_id, RequestType type) OVERRIDE {
199     created_.push_back(CreatedEvent(request_id, type));
200   }
201 
202   // RequestManager::Observer overrides.
OnRequestDestroyed(int request_id)203   virtual void OnRequestDestroyed(int request_id) OVERRIDE {
204     destroyed_.push_back(Event(request_id));
205   }
206 
207   // RequestManager::Observer overrides.
OnRequestExecuted(int request_id)208   virtual void OnRequestExecuted(int request_id) OVERRIDE {
209     executed_.push_back(Event(request_id));
210   }
211 
212   // RequestManager::Observer overrides.
OnRequestFulfilled(int request_id,bool has_more)213   virtual void OnRequestFulfilled(int request_id, bool has_more) OVERRIDE {
214     fulfilled_.push_back(FulfilledEvent(request_id, has_more));
215   }
216 
217   // RequestManager::Observer overrides.
OnRequestRejected(int request_id,base::File::Error error)218   virtual void OnRequestRejected(int request_id,
219                                  base::File::Error error) OVERRIDE {
220     rejected_.push_back(RejectedEvent(request_id, error));
221   }
222 
223   // RequestManager::Observer overrides.
OnRequestTimeouted(int request_id)224   virtual void OnRequestTimeouted(int request_id) OVERRIDE {
225     timeouted_.push_back(Event(request_id));
226   }
227 
created() const228   const std::vector<CreatedEvent>& created() const { return created_; }
destroyed() const229   const std::vector<Event>& destroyed() const { return destroyed_; }
executed() const230   const std::vector<Event>& executed() const { return executed_; }
fulfilled() const231   const std::vector<FulfilledEvent>& fulfilled() const { return fulfilled_; }
rejected() const232   const std::vector<RejectedEvent>& rejected() const { return rejected_; }
timeouted() const233   const std::vector<Event>& timeouted() const { return timeouted_; }
234 
235  private:
236   std::vector<CreatedEvent> created_;
237   std::vector<Event> destroyed_;
238   std::vector<Event> executed_;
239   std::vector<FulfilledEvent> fulfilled_;
240   std::vector<RejectedEvent> rejected_;
241   std::vector<Event> timeouted_;
242 
243   DISALLOW_COPY_AND_ASSIGN(RequestObserver);
244 };
245 
246 }  // namespace
247 
248 class FileSystemProviderRequestManagerTest : public testing::Test {
249  protected:
FileSystemProviderRequestManagerTest()250   FileSystemProviderRequestManagerTest() {}
~FileSystemProviderRequestManagerTest()251   virtual ~FileSystemProviderRequestManagerTest() {}
252 
SetUp()253   virtual void SetUp() OVERRIDE {
254     request_manager_.reset(new RequestManager());
255   }
256 
257   content::TestBrowserThreadBundle thread_bundle_;
258   scoped_ptr<RequestManager> request_manager_;
259 };
260 
TEST_F(FileSystemProviderRequestManagerTest,CreateFailure)261 TEST_F(FileSystemProviderRequestManagerTest, CreateFailure) {
262   EventLogger logger;
263   RequestObserver observer;
264   request_manager_->AddObserver(&observer);
265 
266   const int request_id = request_manager_->CreateRequest(
267       TESTING,
268       make_scoped_ptr<RequestManager::HandlerInterface>(
269           new FakeHandler(logger.GetWeakPtr(), false /* execute_reply */)));
270 
271   EXPECT_EQ(0, request_id);
272   EXPECT_EQ(0u, logger.success_events().size());
273   EXPECT_EQ(0u, logger.error_events().size());
274 
275   EXPECT_EQ(1u, observer.created().size());
276   EXPECT_EQ(TESTING, observer.created()[0].type());
277   EXPECT_EQ(1u, observer.destroyed().size());
278   EXPECT_EQ(0u, observer.executed().size());
279 
280   request_manager_->RemoveObserver(&observer);
281 }
282 
TEST_F(FileSystemProviderRequestManagerTest,CreateAndFulFill)283 TEST_F(FileSystemProviderRequestManagerTest, CreateAndFulFill) {
284   EventLogger logger;
285   RequestObserver observer;
286   request_manager_->AddObserver(&observer);
287 
288   const int request_id = request_manager_->CreateRequest(
289       TESTING,
290       make_scoped_ptr<RequestManager::HandlerInterface>(
291           new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
292 
293   EXPECT_EQ(1, request_id);
294   EXPECT_EQ(0u, logger.success_events().size());
295   EXPECT_EQ(0u, logger.error_events().size());
296 
297   ASSERT_EQ(1u, observer.created().size());
298   EXPECT_EQ(request_id, observer.created()[0].request_id());
299   EXPECT_EQ(TESTING, observer.created()[0].type());
300 
301   ASSERT_EQ(1u, observer.executed().size());
302   EXPECT_EQ(request_id, observer.executed()[0].request_id());
303 
304   scoped_ptr<RequestValue> response(
305       RequestValue::CreateForTesting("i-like-vanilla"));
306   const bool has_more = false;
307 
308   bool result =
309       request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
310   EXPECT_TRUE(result);
311 
312   ASSERT_EQ(1u, observer.fulfilled().size());
313   EXPECT_EQ(request_id, observer.fulfilled()[0].request_id());
314   EXPECT_FALSE(observer.fulfilled()[0].has_more());
315 
316   // Validate if the callback has correct arguments.
317   ASSERT_EQ(1u, logger.success_events().size());
318   EXPECT_EQ(0u, logger.error_events().size());
319   EventLogger::SuccessEvent* event = logger.success_events()[0];
320   ASSERT_TRUE(event->result());
321   const std::string* response_test_string = event->result()->testing_params();
322   ASSERT_TRUE(response_test_string);
323   EXPECT_EQ("i-like-vanilla", *response_test_string);
324   EXPECT_FALSE(event->has_more());
325 
326   // Confirm, that the request is removed. Basically, fulfilling again for the
327   // same request, should fail.
328   {
329     scoped_ptr<RequestValue> response;
330     bool retry =
331         request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
332     EXPECT_FALSE(retry);
333     EXPECT_EQ(1u, observer.fulfilled().size());
334   }
335 
336   // Rejecting should also fail.
337   {
338     bool retry = request_manager_->RejectRequest(request_id,
339                                                  base::File::FILE_ERROR_FAILED);
340     EXPECT_FALSE(retry);
341     EXPECT_EQ(0u, observer.rejected().size());
342   }
343 
344   ASSERT_EQ(1u, observer.destroyed().size());
345   EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
346   EXPECT_EQ(0u, observer.timeouted().size());
347 
348   request_manager_->RemoveObserver(&observer);
349 }
350 
TEST_F(FileSystemProviderRequestManagerTest,CreateAndFulFill_WithHasNext)351 TEST_F(FileSystemProviderRequestManagerTest, CreateAndFulFill_WithHasNext) {
352   EventLogger logger;
353   RequestObserver observer;
354   request_manager_->AddObserver(&observer);
355 
356   const int request_id = request_manager_->CreateRequest(
357       TESTING,
358       make_scoped_ptr<RequestManager::HandlerInterface>(
359           new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
360 
361   EXPECT_EQ(1, request_id);
362   EXPECT_EQ(0u, logger.success_events().size());
363   EXPECT_EQ(0u, logger.error_events().size());
364 
365   ASSERT_EQ(1u, observer.created().size());
366   EXPECT_EQ(request_id, observer.created()[0].request_id());
367   EXPECT_EQ(TESTING, observer.created()[0].type());
368 
369   ASSERT_EQ(1u, observer.executed().size());
370   EXPECT_EQ(request_id, observer.executed()[0].request_id());
371 
372   scoped_ptr<RequestValue> response;
373   const bool has_more = true;
374 
375   bool result =
376       request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
377   EXPECT_TRUE(result);
378 
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   EXPECT_FALSE(event->result());
384   EXPECT_TRUE(event->has_more());
385 
386   ASSERT_EQ(1u, observer.fulfilled().size());
387   EXPECT_EQ(request_id, observer.fulfilled()[0].request_id());
388   EXPECT_TRUE(observer.fulfilled()[0].has_more());
389 
390   // Confirm, that the request is not removed (since it has has_more == true).
391   // Basically, fulfilling again for the same request, should not fail.
392   {
393     bool new_has_more = false;
394     bool retry = request_manager_->FulfillRequest(
395         request_id, response.Pass(), new_has_more);
396     EXPECT_TRUE(retry);
397 
398     ASSERT_EQ(2u, observer.fulfilled().size());
399     EXPECT_EQ(request_id, observer.fulfilled()[1].request_id());
400     EXPECT_FALSE(observer.fulfilled()[1].has_more());
401   }
402 
403   // Since |new_has_more| is false, then the request should be removed. To check
404   // it, try to fulfill again, what should fail.
405   {
406     bool new_has_more = false;
407     bool retry = request_manager_->FulfillRequest(
408         request_id, response.Pass(), new_has_more);
409     EXPECT_FALSE(retry);
410     EXPECT_EQ(0u, observer.rejected().size());
411   }
412 
413   ASSERT_EQ(1u, observer.destroyed().size());
414   EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
415   EXPECT_EQ(0u, observer.timeouted().size());
416 
417   request_manager_->RemoveObserver(&observer);
418 }
419 
TEST_F(FileSystemProviderRequestManagerTest,CreateAndReject)420 TEST_F(FileSystemProviderRequestManagerTest, CreateAndReject) {
421   EventLogger logger;
422   RequestObserver observer;
423   request_manager_->AddObserver(&observer);
424 
425   const int request_id = request_manager_->CreateRequest(
426       TESTING,
427       make_scoped_ptr<RequestManager::HandlerInterface>(
428           new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
429 
430   EXPECT_EQ(1, request_id);
431   EXPECT_EQ(0u, logger.success_events().size());
432   EXPECT_EQ(0u, logger.error_events().size());
433 
434   ASSERT_EQ(1u, observer.created().size());
435   EXPECT_EQ(request_id, observer.created()[0].request_id());
436   EXPECT_EQ(TESTING, observer.created()[0].type());
437 
438   ASSERT_EQ(1u, observer.executed().size());
439   EXPECT_EQ(request_id, observer.executed()[0].request_id());
440 
441   base::File::Error error = base::File::FILE_ERROR_NO_MEMORY;
442   bool result = request_manager_->RejectRequest(request_id, error);
443   EXPECT_TRUE(result);
444 
445   // Validate if the callback has correct arguments.
446   ASSERT_EQ(1u, logger.error_events().size());
447   EXPECT_EQ(0u, logger.success_events().size());
448   EventLogger::ErrorEvent* event = logger.error_events()[0];
449   EXPECT_EQ(error, event->error());
450 
451   ASSERT_EQ(1u, observer.rejected().size());
452   EXPECT_EQ(request_id, observer.rejected()[0].request_id());
453   EXPECT_EQ(error, observer.rejected()[0].error());
454 
455   // Confirm, that the request is removed. Basically, fulfilling again for the
456   // same request, should fail.
457   {
458     scoped_ptr<RequestValue> response;
459     bool has_more = false;
460     bool retry =
461         request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
462     EXPECT_FALSE(retry);
463     EXPECT_EQ(0u, observer.fulfilled().size());
464   }
465 
466   // Rejecting should also fail.
467   {
468     bool retry = request_manager_->RejectRequest(request_id, error);
469     EXPECT_FALSE(retry);
470     EXPECT_EQ(1u, observer.rejected().size());
471   }
472 
473   ASSERT_EQ(1u, observer.destroyed().size());
474   EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
475   EXPECT_EQ(0u, observer.timeouted().size());
476 
477   request_manager_->RemoveObserver(&observer);
478 }
479 
TEST_F(FileSystemProviderRequestManagerTest,CreateAndFulfillWithWrongRequestId)480 TEST_F(FileSystemProviderRequestManagerTest,
481        CreateAndFulfillWithWrongRequestId) {
482   EventLogger logger;
483   RequestObserver observer;
484   request_manager_->AddObserver(&observer);
485 
486   const int request_id = request_manager_->CreateRequest(
487       TESTING,
488       make_scoped_ptr<RequestManager::HandlerInterface>(
489           new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
490 
491   EXPECT_EQ(1, request_id);
492   EXPECT_EQ(0u, logger.success_events().size());
493   EXPECT_EQ(0u, logger.error_events().size());
494 
495   ASSERT_EQ(1u, observer.created().size());
496   EXPECT_EQ(request_id, observer.created()[0].request_id());
497   EXPECT_EQ(TESTING, observer.created()[0].type());
498 
499   ASSERT_EQ(1u, observer.executed().size());
500   EXPECT_EQ(request_id, observer.executed()[0].request_id());
501 
502   scoped_ptr<RequestValue> response;
503   const bool has_more = true;
504 
505   const bool result = request_manager_->FulfillRequest(
506       request_id + 1, response.Pass(), has_more);
507   EXPECT_FALSE(result);
508 
509   // Callbacks should not be called.
510   EXPECT_EQ(0u, logger.error_events().size());
511   EXPECT_EQ(0u, logger.success_events().size());
512 
513   EXPECT_EQ(0u, observer.fulfilled().size());
514   EXPECT_EQ(request_id, observer.executed()[0].request_id());
515 
516   // Confirm, that the request hasn't been removed, by fulfilling it correctly.
517   {
518     const bool retry =
519         request_manager_->FulfillRequest(request_id, response.Pass(), has_more);
520     EXPECT_TRUE(retry);
521     EXPECT_EQ(1u, observer.fulfilled().size());
522   }
523 
524   request_manager_->RemoveObserver(&observer);
525 }
526 
TEST_F(FileSystemProviderRequestManagerTest,CreateAndRejectWithWrongRequestId)527 TEST_F(FileSystemProviderRequestManagerTest,
528        CreateAndRejectWithWrongRequestId) {
529   EventLogger logger;
530   RequestObserver observer;
531   request_manager_->AddObserver(&observer);
532 
533   const int request_id = request_manager_->CreateRequest(
534       TESTING,
535       make_scoped_ptr<RequestManager::HandlerInterface>(
536           new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
537 
538   EXPECT_EQ(1, request_id);
539   EXPECT_EQ(0u, logger.success_events().size());
540   EXPECT_EQ(0u, logger.error_events().size());
541 
542   ASSERT_EQ(1u, observer.created().size());
543   EXPECT_EQ(request_id, observer.created()[0].request_id());
544   EXPECT_EQ(TESTING, observer.created()[0].type());
545 
546   ASSERT_EQ(1u, observer.executed().size());
547   EXPECT_EQ(request_id, observer.executed()[0].request_id());
548 
549   base::File::Error error = base::File::FILE_ERROR_NO_MEMORY;
550   bool result = request_manager_->RejectRequest(request_id + 1, error);
551   EXPECT_FALSE(result);
552 
553   // Callbacks should not be called.
554   EXPECT_EQ(0u, logger.error_events().size());
555   EXPECT_EQ(0u, logger.success_events().size());
556 
557   EXPECT_EQ(0u, observer.rejected().size());
558 
559   // Confirm, that the request hasn't been removed, by rejecting it correctly.
560   {
561     bool retry = request_manager_->RejectRequest(request_id, error);
562     EXPECT_TRUE(retry);
563     EXPECT_EQ(1u, observer.rejected().size());
564   }
565 
566   request_manager_->RemoveObserver(&observer);
567 }
568 
TEST_F(FileSystemProviderRequestManagerTest,UniqueIds)569 TEST_F(FileSystemProviderRequestManagerTest, UniqueIds) {
570   EventLogger logger;
571 
572   const int first_request_id = request_manager_->CreateRequest(
573       TESTING,
574       make_scoped_ptr<RequestManager::HandlerInterface>(
575           new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
576 
577   const int second_request_id = request_manager_->CreateRequest(
578       TESTING,
579       make_scoped_ptr<RequestManager::HandlerInterface>(
580           new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
581 
582   EXPECT_EQ(1, first_request_id);
583   EXPECT_EQ(2, second_request_id);
584 }
585 
TEST_F(FileSystemProviderRequestManagerTest,AbortOnDestroy)586 TEST_F(FileSystemProviderRequestManagerTest, AbortOnDestroy) {
587   EventLogger logger;
588   RequestObserver observer;
589   int request_id;
590 
591   {
592     RequestManager request_manager;
593     request_manager.AddObserver(&observer);
594 
595     request_id = request_manager.CreateRequest(
596         TESTING,
597         make_scoped_ptr<RequestManager::HandlerInterface>(
598             new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
599 
600     EXPECT_EQ(1, request_id);
601     EXPECT_EQ(0u, logger.success_events().size());
602     EXPECT_EQ(0u, logger.error_events().size());
603 
604     ASSERT_EQ(1u, observer.created().size());
605     EXPECT_EQ(request_id, observer.created()[0].request_id());
606     EXPECT_EQ(TESTING, observer.created()[0].type());
607 
608     ASSERT_EQ(1u, observer.executed().size());
609     EXPECT_EQ(request_id, observer.executed()[0].request_id());
610 
611     EXPECT_EQ(0u, observer.fulfilled().size());
612     EXPECT_EQ(0u, observer.rejected().size());
613     EXPECT_EQ(0u, observer.destroyed().size());
614     EXPECT_EQ(0u, observer.timeouted().size());
615 
616     // Do not remove the observer, to catch events while destructing.
617   }
618 
619   // All active requests should be aborted in the destructor of RequestManager.
620   ASSERT_EQ(1u, logger.error_events().size());
621   EventLogger::ErrorEvent* event = logger.error_events()[0];
622   EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error());
623 
624   EXPECT_EQ(0u, logger.success_events().size());
625 
626   EXPECT_EQ(0u, observer.fulfilled().size());
627   EXPECT_EQ(0u, observer.timeouted().size());
628   ASSERT_EQ(1u, observer.rejected().size());
629   EXPECT_EQ(request_id, observer.rejected()[0].request_id());
630   EXPECT_EQ(base::File::FILE_ERROR_ABORT, observer.rejected()[0].error());
631   ASSERT_EQ(1u, observer.destroyed().size());
632 }
633 
TEST_F(FileSystemProviderRequestManagerTest,AbortOnTimeout)634 TEST_F(FileSystemProviderRequestManagerTest, AbortOnTimeout) {
635   EventLogger logger;
636   RequestObserver observer;
637   request_manager_->AddObserver(&observer);
638 
639   request_manager_->SetTimeoutForTesting(base::TimeDelta::FromSeconds(0));
640   const int request_id = request_manager_->CreateRequest(
641       TESTING,
642       make_scoped_ptr<RequestManager::HandlerInterface>(
643           new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
644   EXPECT_EQ(1, request_id);
645   EXPECT_EQ(0u, logger.success_events().size());
646   EXPECT_EQ(0u, logger.error_events().size());
647 
648   ASSERT_EQ(1u, observer.created().size());
649   EXPECT_EQ(request_id, observer.created()[0].request_id());
650   EXPECT_EQ(TESTING, observer.created()[0].type());
651 
652   ASSERT_EQ(1u, observer.executed().size());
653   EXPECT_EQ(request_id, observer.executed()[0].request_id());
654 
655   // Wait until the request is timeouted.
656   base::RunLoop().RunUntilIdle();
657 
658   ASSERT_EQ(1u, logger.error_events().size());
659   EventLogger::ErrorEvent* event = logger.error_events()[0];
660   EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error());
661 
662   ASSERT_EQ(1u, observer.rejected().size());
663   EXPECT_EQ(request_id, observer.rejected()[0].request_id());
664   EXPECT_EQ(base::File::FILE_ERROR_ABORT, observer.rejected()[0].error());
665   ASSERT_EQ(1u, observer.timeouted().size());
666   EXPECT_EQ(request_id, observer.timeouted()[0].request_id());
667   ASSERT_EQ(1u, observer.destroyed().size());
668   EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
669 
670   request_manager_->RemoveObserver(&observer);
671 }
672 
673 }  // namespace file_system_provider
674 }  // namespace chromeos
675