Home | History | Annotate | Download | only in sync
      1 // Copyright (c) 2011 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 "chrome/browser/sync/js_event_handler_list.h"
      6 
      7 #include "base/values.h"
      8 #include "chrome/browser/sync/js_arg_list.h"
      9 #include "chrome/browser/sync/js_test_util.h"
     10 #include "testing/gmock/include/gmock/gmock.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 namespace browser_sync {
     14 namespace {
     15 
     16 using ::testing::StrictMock;
     17 
     18 class JsEventHandlerListTest : public testing::Test {};
     19 
     20 TEST_F(JsEventHandlerListTest, Basic) {
     21   // |backend| must outlive |event_handlers|.
     22   StrictMock<MockJsBackend> backend;
     23 
     24   JsEventHandlerList event_handlers;
     25 
     26   ListValue arg_list1, arg_list2;
     27   arg_list1.Append(Value::CreateBooleanValue(false));
     28   arg_list2.Append(Value::CreateIntegerValue(5));
     29   JsArgList args1(arg_list1), args2(arg_list2);
     30 
     31   StrictMock<MockJsEventHandler> handler1, handler2;
     32 
     33   // Once from each call to AddHandler().
     34   EXPECT_CALL(backend, SetParentJsEventRouter(&event_handlers)).Times(2);
     35   // Once from the second RemoveHandler(), once from the destructor.
     36   EXPECT_CALL(backend, RemoveParentJsEventRouter()).Times(2);
     37   EXPECT_CALL(backend, ProcessMessage("test1", HasArgs(args2), &handler1));
     38   EXPECT_CALL(backend, ProcessMessage("test2", HasArgs(args1), &handler2));
     39 
     40   EXPECT_CALL(handler1, HandleJsEvent("reply1", HasArgs(args2)));
     41   EXPECT_CALL(handler1, HandleJsEvent("allreply", HasArgs(args1)));
     42 
     43   EXPECT_CALL(handler2, HandleJsEvent("reply2", HasArgs(args1)));
     44   EXPECT_CALL(handler2, HandleJsEvent("allreply", HasArgs(args1)));
     45   EXPECT_CALL(handler2, HandleJsEvent("anotherreply2", HasArgs(args2)));
     46   EXPECT_CALL(handler2, HandleJsEvent("anotherallreply", HasArgs(args2)));
     47 
     48   event_handlers.SetBackend(&backend);
     49 
     50   event_handlers.AddHandler(&handler1);
     51   event_handlers.AddHandler(&handler2);
     52 
     53   event_handlers.ProcessMessage("test1", args2, &handler1);
     54 
     55   event_handlers.RouteJsEvent("reply2", args1, &handler2);
     56   event_handlers.RouteJsEvent("reply1", args2, &handler1);
     57   event_handlers.RouteJsEvent("allreply", args1, NULL);
     58 
     59   event_handlers.RemoveHandler(&handler1);
     60 
     61   event_handlers.ProcessMessage("test2", args1, &handler2);
     62 
     63   event_handlers.RouteJsEvent("droppedreply1", args1, &handler1);
     64   event_handlers.RouteJsEvent("anotherreply2", args2, &handler2);
     65   event_handlers.RouteJsEvent("anotherallreply", args2, NULL);
     66 
     67   event_handlers.RemoveHandler(&handler2);
     68 
     69   event_handlers.RouteJsEvent("anotherdroppedreply1", args1, &handler1);
     70   event_handlers.RouteJsEvent("anotheranotherreply2", args2, &handler2);
     71   event_handlers.RouteJsEvent("droppedallreply", args2, NULL);
     72 
     73   // Let destructor of |event_handlers| call RemoveBackend().
     74 }
     75 
     76 TEST_F(JsEventHandlerListTest, QueuedMessages) {
     77   // |backend| must outlive |event_handlers|.
     78   StrictMock<MockJsBackend> backend;
     79 
     80   JsEventHandlerList event_handlers;
     81 
     82   ListValue arg_list1, arg_list2;
     83   arg_list1.Append(Value::CreateBooleanValue(false));
     84   arg_list2.Append(Value::CreateIntegerValue(5));
     85   JsArgList args1(arg_list1), args2(arg_list2);
     86 
     87   StrictMock<MockJsEventHandler> handler1, handler2;
     88 
     89   // Once from the call to SetBackend().
     90   EXPECT_CALL(backend, SetParentJsEventRouter(&event_handlers));
     91   // Once from the first call to RemoveBackend().
     92   EXPECT_CALL(backend, RemoveParentJsEventRouter());
     93   // Once from the call to SetBackend().
     94   EXPECT_CALL(backend, ProcessMessage("test1", HasArgs(args2), &handler1));
     95   // Once from the call to SetBackend().
     96   EXPECT_CALL(backend, ProcessMessage("test2", HasArgs(args1), &handler2));
     97 
     98   event_handlers.AddHandler(&handler1);
     99   event_handlers.AddHandler(&handler2);
    100 
    101   // Should queue messages.
    102   event_handlers.ProcessMessage("test1", args2, &handler1);
    103   event_handlers.ProcessMessage("test2", args1, &handler2);
    104 
    105   // Should call the queued messages.
    106   event_handlers.SetBackend(&backend);
    107 
    108   event_handlers.RemoveBackend();
    109   // Should do nothing.
    110   event_handlers.RemoveBackend();
    111 }
    112 
    113 }  // namespace
    114 }  // namespace browser_sync
    115