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