1 // Copyright (c) 2012 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 "sync/js/sync_js_controller.h"
7 #include "base/message_loop/message_loop.h"
8 #include "base/values.h"
9 #include "sync/js/js_arg_list.h"
10 #include "sync/js/js_event_details.h"
11 #include "sync/js/js_test_util.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
19 using ::testing::InSequence
;
20 using ::testing::Mock
;
21 using ::testing::StrictMock
;
23 class SyncJsControllerTest
: public testing::Test
{
26 message_loop_
.RunUntilIdle();
30 base::MessageLoop message_loop_
;
33 ACTION_P(ReplyToMessage
, reply_name
) {
34 arg2
.Call(FROM_HERE
, &JsReplyHandler::HandleJsReply
, reply_name
, JsArgList());
37 TEST_F(SyncJsControllerTest
, Messages
) {
39 // |mock_backend| needs to outlive |sync_js_controller|.
40 StrictMock
<MockJsBackend
> mock_backend
;
41 StrictMock
<MockJsReplyHandler
> mock_reply_handler
;
42 SyncJsController sync_js_controller
;
44 base::ListValue arg_list1
, arg_list2
;
45 arg_list1
.Append(new base::FundamentalValue(false));
46 arg_list2
.Append(new base::FundamentalValue(5));
47 JsArgList
args1(&arg_list1
), args2(&arg_list2
);
49 EXPECT_CALL(mock_backend
, SetJsEventHandler(_
));
50 EXPECT_CALL(mock_backend
, ProcessJsMessage("test1", HasArgs(args2
), _
))
51 .WillOnce(ReplyToMessage("test1_reply"));
52 EXPECT_CALL(mock_backend
, ProcessJsMessage("test2", HasArgs(args1
), _
))
53 .WillOnce(ReplyToMessage("test2_reply"));
55 sync_js_controller
.AttachJsBackend(mock_backend
.AsWeakHandle());
56 sync_js_controller
.ProcessJsMessage("test1",
58 mock_reply_handler
.AsWeakHandle());
59 sync_js_controller
.ProcessJsMessage("test2",
61 mock_reply_handler
.AsWeakHandle());
63 // The replies should be waiting on our message loop.
64 EXPECT_CALL(mock_reply_handler
, HandleJsReply("test1_reply", _
));
65 EXPECT_CALL(mock_reply_handler
, HandleJsReply("test2_reply", _
));
68 // Let destructor of |sync_js_controller| call RemoveBackend().
71 TEST_F(SyncJsControllerTest
, QueuedMessages
) {
72 // |mock_backend| needs to outlive |sync_js_controller|.
73 StrictMock
<MockJsBackend
> mock_backend
;
74 StrictMock
<MockJsReplyHandler
> mock_reply_handler
;
75 SyncJsController sync_js_controller
;
77 base::ListValue arg_list1
, arg_list2
;
78 arg_list1
.Append(new base::FundamentalValue(false));
79 arg_list2
.Append(new base::FundamentalValue(5));
80 JsArgList
args1(&arg_list1
), args2(&arg_list2
);
82 // Should queue messages.
83 sync_js_controller
.ProcessJsMessage(
86 mock_reply_handler
.AsWeakHandle());
87 sync_js_controller
.ProcessJsMessage(
90 mock_reply_handler
.AsWeakHandle());
94 Mock::VerifyAndClearExpectations(&mock_backend
);
97 // Should call the queued messages.
98 EXPECT_CALL(mock_backend
, SetJsEventHandler(_
));
99 EXPECT_CALL(mock_backend
, ProcessJsMessage("test1", HasArgs(args2
), _
))
100 .WillOnce(ReplyToMessage("test1_reply"));
101 EXPECT_CALL(mock_backend
, ProcessJsMessage("test2", HasArgs(args1
), _
))
102 .WillOnce(ReplyToMessage("test2_reply"));
103 EXPECT_CALL(mock_reply_handler
, HandleJsReply("test1_reply", _
));
104 EXPECT_CALL(mock_reply_handler
, HandleJsReply("test2_reply", _
));
106 sync_js_controller
.AttachJsBackend(mock_backend
.AsWeakHandle());
109 // Should do nothing.
110 sync_js_controller
.AttachJsBackend(WeakHandle
<JsBackend
>());
113 // Should also do nothing.
114 sync_js_controller
.AttachJsBackend(WeakHandle
<JsBackend
>());
118 TEST_F(SyncJsControllerTest
, Events
) {
120 SyncJsController sync_js_controller
;
122 base::DictionaryValue details_dict1
, details_dict2
;
123 details_dict1
.SetString("foo", "bar");
124 details_dict2
.SetInteger("baz", 5);
125 JsEventDetails
details1(&details_dict1
), details2(&details_dict2
);
127 StrictMock
<MockJsEventHandler
> event_handler1
, event_handler2
;
128 EXPECT_CALL(event_handler1
, HandleJsEvent("event", HasDetails(details1
)));
129 EXPECT_CALL(event_handler2
, HandleJsEvent("event", HasDetails(details1
)));
130 EXPECT_CALL(event_handler1
,
131 HandleJsEvent("anotherevent", HasDetails(details2
)));
132 EXPECT_CALL(event_handler2
,
133 HandleJsEvent("anotherevent", HasDetails(details2
)));
135 sync_js_controller
.AddJsEventHandler(&event_handler1
);
136 sync_js_controller
.AddJsEventHandler(&event_handler2
);
137 sync_js_controller
.HandleJsEvent("event", details1
);
138 sync_js_controller
.HandleJsEvent("anotherevent", details2
);
139 sync_js_controller
.RemoveJsEventHandler(&event_handler1
);
140 sync_js_controller
.RemoveJsEventHandler(&event_handler2
);
141 sync_js_controller
.HandleJsEvent("droppedevent", details2
);
147 } // namespace syncer