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

Side by Side Diff: mojo/public/cpp/bindings/tests/router_unittest.cc

Issue 2064903002: Mojo: Report bindings validation errors via MojoNotifyBadMessage (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/public/cpp/bindings/lib/router.h" 5 #include "mojo/public/cpp/bindings/lib/router.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 base::ThreadTaskRunnerHandle::Get()); 42 base::ThreadTaskRunnerHandle::Get());
43 internal::Router router1(std::move(handle1_), internal::FilterChain(), false, 43 internal::Router router1(std::move(handle1_), internal::FilterChain(), false,
44 base::ThreadTaskRunnerHandle::Get()); 44 base::ThreadTaskRunnerHandle::Get());
45 45
46 ResponseGenerator generator; 46 ResponseGenerator generator;
47 router1.set_incoming_receiver(&generator); 47 router1.set_incoming_receiver(&generator);
48 48
49 Message request; 49 Message request;
50 AllocRequestMessage(1, "hello", &request); 50 AllocRequestMessage(1, "hello", &request);
51 51
52 Error error;
52 MessageQueue message_queue; 53 MessageQueue message_queue;
53 base::RunLoop run_loop; 54 base::RunLoop run_loop;
54 router0.AcceptWithResponder( 55 router0.AcceptWithResponder(
55 &request, new MessageAccumulator(&message_queue, run_loop.QuitClosure())); 56 &request, new MessageAccumulator(&message_queue, run_loop.QuitClosure()),
57 &error);
56 58
57 run_loop.Run(); 59 run_loop.Run();
58 60
59 EXPECT_FALSE(message_queue.IsEmpty()); 61 EXPECT_FALSE(message_queue.IsEmpty());
60 62
61 Message response; 63 Message response;
62 message_queue.Pop(&response); 64 message_queue.Pop(&response);
63 65
64 EXPECT_EQ(std::string("hello world!"), 66 EXPECT_EQ(std::string("hello world!"),
65 std::string(reinterpret_cast<const char*>(response.payload()))); 67 std::string(reinterpret_cast<const char*>(response.payload())));
66 68
67 // Send a second message on the pipe. 69 // Send a second message on the pipe.
68 Message request2; 70 Message request2;
69 AllocRequestMessage(1, "hello again", &request2); 71 AllocRequestMessage(1, "hello again", &request2);
70 72
71 base::RunLoop run_loop2; 73 base::RunLoop run_loop2;
72 router0.AcceptWithResponder( 74 router0.AcceptWithResponder(
73 &request2, 75 &request2,
74 new MessageAccumulator(&message_queue, run_loop2.QuitClosure())); 76 new MessageAccumulator(&message_queue, run_loop2.QuitClosure()),
77 &error);
75 78
76 run_loop2.Run(); 79 run_loop2.Run();
77 80
78 EXPECT_FALSE(message_queue.IsEmpty()); 81 EXPECT_FALSE(message_queue.IsEmpty());
79 82
80 message_queue.Pop(&response); 83 message_queue.Pop(&response);
81 84
82 EXPECT_EQ(std::string("hello again world!"), 85 EXPECT_EQ(std::string("hello again world!"),
83 std::string(reinterpret_cast<const char*>(response.payload()))); 86 std::string(reinterpret_cast<const char*>(response.payload())));
84 } 87 }
85 88
86 TEST_F(RouterTest, BasicRequestResponse_Synchronous) { 89 TEST_F(RouterTest, BasicRequestResponse_Synchronous) {
87 internal::Router router0(std::move(handle0_), internal::FilterChain(), false, 90 internal::Router router0(std::move(handle0_), internal::FilterChain(), false,
88 base::ThreadTaskRunnerHandle::Get()); 91 base::ThreadTaskRunnerHandle::Get());
89 internal::Router router1(std::move(handle1_), internal::FilterChain(), false, 92 internal::Router router1(std::move(handle1_), internal::FilterChain(), false,
90 base::ThreadTaskRunnerHandle::Get()); 93 base::ThreadTaskRunnerHandle::Get());
91 94
92 ResponseGenerator generator; 95 ResponseGenerator generator;
93 router1.set_incoming_receiver(&generator); 96 router1.set_incoming_receiver(&generator);
94 97
95 Message request; 98 Message request;
96 AllocRequestMessage(1, "hello", &request); 99 AllocRequestMessage(1, "hello", &request);
97 100
101 Error error;
98 MessageQueue message_queue; 102 MessageQueue message_queue;
99 router0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue)); 103 router0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue),
104 &error);
100 105
101 router1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 106 router1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
102 router0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 107 router0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
103 108
104 EXPECT_FALSE(message_queue.IsEmpty()); 109 EXPECT_FALSE(message_queue.IsEmpty());
105 110
106 Message response; 111 Message response;
107 message_queue.Pop(&response); 112 message_queue.Pop(&response);
108 113
109 EXPECT_EQ(std::string("hello world!"), 114 EXPECT_EQ(std::string("hello world!"),
110 std::string(reinterpret_cast<const char*>(response.payload()))); 115 std::string(reinterpret_cast<const char*>(response.payload())));
111 116
112 // Send a second message on the pipe. 117 // Send a second message on the pipe.
113 Message request2; 118 Message request2;
114 AllocRequestMessage(1, "hello again", &request2); 119 AllocRequestMessage(1, "hello again", &request2);
115 120
116 router0.AcceptWithResponder(&request2, 121 router0.AcceptWithResponder(&request2,
117 new MessageAccumulator(&message_queue)); 122 new MessageAccumulator(&message_queue), &error);
118 123
119 router1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 124 router1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
120 router0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 125 router0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
121 126
122 EXPECT_FALSE(message_queue.IsEmpty()); 127 EXPECT_FALSE(message_queue.IsEmpty());
123 128
124 message_queue.Pop(&response); 129 message_queue.Pop(&response);
125 130
126 EXPECT_EQ(std::string("hello again world!"), 131 EXPECT_EQ(std::string("hello again world!"),
127 std::string(reinterpret_cast<const char*>(response.payload()))); 132 std::string(reinterpret_cast<const char*>(response.payload())));
128 } 133 }
129 134
130 TEST_F(RouterTest, RequestWithNoReceiver) { 135 TEST_F(RouterTest, RequestWithNoReceiver) {
131 internal::Router router0(std::move(handle0_), internal::FilterChain(), false, 136 internal::Router router0(std::move(handle0_), internal::FilterChain(), false,
132 base::ThreadTaskRunnerHandle::Get()); 137 base::ThreadTaskRunnerHandle::Get());
133 internal::Router router1(std::move(handle1_), internal::FilterChain(), false, 138 internal::Router router1(std::move(handle1_), internal::FilterChain(), false,
134 base::ThreadTaskRunnerHandle::Get()); 139 base::ThreadTaskRunnerHandle::Get());
135 140
136 // Without an incoming receiver set on router1, we expect router0 to observe 141 // Without an incoming receiver set on router1, we expect router0 to observe
137 // an error as a result of sending a message. 142 // an error as a result of sending a message.
138 143
139 Message request; 144 Message request;
140 AllocRequestMessage(1, "hello", &request); 145 AllocRequestMessage(1, "hello", &request);
141 146
147 Error error;
142 MessageQueue message_queue; 148 MessageQueue message_queue;
143 base::RunLoop run_loop, run_loop2; 149 base::RunLoop run_loop, run_loop2;
144 router0.set_connection_error_handler(run_loop.QuitClosure()); 150 router0.set_connection_error_handler(run_loop.QuitClosure());
145 router1.set_connection_error_handler(run_loop2.QuitClosure()); 151 router1.set_connection_error_handler(run_loop2.QuitClosure());
146 router0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue)); 152 router0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue),
153 &error);
147 154
148 run_loop.Run(); 155 run_loop.Run();
149 run_loop2.Run(); 156 run_loop2.Run();
150 157
151 EXPECT_TRUE(router0.encountered_error()); 158 EXPECT_TRUE(router0.encountered_error());
152 EXPECT_TRUE(router1.encountered_error()); 159 EXPECT_TRUE(router1.encountered_error());
153 EXPECT_TRUE(message_queue.IsEmpty()); 160 EXPECT_TRUE(message_queue.IsEmpty());
154 } 161 }
155 162
156 // Tests Router using the LazyResponseGenerator. The responses will not be 163 // Tests Router using the LazyResponseGenerator. The responses will not be
157 // sent until after the requests have been accepted. 164 // sent until after the requests have been accepted.
158 TEST_F(RouterTest, LazyResponses) { 165 TEST_F(RouterTest, LazyResponses) {
159 internal::Router router0(std::move(handle0_), internal::FilterChain(), false, 166 internal::Router router0(std::move(handle0_), internal::FilterChain(), false,
160 base::ThreadTaskRunnerHandle::Get()); 167 base::ThreadTaskRunnerHandle::Get());
161 internal::Router router1(std::move(handle1_), internal::FilterChain(), false, 168 internal::Router router1(std::move(handle1_), internal::FilterChain(), false,
162 base::ThreadTaskRunnerHandle::Get()); 169 base::ThreadTaskRunnerHandle::Get());
163 170
164 base::RunLoop run_loop; 171 base::RunLoop run_loop;
165 LazyResponseGenerator generator(run_loop.QuitClosure()); 172 LazyResponseGenerator generator(run_loop.QuitClosure());
166 router1.set_incoming_receiver(&generator); 173 router1.set_incoming_receiver(&generator);
167 174
168 Message request; 175 Message request;
169 AllocRequestMessage(1, "hello", &request); 176 AllocRequestMessage(1, "hello", &request);
170 177
178 Error error;
171 MessageQueue message_queue; 179 MessageQueue message_queue;
172 base::RunLoop run_loop2; 180 base::RunLoop run_loop2;
173 router0.AcceptWithResponder( 181 router0.AcceptWithResponder(
174 &request, 182 &request,
175 new MessageAccumulator(&message_queue, run_loop2.QuitClosure())); 183 new MessageAccumulator(&message_queue, run_loop2.QuitClosure()), &error);
176 run_loop.Run(); 184 run_loop.Run();
177 185
178 // The request has been received but the response has not been sent yet. 186 // The request has been received but the response has not been sent yet.
179 EXPECT_TRUE(message_queue.IsEmpty()); 187 EXPECT_TRUE(message_queue.IsEmpty());
180 188
181 // Send the response. 189 // Send the response.
182 EXPECT_TRUE(generator.responder_is_valid()); 190 EXPECT_TRUE(generator.responder_is_valid());
183 generator.CompleteWithResponse(); 191 generator.CompleteWithResponse();
184 run_loop2.Run(); 192 run_loop2.Run();
185 193
186 // Check the response. 194 // Check the response.
187 EXPECT_FALSE(message_queue.IsEmpty()); 195 EXPECT_FALSE(message_queue.IsEmpty());
188 Message response; 196 Message response;
189 message_queue.Pop(&response); 197 message_queue.Pop(&response);
190 EXPECT_EQ(std::string("hello world!"), 198 EXPECT_EQ(std::string("hello world!"),
191 std::string(reinterpret_cast<const char*>(response.payload()))); 199 std::string(reinterpret_cast<const char*>(response.payload())));
192 200
193 // Send a second message on the pipe. 201 // Send a second message on the pipe.
194 base::RunLoop run_loop3; 202 base::RunLoop run_loop3;
195 LazyResponseGenerator generator2(run_loop3.QuitClosure()); 203 LazyResponseGenerator generator2(run_loop3.QuitClosure());
196 204
197 router1.set_incoming_receiver(&generator2); 205 router1.set_incoming_receiver(&generator2);
198 Message request2; 206 Message request2;
199 AllocRequestMessage(1, "hello again", &request2); 207 AllocRequestMessage(1, "hello again", &request2);
200 208
201 base::RunLoop run_loop4; 209 base::RunLoop run_loop4;
202 router0.AcceptWithResponder( 210 router0.AcceptWithResponder(
203 &request2, 211 &request2,
204 new MessageAccumulator(&message_queue, run_loop4.QuitClosure())); 212 new MessageAccumulator(&message_queue, run_loop4.QuitClosure()), &error);
205 run_loop3.Run(); 213 run_loop3.Run();
206 214
207 // The request has been received but the response has not been sent yet. 215 // The request has been received but the response has not been sent yet.
208 EXPECT_TRUE(message_queue.IsEmpty()); 216 EXPECT_TRUE(message_queue.IsEmpty());
209 217
210 // Send the second response. 218 // Send the second response.
211 EXPECT_TRUE(generator2.responder_is_valid()); 219 EXPECT_TRUE(generator2.responder_is_valid());
212 generator2.CompleteWithResponse(); 220 generator2.CompleteWithResponse();
213 run_loop4.Run(); 221 run_loop4.Run();
214 222
(...skipping 28 matching lines...) Expand all
243 }); 251 });
244 252
245 base::RunLoop run_loop3; 253 base::RunLoop run_loop3;
246 LazyResponseGenerator generator(run_loop3.QuitClosure()); 254 LazyResponseGenerator generator(run_loop3.QuitClosure());
247 router1.set_incoming_receiver(&generator); 255 router1.set_incoming_receiver(&generator);
248 router1.set_incoming_receiver(&generator); 256 router1.set_incoming_receiver(&generator);
249 257
250 Message request; 258 Message request;
251 AllocRequestMessage(1, "hello", &request); 259 AllocRequestMessage(1, "hello", &request);
252 260
261 Error error;
253 MessageQueue message_queue; 262 MessageQueue message_queue;
254 router0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue)); 263 router0.AcceptWithResponder(&request, new MessageAccumulator(&message_queue),
264 &error);
255 run_loop3.Run(); 265 run_loop3.Run();
256 266
257 // The request has been received but no response has been sent. 267 // The request has been received but no response has been sent.
258 EXPECT_TRUE(message_queue.IsEmpty()); 268 EXPECT_TRUE(message_queue.IsEmpty());
259 269
260 // Destroy the responder MessagerReceiver but don't send any response. 270 // Destroy the responder MessagerReceiver but don't send any response.
261 generator.CompleteWithoutResponse(); 271 generator.CompleteWithoutResponse();
262 run_loop0.Run(); 272 run_loop0.Run();
263 run_loop1.Run(); 273 run_loop1.Run();
264 274
(...skipping 24 matching lines...) Expand all
289 internal::Router router0(std::move(handle0_), internal::FilterChain(), 299 internal::Router router0(std::move(handle0_), internal::FilterChain(),
290 false, base::ThreadTaskRunnerHandle::Get()); 300 false, base::ThreadTaskRunnerHandle::Get());
291 internal::Router router1(std::move(handle1_), internal::FilterChain(), 301 internal::Router router1(std::move(handle1_), internal::FilterChain(),
292 false, base::ThreadTaskRunnerHandle::Get()); 302 false, base::ThreadTaskRunnerHandle::Get());
293 303
294 router1.set_incoming_receiver(&generator); 304 router1.set_incoming_receiver(&generator);
295 305
296 Message request; 306 Message request;
297 AllocRequestMessage(1, "hello", &request); 307 AllocRequestMessage(1, "hello", &request);
298 308
309 Error error;
299 MessageQueue message_queue; 310 MessageQueue message_queue;
300 router0.AcceptWithResponder(&request, 311 router0.AcceptWithResponder(&request,
301 new MessageAccumulator(&message_queue)); 312 new MessageAccumulator(&message_queue),
313 &error);
302 314
303 run_loop.Run(); 315 run_loop.Run();
304 316
305 EXPECT_TRUE(generator.has_responder()); 317 EXPECT_TRUE(generator.has_responder());
306 } 318 }
307 319
308 EXPECT_FALSE(generator.responder_is_valid()); 320 EXPECT_FALSE(generator.responder_is_valid());
309 generator.CompleteWithResponse(); // This should end up doing nothing. 321 generator.CompleteWithResponse(); // This should end up doing nothing.
310 } 322 }
311 323
312 } // namespace 324 } // namespace
313 } // namespace test 325 } // namespace test
314 } // namespace mojo 326 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698