Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(732)

Side by Side Diff: blimp/engine/browser/host_render_widget_message_processor_unittest.cc

Issue 1450423002: Add glue between the client and engine for Blimp (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@blimp_ipc2
Patch Set: Address comments! Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 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 "blimp/engine/browser/host_render_widget_message_processor.h"
6
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/numerics/safe_conversions.h"
10 #include "blimp/common/proto/blimp_message.pb.h"
11 #include "blimp/common/proto/compositor.pb.h"
12 #include "blimp/common/proto/render_widget.pb.h"
13 #include "blimp/net/input_message_generator.h"
14 #include "net/base/net_errors.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "third_party/WebKit/public/web/WebInputEvent.h"
18
19 using testing::_;
20 using testing::InvokeArgument;
21 using testing::Ref;
22 using testing::Return;
23 using testing::SaveArg;
24
25 namespace blimp {
26
27 namespace {
28 class MockBlimpMessageProcessor : public BlimpMessageProcessor {
29 public:
30 MockBlimpMessageProcessor() {}
31
32 ~MockBlimpMessageProcessor() override {}
33
34 // Adapts calls from ProcessMessage to MockableProcessMessage by
35 // unboxing the |message| scoped_ptr for GMock compatibility.
36 void ProcessMessage(scoped_ptr<BlimpMessage> message,
37 const net::CompletionCallback& callback) {
38 MockableProcessMessage(*message);
39 if (!callback.is_null())
40 callback.Run(net::OK);
41 }
42
43 MOCK_METHOD1(MockableProcessMessage,
44 void(const BlimpMessage& message));
45 };
46
47 class MockHostRenderWidgetMessageDelegate
48 : public HostRenderWidgetMessageProcessor::RenderWidgetMessageDelegate {
49 public:
50 // HostRenderWidgetMessageProcessor implementation.
51 void OnWebInputEvent(scoped_ptr<blink::WebInputEvent> event) override {
52 MockableOnWebInputEvent();
53 }
54
55 void OnCompositorMessageReceived(
56 const std::vector<uint8_t>& message) override {
57 MockableOnCompositorMessageReceived(message);
58 }
59
60 MOCK_METHOD0(MockableOnWebInputEvent, void());
61 MOCK_METHOD1(MockableOnCompositorMessageReceived,
62 void(const std::vector<uint8_t>& message));
63 };
64
65 MATCHER_P(CompMsgEquals, contents, "") {
66 if (contents.size() != arg.size())
67 return false;
68
69 return memcmp(contents.data(), arg.data(), contents.size()) == 0;
70 }
71
72 MATCHER_P3(BlimpCompMsgEquals, tab_id, rw_id, contents, "") {
73 if (contents.size() != arg.compositor().payload().size())
74 return false;
75
76 if (memcmp(contents.data(),
77 arg.compositor().payload().data(),
78 contents.size()) != 0) {
79 return false;
80 }
81
82 return arg.compositor().render_widget_id() == rw_id &&
83 arg.target_tab_id() == tab_id;
84 }
85
86 MATCHER_P2(BlimpRWMsgEquals, tab_id, rw_id, "") {
87 return arg.render_widget().render_widget_id() == rw_id &&
88 arg.target_tab_id() == tab_id;
89 }
90
91 void SendInputMessage(BlimpMessageProcessor* processor,
92 int tab_id,
93 uint32_t rw_id) {
94 scoped_ptr<BlimpMessage> message(new BlimpMessage);
95 message->set_type(BlimpMessage::INPUT);
96 message->set_target_tab_id(tab_id);
97
98 InputMessage* details = message->mutable_input();
99 details->set_render_widget_id(rw_id);
100
101 blink::WebGestureEvent input_event;
102 input_event.type = blink::WebInputEvent::Type::GestureTap;
103 InputMessageGenerator generator;
104 generator.GenerateMessage(&input_event, details);
105
106 processor->ProcessMessage(message.Pass(),
107 net::CompletionCallback());
108 }
109
110 void SendCompositorMessage(BlimpMessageProcessor* processor,
111 int tab_id,
112 uint32_t rw_id,
113 const std::vector<uint8_t>& payload) {
114 scoped_ptr<BlimpMessage> message(new BlimpMessage);
115 message->set_type(BlimpMessage::COMPOSITOR);
116 message->set_target_tab_id(tab_id);
117
118 CompositorMessage* details = message->mutable_compositor();
119 details->set_render_widget_id(rw_id);
120 details->set_payload(payload.data(), base::checked_cast<int>(payload.size()));
121 processor->ProcessMessage(message.Pass(),
122 net::CompletionCallback());
123 }
124
125 } // namespace
126
127 class HostRenderWidgetMessageProcessorTest : public testing::Test {
128 public:
129 HostRenderWidgetMessageProcessorTest()
130 : processor_(&out_processor_) {}
131
132 void SetUp() override {
133 processor_.SetDelegate(1, &delegate1_);
134 processor_.SetDelegate(2, &delegate2_);
135
136 processor_.OnRenderWidgetInitialized(1);
137 processor_.OnRenderWidgetInitialized(2);
138 }
139
140 protected:
141 MockBlimpMessageProcessor out_processor_;
142 MockHostRenderWidgetMessageDelegate delegate1_;
143 MockHostRenderWidgetMessageDelegate delegate2_;
144 HostRenderWidgetMessageProcessor processor_;
145 };
146
147 TEST_F(HostRenderWidgetMessageProcessorTest, DelegateCallsOK) {
148 std::vector<uint8_t> payload = { 'd', 'a', 'v', 'i', 'd' };
149
150 EXPECT_CALL(delegate1_, MockableOnCompositorMessageReceived(
151 CompMsgEquals(payload))).Times(1);
152 SendCompositorMessage(&processor_, 1, 1U, payload);
153
154 EXPECT_CALL(delegate1_, MockableOnWebInputEvent()).Times(1);
155 SendInputMessage(&processor_, 1, 1U);
156
157 EXPECT_CALL(delegate2_, MockableOnCompositorMessageReceived(
158 CompMsgEquals(payload))).Times(1);
159 SendCompositorMessage(&processor_, 2, 1U, payload);
160
161 EXPECT_CALL(delegate2_, MockableOnWebInputEvent()).Times(1);
162 SendInputMessage(&processor_, 2, 1U);
163 }
164
165 TEST_F(HostRenderWidgetMessageProcessorTest, DropsStaleMessages) {
166 std::vector<uint8_t> payload = { 'f', 'u', 'n' };
167
168 EXPECT_CALL(delegate1_, MockableOnCompositorMessageReceived(
169 CompMsgEquals(payload))).Times(1);
170 SendCompositorMessage(&processor_, 1, 1U, payload);
171
172 EXPECT_CALL(out_processor_,
173 MockableProcessMessage(BlimpRWMsgEquals(1, 2U))).Times(1);
174 processor_.OnRenderWidgetInitialized(1);
175
176 EXPECT_CALL(delegate1_, MockableOnCompositorMessageReceived(
177 CompMsgEquals(payload))).Times(0);
178 payload[0] = 'a';
179 SendCompositorMessage(&processor_, 1, 1U, payload);
180
181 EXPECT_CALL(delegate1_, MockableOnWebInputEvent()).Times(0);
182 SendInputMessage(&processor_, 1, 1U);
183
184 EXPECT_CALL(delegate1_, MockableOnCompositorMessageReceived(
185 CompMsgEquals(payload))).Times(1);
186 SendCompositorMessage(&processor_, 1, 2U, payload);
187
188 EXPECT_CALL(delegate1_, MockableOnWebInputEvent()).Times(1);
189 SendInputMessage(&processor_, 1, 2U);
190 }
191
192 TEST_F(HostRenderWidgetMessageProcessorTest, RepliesHaveCorrectRenderWidgetId) {
193 std::vector<uint8_t> payload = { 'a', 'b', 'c', 'd' };
194
195 EXPECT_CALL(out_processor_,
196 MockableProcessMessage(BlimpRWMsgEquals(1, 2U))).Times(1);
197 processor_.OnRenderWidgetInitialized(1);
198
199 EXPECT_CALL(out_processor_,
200 MockableProcessMessage(BlimpRWMsgEquals(2, 2U))).Times(1);
201 processor_.OnRenderWidgetInitialized(2);
202
203 EXPECT_CALL(out_processor_, MockableProcessMessage(
204 BlimpCompMsgEquals(1, 2U, payload))).Times(1);
205
206 processor_.SendCompositorMessage(1, payload);
207 }
208
209
210 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698