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

Side by Side Diff: third_party/WebKit/LayoutTests/mojo/associated_interface_ptr.html

Issue 2832303002: Fifo order should be preserved for messages on associated interfaces. (Closed)
Patch Set: If target endpoint closed, discard cache message and connector resume processing incoming messages. Created 3 years, 7 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
« mojo/public/js/router.js ('K') | « mojo/public/js/router.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <script src="../resources/testharness.js"></script> 2 <script src="../resources/testharness.js"></script>
3 <script src="../resources/testharnessreport.js"></script> 3 <script src="../resources/testharnessreport.js"></script>
4 <script src="../resources/mojo-helpers.js"></script> 4 <script src="../resources/mojo-helpers.js"></script>
5 <script> 5 <script>
6 'use strict'; 6 'use strict';
7 7
8 setup({ explicit_done: true }); 8 setup({ explicit_done: true });
9 9
10 define([ 10 define([
11 "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom", 11 "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom",
12 "mojo/public/js/associated_bindings", 12 "mojo/public/js/associated_bindings",
13 "mojo/public/js/bindings", 13 "mojo/public/js/bindings",
14 ], function(testAssociatedInterfaces, associatedBindings, bindings) { 14 ], function(testAssociatedInterfaces, associatedBindings, bindings) {
15 15
16 function IntegerSenderImpl(callback) { 16 function SenderImpl(callback) {
17 this.callback = callback; 17 this.callback = callback;
18 } 18 }
19 19
20 IntegerSenderImpl.prototype.echo = function(value) { 20 SenderImpl.prototype.echo = function(value) {
21 return Promise.resolve({value: value}); 21 return Promise.resolve({value: value});
22 }; 22 };
23 23
24 IntegerSenderImpl.prototype.send = function(value) { 24 SenderImpl.prototype.send = function(value) {
25 if (this.callback) { 25 if (this.callback) {
26 this.callback(value); 26 this.callback(value);
27 } 27 }
28 }; 28 };
29 29
30 var IntegerSenderImpl = SenderImpl;
31 var StringSenderImpl = SenderImpl;
32
30 function IntegerSenderConnectionImpl() { 33 function IntegerSenderConnectionImpl() {
31 this.integerSenderBinding_ = null; 34 this.integerSenderBinding_ = null;
32 } 35 }
33 36
34 IntegerSenderConnectionImpl.prototype.getSender = function( 37 IntegerSenderConnectionImpl.prototype.getSender = function(
35 integerSenderRequest) { 38 integerSenderRequest) {
36 this.integerSenderBinding_ = new associatedBindings.AssociatedBinding( 39 this.integerSenderBinding_ = new associatedBindings.AssociatedBinding(
37 testAssociatedInterfaces.IntegerSender, 40 testAssociatedInterfaces.IntegerSender,
38 new IntegerSenderImpl(), 41 new IntegerSenderImpl(),
39 integerSenderRequest); 42 integerSenderRequest);
(...skipping 11 matching lines...) Expand all
51 function IntegerSenderConnectionAtBothEndsImpl() { 54 function IntegerSenderConnectionAtBothEndsImpl() {
52 this.integerSender_ = null; 55 this.integerSender_ = null;
53 } 56 }
54 57
55 IntegerSenderConnectionAtBothEndsImpl.prototype.getSender = 58 IntegerSenderConnectionAtBothEndsImpl.prototype.getSender =
56 IntegerSenderConnectionImpl.prototype.getSender; 59 IntegerSenderConnectionImpl.prototype.getSender;
57 60
58 IntegerSenderConnectionAtBothEndsImpl.prototype.setSender = function( 61 IntegerSenderConnectionAtBothEndsImpl.prototype.setSender = function(
59 integerSenderPtrInfo) { 62 integerSenderPtrInfo) {
60 this.integerSender_ = new 63 this.integerSender_ = new
61 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 64 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
62 this.integerSender_.ptr.bind(integerSenderPtrInfo); 65 integerSenderPtrInfo);
63 return this.integerSender_.echo(456); 66 return this.integerSender_.echo(456);
64 }; 67 };
65 68
66 function IntegerSenderConnectionImplWithConnectionError() { 69 function IntegerSenderConnectionImplWithConnectionError() {
67 this.integerSenderBinding_ = null; 70 this.integerSenderBinding_ = null;
68 } 71 }
69 72
70 IntegerSenderConnectionImplWithConnectionError.prototype.getSender = 73 IntegerSenderConnectionImplWithConnectionError.prototype.getSender =
71 function(integerSenderRequest) { 74 function(integerSenderRequest) {
72 this.integerSenderBinding_ = new associatedBindings.AssociatedBinding( 75 this.integerSenderBinding_ = new associatedBindings.AssociatedBinding(
73 testAssociatedInterfaces.IntegerSender, 76 testAssociatedInterfaces.IntegerSender,
74 new IntegerSenderImpl(), 77 new IntegerSenderImpl(),
75 integerSenderRequest); 78 integerSenderRequest);
76 this.integerSenderBinding_.closeWithReason( 79 this.integerSenderBinding_.closeWithReason(
77 {custom_reason: 42, description: 'hey'}); 80 {custom_reason: 42, description: 'hey'});
78 }; 81 };
79 82
83 function SenderConnectionBindLaterImpl(callbacks = []) {
yzshen1 2017/04/26 16:40:00 It seems easier to read if we use two parameters "
wangjimmy 2017/04/26 17:54:07 Done.
84 this.callbacks = callbacks;
85 this.integerSenderBinding_ = null;
86 this.stringSenderBinding_ = null;
87 }
88
89 SenderConnectionBindLaterImpl.prototype.getIntegerSender =
90 function(integerSenderRequest) {
91 setTimeout(() => {
92 this.integerSenderBinding_ = new associatedBindings.AssociatedBinding(
93 testAssociatedInterfaces.IntegerSender,
94 new IntegerSenderImpl(this.callbacks[0]),
95 integerSenderRequest);
96 }, 0);
97 };
98
99 SenderConnectionBindLaterImpl.prototype.getStringSender =
100 function(stringSenderRequest) {
101 this.stringSenderBinding_ = new associatedBindings.AssociatedBinding(
102 testAssociatedInterfaces.StringSender,
103 new StringSenderImpl(this.callbacks[1]),
104 stringSenderRequest);
105 };
106
107 function SenderConnectionImpl(callbacks = []) {
108 this.callbacks = callbacks;
109 this.integerSenderBinding_ = null;
110 this.stringSenderBinding_ = null;
111 }
112
113 SenderConnectionImpl.prototype.getIntegerSender =
114 function(integerSenderRequest) {
115 this.integerSenderBinding_ = new associatedBindings.AssociatedBinding(
116 testAssociatedInterfaces.IntegerSender,
117 new IntegerSenderImpl(this.callbacks[0]),
118 integerSenderRequest);
119 };
120
121 SenderConnectionImpl.prototype.getStringSender =
122 function(stringSenderRequest) {
123 this.stringSenderBinding_ = new associatedBindings.AssociatedBinding(
124 testAssociatedInterfaces.StringSender,
125 new StringSenderImpl(this.callbacks[1]),
126 stringSenderRequest);
127 };
128
80 promise_test(async () => { 129 promise_test(async () => {
81 var integerSenderConnection = new 130 var integerSenderConnection = new
82 testAssociatedInterfaces.IntegerSenderConnectionPtr(); 131 testAssociatedInterfaces.IntegerSenderConnectionPtr();
83 var integerSenderConnectionBinding = new bindings.Binding( 132 var integerSenderConnectionBinding = new bindings.Binding(
84 testAssociatedInterfaces.IntegerSenderConnection, 133 testAssociatedInterfaces.IntegerSenderConnection,
85 new IntegerSenderConnectionImpl(), 134 new IntegerSenderConnectionImpl(),
86 bindings.makeRequest(integerSenderConnection)); 135 bindings.makeRequest(integerSenderConnection));
87 136
88 // Sending AssociatedInterfaceRequest. 137 // Sending AssociatedInterfaceRequest.
89 var integerSenderPtrInfo0 = new 138 var integerSenderPtrInfo0 = new
90 associatedBindings.AssociatedInterfacePtrInfo(); 139 associatedBindings.AssociatedInterfacePtrInfo();
91 var integerSenderRequest0 = associatedBindings.makeRequest( 140 var integerSenderRequest0 = associatedBindings.makeRequest(
92 integerSenderPtrInfo0); 141 integerSenderPtrInfo0);
93 142
94 var integerSender0 = new 143 var integerSender0 = new
95 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 144 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
96 integerSender0.ptr.bind(integerSenderPtrInfo0); 145 integerSenderPtrInfo0);
97 146
98 integerSenderConnection.getSender(integerSenderRequest0); 147 integerSenderConnection.getSender(integerSenderRequest0);
99 assert_equals((await integerSender0.echo(123)).value, 123); 148 assert_equals((await integerSender0.echo(123)).value, 123);
100 149
101 // Recieving AssociatedInterfacePtrInfo. 150 // Recieving AssociatedInterfacePtrInfo.
102 var integerSenderPtrInfo1 = 151 var integerSenderPtrInfo1 =
103 (await integerSenderConnection.asyncGetSender()).sender; 152 (await integerSenderConnection.asyncGetSender()).sender;
104 var integerSender1 = new 153 var integerSender1 = new
105 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 154 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
106 integerSender1.ptr.bind(integerSenderPtrInfo1); 155 integerSenderPtrInfo1);
107 assert_equals((await integerSender1.echo(456)).value, 456); 156 assert_equals((await integerSender1.echo(456)).value, 456);
108 }, 'pass associated interfaces'); 157 }, 'pass associated interfaces');
109 158
110 // Bind to the same pipe two associated interfaces, whose implementation 159 // Bind to the same pipe two associated interfaces, whose implementation
111 // lives at different ends. Test that the two don't interfere. 160 // lives at different ends. Test that the two don't interfere.
112 promise_test(async () => { 161 promise_test(async () => {
113 var integerSenderConnectionAtBothEnds = new 162 var integerSenderConnectionAtBothEnds = new
114 testAssociatedInterfaces.IntegerSenderConnectionAtBothEndsPtr(); 163 testAssociatedInterfaces.IntegerSenderConnectionAtBothEndsPtr();
115 var integerSenderConnectionAtBothEndsBinding = new bindings.Binding( 164 var integerSenderConnectionAtBothEndsBinding = new bindings.Binding(
116 testAssociatedInterfaces.IntegerSenderConnectionAtBothEnds, 165 testAssociatedInterfaces.IntegerSenderConnectionAtBothEnds,
117 new IntegerSenderConnectionAtBothEndsImpl(), 166 new IntegerSenderConnectionAtBothEndsImpl(),
118 bindings.makeRequest(integerSenderConnectionAtBothEnds)); 167 bindings.makeRequest(integerSenderConnectionAtBothEnds));
119 168
120 // Associated Interface whose Binding Impl lives on the other side. 169 // Associated Interface whose Binding Impl lives on the other side.
121 // Sending AssociatedInterfaceRequest. 170 // Sending AssociatedInterfaceRequest.
122 var integerSenderPtrInfo0 = new 171 var integerSenderPtrInfo0 = new
123 associatedBindings.AssociatedInterfacePtrInfo(); 172 associatedBindings.AssociatedInterfacePtrInfo();
124 var integerSenderRequest0 = associatedBindings.makeRequest( 173 var integerSenderRequest0 = associatedBindings.makeRequest(
125 integerSenderPtrInfo0); 174 integerSenderPtrInfo0);
126 175
127 var integerSender0 = new 176 var integerSender0 = new
128 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 177 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
129 integerSender0.ptr.bind(integerSenderPtrInfo0); 178 integerSenderPtrInfo0);
130 179
131 integerSenderConnectionAtBothEnds.getSender(integerSenderRequest0); 180 integerSenderConnectionAtBothEnds.getSender(integerSenderRequest0);
132 assert_equals((await integerSender0.echo(123)).value, 123); 181 assert_equals((await integerSender0.echo(123)).value, 123);
133 182
134 // Associated Interface whose Binding Impl lives on this side. 183 // Associated Interface whose Binding Impl lives on this side.
135 // Sending AssociatedInterfacePtrInfo. 184 // Sending AssociatedInterfacePtrInfo.
136 var integerSenderPtrInfo1 = new 185 var integerSenderPtrInfo1 = new
137 associatedBindings.AssociatedInterfacePtrInfo(); 186 associatedBindings.AssociatedInterfacePtrInfo();
138 var integerSenderRequest1 = associatedBindings.makeRequest( 187 var integerSenderRequest1 = associatedBindings.makeRequest(
139 integerSenderPtrInfo1); 188 integerSenderPtrInfo1);
(...skipping 15 matching lines...) Expand all
155 new IntegerSenderConnectionImplWithConnectionError(), 204 new IntegerSenderConnectionImplWithConnectionError(),
156 bindings.makeRequest(integerSenderConnection)); 205 bindings.makeRequest(integerSenderConnection));
157 206
158 // Sending AssociatedInterfaceRequest. 207 // Sending AssociatedInterfaceRequest.
159 var integerSenderPtrInfo0 = new 208 var integerSenderPtrInfo0 = new
160 associatedBindings.AssociatedInterfacePtrInfo(); 209 associatedBindings.AssociatedInterfacePtrInfo();
161 var integerSenderRequest0 = associatedBindings.makeRequest( 210 var integerSenderRequest0 = associatedBindings.makeRequest(
162 integerSenderPtrInfo0); 211 integerSenderPtrInfo0);
163 212
164 var integerSender0 = new 213 var integerSender0 = new
165 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 214 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
166 integerSender0.ptr.bind(integerSenderPtrInfo0); 215 integerSenderPtrInfo0);
167 216
168 integerSenderConnection.getSender(integerSenderRequest0); 217 integerSenderConnection.getSender(integerSenderRequest0);
169 await new Promise((resolve, reject) => { 218 await new Promise((resolve, reject) => {
170 integerSender0.ptr.setConnectionErrorHandler(function({custom_reason, 219 integerSender0.ptr.setConnectionErrorHandler(function({custom_reason,
171 description}) { 220 description}) {
172 assert_equals(custom_reason, 42); 221 assert_equals(custom_reason, 42);
173 assert_equals(description, 'hey'); 222 assert_equals(description, 'hey');
174 resolve(); 223 resolve();
175 }); 224 });
176 }); 225 });
177 }, 'connection error with reason'); 226 }, 'connection error with reason');
178 227
179 promise_test(async () => { 228 promise_test(async () => {
180 var integerSenderConnection = new 229 var integerSenderConnection = new
181 testAssociatedInterfaces.IntegerSenderConnectionPtr(); 230 testAssociatedInterfaces.IntegerSenderConnectionPtr();
182 var integerSenderConnectionBinding = new bindings.Binding( 231 var integerSenderConnectionBinding = new bindings.Binding(
183 testAssociatedInterfaces.IntegerSenderConnection, 232 testAssociatedInterfaces.IntegerSenderConnection,
184 new IntegerSenderConnectionImpl(), 233 new IntegerSenderConnectionImpl(),
185 bindings.makeRequest(integerSenderConnection)); 234 bindings.makeRequest(integerSenderConnection));
186 235
187 // Sending AssociatedInterfaceRequest. 236 // Sending AssociatedInterfaceRequest.
188 var integerSenderPtrInfo0 = new 237 var integerSenderPtrInfo0 = new
189 associatedBindings.AssociatedInterfacePtrInfo(); 238 associatedBindings.AssociatedInterfacePtrInfo();
190 var integerSenderRequest0 = associatedBindings.makeRequest( 239 var integerSenderRequest0 = associatedBindings.makeRequest(
191 integerSenderPtrInfo0); 240 integerSenderPtrInfo0);
192 var integerSender0 = new 241 var integerSender0 = new
193 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 242 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
194 integerSender0.ptr.bind(integerSenderPtrInfo0); 243 integerSenderPtrInfo0);
195 integerSenderConnection.getSender(integerSenderRequest0); 244 integerSenderConnection.getSender(integerSenderRequest0);
196 245
197 // Recieving AssociatedInterfacePtrInfo. 246 // Recieving AssociatedInterfacePtrInfo.
198 var integerSenderPtrInfo1 = 247 var integerSenderPtrInfo1 =
199 (await integerSenderConnection.asyncGetSender()).sender; 248 (await integerSenderConnection.asyncGetSender()).sender;
200 var integerSender1 = new 249 var integerSender1 = new
201 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 250 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
202 integerSender1.ptr.bind(integerSenderPtrInfo1); 251 integerSenderPtrInfo1);
203 252
204 // Master InterfacePtrController reset triggers connection error handler on 253 // Master InterfacePtrController reset triggers connection error handler on
205 // interface endpoint clients for all associated endpoints. 254 // interface endpoint clients for all associated endpoints.
206 var connectionErrorHandler0 = new Promise((resolve, reject) => { 255 var connectionErrorHandler0 = new Promise((resolve, reject) => {
207 integerSender0.ptr.setConnectionErrorHandler(() => { 256 integerSender0.ptr.setConnectionErrorHandler(() => {
208 resolve(); 257 resolve();
209 }); 258 });
210 }); 259 });
211 260
212 var connectionErrorHandler1 = new Promise((resolve, reject) => { 261 var connectionErrorHandler1 = new Promise((resolve, reject) => {
213 integerSender1.ptr.setConnectionErrorHandler(() => { 262 integerSender1.ptr.setConnectionErrorHandler(() => {
214 resolve(); 263 resolve();
215 }); 264 });
216 }); 265 });
217 266
218 setTimeout(integerSenderConnection.ptr.reset.bind( 267 setTimeout(integerSenderConnection.ptr.reset.bind(
219 integerSenderConnection.ptr), 0); 268 integerSenderConnection.ptr), 0);
220 await Promise.all([connectionErrorHandler0, connectionErrorHandler1]); 269 await Promise.all([connectionErrorHandler0, connectionErrorHandler1]);
221 }, 'all endpoints connectionErrorHandler called on master interface reset'); 270 }, 'all endpoints connectionErrorHandler called on master interface reset');
222 271
272 // Cache the current message and pause processing incoming messages if
273 // endpoint does not have client attached yet to ensure fifo message arrival.
274 promise_test(async () => {
275 var senderConnection = new
276 testAssociatedInterfaces.SenderConnectionPtr();
277 var senderConnectionBindLaterImpl = new SenderConnectionBindLaterImpl();
278 var senderConnectionBinding = new bindings.Binding(
279 testAssociatedInterfaces.SenderConnection,
280 senderConnectionBindLaterImpl,
281 bindings.makeRequest(senderConnection));
282
283 // AssociatedInterfaceRequest for stringSender.
284 var stringSenderPtrInfo = new
285 associatedBindings.AssociatedInterfacePtrInfo();
286 var stringSenderRequest = associatedBindings.makeRequest(
287 stringSenderPtrInfo);
288 var stringSender =
289 new testAssociatedInterfaces.AssociatedStringSenderPtr(
290 stringSenderPtrInfo);
291
292 // AssociatedInterfaceRequest for integerSender.
293 var integerSenderPtrInfo = new
294 associatedBindings.AssociatedInterfacePtrInfo();
295 var integerSenderRequest = associatedBindings.makeRequest(
296 integerSenderPtrInfo);
297 var integerSender = new
298 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
299 integerSenderPtrInfo);
300
301 var value = await new Promise(function(resolve, reject) {
302 senderConnectionBindLaterImpl.callbacks = [resolve, reject];
303 senderConnection.getStringSender(stringSenderRequest);
304 senderConnection.getIntegerSender(integerSenderRequest);
305 // Test FIFO arrival order of message.
306 integerSender.send(456); // This message should arrive first.
307 stringSender.send('goodbye');
308 });
309
310 assert_equals(value, 456);
311 }, 'fifo order should be preserved for messages');
312
313 promise_test(async () => {
314 var senderConnection = new
315 testAssociatedInterfaces.SenderConnectionPtr();
316 var senderConnectionImpl = new SenderConnectionImpl();
317 var senderConnectionBinding = new bindings.Binding(
318 testAssociatedInterfaces.SenderConnection,
319 senderConnectionImpl,
320 bindings.makeRequest(senderConnection));
321
322 // AssociatedInterfaceRequest for stringSender.
323 var stringSenderPtrInfo = new
324 associatedBindings.AssociatedInterfacePtrInfo();
325 var stringSenderRequest = associatedBindings.makeRequest(
326 stringSenderPtrInfo);
327 var stringSender =
328 new testAssociatedInterfaces.AssociatedStringSenderPtr(
329 stringSenderPtrInfo);
330
331 // AssociatedInterfaceRequest for integerSender.
332 var integerSenderPtrInfo = new
333 associatedBindings.AssociatedInterfacePtrInfo();
334 var integerSenderRequest = associatedBindings.makeRequest(
335 integerSenderPtrInfo);
336 var integerSender = new
337 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
338 integerSenderPtrInfo);
339
340 var value = await new Promise(function(resolve, reject) {
341 senderConnectionImpl.callbacks = [reject, resolve];
342 senderConnection.getStringSender(stringSenderRequest);
343 senderConnection.getIntegerSender(integerSenderRequest);
344
345 // Wait for integerSenderBinding to be created.
346 integerSender.echo(100).then(function(result) {
347 assert_equals(result.value, 100);
348
349 // This causes this endpoint handle's endpoint client to be detached.
350 var handle = senderConnectionImpl.integerSenderBinding_.
351 interfaceEndpointClient_.passHandle();
352
353 // Cache message. Connector will pause processing incoming messages.
354 integerSender.send(456);
355 stringSender.send('goodbye');
356
357 // Closing the target endpoint handle of the cached message will cause
358 // the cached message to be discarded and the connector to resume
359 // processing incoming messages.
360 setTimeout(handle.reset.bind(handle), 0);
361 });
362 });
363
364 assert_equals(value, 'goodbye');
365 }, 'discard cached message if target endpoint closed');
366
223 done(); 367 done();
224 }); 368 });
225 369
226 </script> 370 </script>
OLDNEW
« mojo/public/js/router.js ('K') | « mojo/public/js/router.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698