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 13namespace browser_sync { 14namespace { 15 16using ::testing::StrictMock; 17 18class JsEventHandlerListTest : public testing::Test {}; 19 20TEST_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 76TEST_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