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

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: Remove timer from closeEndpointHandle. Clean up associated_interface_ptr.html test. Created 3 years, 8 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
« no previous file with comments | « 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({getIntegerSenderCallback,
84 getStringSenderCallback} = {}) {
85 this.getIntegerSenderCallback = getIntegerSenderCallback;
86 this.getStringSenderCallback = getStringSenderCallback;
87 this.integerSenderBinding_ = null;
88 this.stringSenderBinding_ = null;
89 }
90
91 SenderConnectionBindLaterImpl.prototype.getIntegerSender =
92 function(integerSenderRequest) {
93 setTimeout(() => {
94 this.integerSenderBinding_ = new associatedBindings.AssociatedBinding(
95 testAssociatedInterfaces.IntegerSender,
96 new IntegerSenderImpl(this.getIntegerSenderCallback),
97 integerSenderRequest);
98 }, 0);
99 };
100
101 SenderConnectionBindLaterImpl.prototype.getStringSender =
102 function(stringSenderRequest) {
103 this.stringSenderBinding_ = new associatedBindings.AssociatedBinding(
104 testAssociatedInterfaces.StringSender,
105 new StringSenderImpl(this.getStringSenderCallback),
106 stringSenderRequest);
107 };
108
109 function SenderConnectionImpl({getIntegerSenderCallback,
110 getStringSenderCallback} = {}) {
111 this.getIntegerSenderCallback = getIntegerSenderCallback;
112 this.getStringSenderCallback = getStringSenderCallback;
113 this.integerSenderBinding_ = null;
114 this.stringSenderBinding_ = null;
115 }
116
117 SenderConnectionImpl.prototype.getIntegerSender =
118 function(integerSenderRequest) {
119 this.integerSenderBinding_ = new associatedBindings.AssociatedBinding(
120 testAssociatedInterfaces.IntegerSender,
121 new IntegerSenderImpl(this.getIntegerSenderCallback),
122 integerSenderRequest);
123 };
124
125 SenderConnectionImpl.prototype.getStringSender =
126 function(stringSenderRequest) {
127 this.stringSenderBinding_ = new associatedBindings.AssociatedBinding(
128 testAssociatedInterfaces.StringSender,
129 new StringSenderImpl(this.getStringSenderCallback),
130 stringSenderRequest);
131 };
132
80 promise_test(async () => { 133 promise_test(async () => {
81 var integerSenderConnection = new 134 var integerSenderConnection = new
82 testAssociatedInterfaces.IntegerSenderConnectionPtr(); 135 testAssociatedInterfaces.IntegerSenderConnectionPtr();
83 var integerSenderConnectionBinding = new bindings.Binding( 136 var integerSenderConnectionBinding = new bindings.Binding(
84 testAssociatedInterfaces.IntegerSenderConnection, 137 testAssociatedInterfaces.IntegerSenderConnection,
85 new IntegerSenderConnectionImpl(), 138 new IntegerSenderConnectionImpl(),
86 bindings.makeRequest(integerSenderConnection)); 139 bindings.makeRequest(integerSenderConnection));
87 140
88 // Sending AssociatedInterfaceRequest. 141 // Sending AssociatedInterfaceRequest.
89 var integerSenderPtrInfo0 = new 142 var integerSenderPtrInfo0 = new
90 associatedBindings.AssociatedInterfacePtrInfo(); 143 associatedBindings.AssociatedInterfacePtrInfo();
91 var integerSenderRequest0 = associatedBindings.makeRequest( 144 var integerSenderRequest0 = associatedBindings.makeRequest(
92 integerSenderPtrInfo0); 145 integerSenderPtrInfo0);
93 146
94 var integerSender0 = new 147 var integerSender0 = new
95 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 148 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
96 integerSender0.ptr.bind(integerSenderPtrInfo0); 149 integerSenderPtrInfo0);
97 150
98 integerSenderConnection.getSender(integerSenderRequest0); 151 integerSenderConnection.getSender(integerSenderRequest0);
99 assert_equals((await integerSender0.echo(123)).value, 123); 152 assert_equals((await integerSender0.echo(123)).value, 123);
100 153
101 // Recieving AssociatedInterfacePtrInfo. 154 // Recieving AssociatedInterfacePtrInfo.
102 var integerSenderPtrInfo1 = 155 var integerSenderPtrInfo1 =
103 (await integerSenderConnection.asyncGetSender()).sender; 156 (await integerSenderConnection.asyncGetSender()).sender;
104 var integerSender1 = new 157 var integerSender1 = new
105 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 158 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
106 integerSender1.ptr.bind(integerSenderPtrInfo1); 159 integerSenderPtrInfo1);
107 assert_equals((await integerSender1.echo(456)).value, 456); 160 assert_equals((await integerSender1.echo(456)).value, 456);
108 }, 'pass associated interfaces'); 161 }, 'pass associated interfaces');
109 162
110 // Bind to the same pipe two associated interfaces, whose implementation 163 // Bind to the same pipe two associated interfaces, whose implementation
111 // lives at different ends. Test that the two don't interfere. 164 // lives at different ends. Test that the two don't interfere.
112 promise_test(async () => { 165 promise_test(async () => {
113 var integerSenderConnectionAtBothEnds = new 166 var integerSenderConnectionAtBothEnds = new
114 testAssociatedInterfaces.IntegerSenderConnectionAtBothEndsPtr(); 167 testAssociatedInterfaces.IntegerSenderConnectionAtBothEndsPtr();
115 var integerSenderConnectionAtBothEndsBinding = new bindings.Binding( 168 var integerSenderConnectionAtBothEndsBinding = new bindings.Binding(
116 testAssociatedInterfaces.IntegerSenderConnectionAtBothEnds, 169 testAssociatedInterfaces.IntegerSenderConnectionAtBothEnds,
117 new IntegerSenderConnectionAtBothEndsImpl(), 170 new IntegerSenderConnectionAtBothEndsImpl(),
118 bindings.makeRequest(integerSenderConnectionAtBothEnds)); 171 bindings.makeRequest(integerSenderConnectionAtBothEnds));
119 172
120 // Associated Interface whose Binding Impl lives on the other side. 173 // Associated Interface whose Binding Impl lives on the other side.
121 // Sending AssociatedInterfaceRequest. 174 // Sending AssociatedInterfaceRequest.
122 var integerSenderPtrInfo0 = new 175 var integerSenderPtrInfo0 = new
123 associatedBindings.AssociatedInterfacePtrInfo(); 176 associatedBindings.AssociatedInterfacePtrInfo();
124 var integerSenderRequest0 = associatedBindings.makeRequest( 177 var integerSenderRequest0 = associatedBindings.makeRequest(
125 integerSenderPtrInfo0); 178 integerSenderPtrInfo0);
126 179
127 var integerSender0 = new 180 var integerSender0 = new
128 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 181 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
129 integerSender0.ptr.bind(integerSenderPtrInfo0); 182 integerSenderPtrInfo0);
130 183
131 integerSenderConnectionAtBothEnds.getSender(integerSenderRequest0); 184 integerSenderConnectionAtBothEnds.getSender(integerSenderRequest0);
132 assert_equals((await integerSender0.echo(123)).value, 123); 185 assert_equals((await integerSender0.echo(123)).value, 123);
133 186
134 // Associated Interface whose Binding Impl lives on this side. 187 // Associated Interface whose Binding Impl lives on this side.
135 // Sending AssociatedInterfacePtrInfo. 188 // Sending AssociatedInterfacePtrInfo.
136 var integerSenderPtrInfo1 = new 189 var integerSenderPtrInfo1 = new
137 associatedBindings.AssociatedInterfacePtrInfo(); 190 associatedBindings.AssociatedInterfacePtrInfo();
138 var integerSenderRequest1 = associatedBindings.makeRequest( 191 var integerSenderRequest1 = associatedBindings.makeRequest(
139 integerSenderPtrInfo1); 192 integerSenderPtrInfo1);
(...skipping 15 matching lines...) Expand all
155 new IntegerSenderConnectionImplWithConnectionError(), 208 new IntegerSenderConnectionImplWithConnectionError(),
156 bindings.makeRequest(integerSenderConnection)); 209 bindings.makeRequest(integerSenderConnection));
157 210
158 // Sending AssociatedInterfaceRequest. 211 // Sending AssociatedInterfaceRequest.
159 var integerSenderPtrInfo0 = new 212 var integerSenderPtrInfo0 = new
160 associatedBindings.AssociatedInterfacePtrInfo(); 213 associatedBindings.AssociatedInterfacePtrInfo();
161 var integerSenderRequest0 = associatedBindings.makeRequest( 214 var integerSenderRequest0 = associatedBindings.makeRequest(
162 integerSenderPtrInfo0); 215 integerSenderPtrInfo0);
163 216
164 var integerSender0 = new 217 var integerSender0 = new
165 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 218 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
166 integerSender0.ptr.bind(integerSenderPtrInfo0); 219 integerSenderPtrInfo0);
167 220
168 integerSenderConnection.getSender(integerSenderRequest0); 221 integerSenderConnection.getSender(integerSenderRequest0);
169 await new Promise((resolve, reject) => { 222 await new Promise((resolve, reject) => {
170 integerSender0.ptr.setConnectionErrorHandler(function({custom_reason, 223 integerSender0.ptr.setConnectionErrorHandler(function({custom_reason,
171 description}) { 224 description}) {
172 assert_equals(custom_reason, 42); 225 assert_equals(custom_reason, 42);
173 assert_equals(description, 'hey'); 226 assert_equals(description, 'hey');
174 resolve(); 227 resolve();
175 }); 228 });
176 }); 229 });
177 }, 'connection error with reason'); 230 }, 'connection error with reason');
178 231
179 promise_test(async () => { 232 promise_test(async () => {
180 var integerSenderConnection = new 233 var integerSenderConnection = new
181 testAssociatedInterfaces.IntegerSenderConnectionPtr(); 234 testAssociatedInterfaces.IntegerSenderConnectionPtr();
182 var integerSenderConnectionBinding = new bindings.Binding( 235 var integerSenderConnectionBinding = new bindings.Binding(
183 testAssociatedInterfaces.IntegerSenderConnection, 236 testAssociatedInterfaces.IntegerSenderConnection,
184 new IntegerSenderConnectionImpl(), 237 new IntegerSenderConnectionImpl(),
185 bindings.makeRequest(integerSenderConnection)); 238 bindings.makeRequest(integerSenderConnection));
186 239
187 // Sending AssociatedInterfaceRequest. 240 // Sending AssociatedInterfaceRequest.
188 var integerSenderPtrInfo0 = new 241 var integerSenderPtrInfo0 = new
189 associatedBindings.AssociatedInterfacePtrInfo(); 242 associatedBindings.AssociatedInterfacePtrInfo();
190 var integerSenderRequest0 = associatedBindings.makeRequest( 243 var integerSenderRequest0 = associatedBindings.makeRequest(
191 integerSenderPtrInfo0); 244 integerSenderPtrInfo0);
192 var integerSender0 = new 245 var integerSender0 = new
193 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 246 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
194 integerSender0.ptr.bind(integerSenderPtrInfo0); 247 integerSenderPtrInfo0);
195 integerSenderConnection.getSender(integerSenderRequest0); 248 integerSenderConnection.getSender(integerSenderRequest0);
196 249
197 // Recieving AssociatedInterfacePtrInfo. 250 // Recieving AssociatedInterfacePtrInfo.
198 var integerSenderPtrInfo1 = 251 var integerSenderPtrInfo1 =
199 (await integerSenderConnection.asyncGetSender()).sender; 252 (await integerSenderConnection.asyncGetSender()).sender;
200 var integerSender1 = new 253 var integerSender1 = new
201 testAssociatedInterfaces.AssociatedIntegerSenderPtr(); 254 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
202 integerSender1.ptr.bind(integerSenderPtrInfo1); 255 integerSenderPtrInfo1);
203 256
204 // Master InterfacePtrController reset triggers connection error handler on 257 // Master InterfacePtrController reset triggers connection error handler on
205 // interface endpoint clients for all associated endpoints. 258 // interface endpoint clients for all associated endpoints.
206 var connectionErrorHandler0 = new Promise((resolve, reject) => { 259 var connectionErrorHandler0 = new Promise((resolve, reject) => {
207 integerSender0.ptr.setConnectionErrorHandler(() => { 260 integerSender0.ptr.setConnectionErrorHandler(() => {
208 resolve(); 261 resolve();
209 }); 262 });
210 }); 263 });
211 264
212 var connectionErrorHandler1 = new Promise((resolve, reject) => { 265 var connectionErrorHandler1 = new Promise((resolve, reject) => {
213 integerSender1.ptr.setConnectionErrorHandler(() => { 266 integerSender1.ptr.setConnectionErrorHandler(() => {
214 resolve(); 267 resolve();
215 }); 268 });
216 }); 269 });
217 270
218 setTimeout(integerSenderConnection.ptr.reset.bind( 271 setTimeout(integerSenderConnection.ptr.reset.bind(
219 integerSenderConnection.ptr), 0); 272 integerSenderConnection.ptr), 0);
220 await Promise.all([connectionErrorHandler0, connectionErrorHandler1]); 273 await Promise.all([connectionErrorHandler0, connectionErrorHandler1]);
221 }, 'all endpoints connectionErrorHandler called on master interface reset'); 274 }, 'all endpoints connectionErrorHandler called on master interface reset');
222 275
276 // Cache the current message and pause processing incoming messages if
277 // endpoint does not have client attached yet to ensure fifo message arrival.
278 promise_test(async () => {
279 var senderConnection = new
280 testAssociatedInterfaces.SenderConnectionPtr();
281 var senderConnectionBindLaterImpl = new SenderConnectionBindLaterImpl();
282 var senderConnectionBinding = new bindings.Binding(
283 testAssociatedInterfaces.SenderConnection,
284 senderConnectionBindLaterImpl,
285 bindings.makeRequest(senderConnection));
286
287 // AssociatedInterfaceRequest for stringSender.
288 var stringSenderPtrInfo = new
289 associatedBindings.AssociatedInterfacePtrInfo();
290 var stringSenderRequest = associatedBindings.makeRequest(
291 stringSenderPtrInfo);
292 var stringSender =
293 new testAssociatedInterfaces.AssociatedStringSenderPtr(
294 stringSenderPtrInfo);
295
296 // AssociatedInterfaceRequest for integerSender.
297 var integerSenderPtrInfo = new
298 associatedBindings.AssociatedInterfacePtrInfo();
299 var integerSenderRequest = associatedBindings.makeRequest(
300 integerSenderPtrInfo);
301 var integerSender = new
302 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
303 integerSenderPtrInfo);
304
305 var value = await new Promise(function(resolve, reject) {
306 senderConnectionBindLaterImpl.getIntegerSenderCallback = resolve;
307 senderConnectionBindLaterImpl.getStringSenderCallback= reject;
308 senderConnection.getStringSender(stringSenderRequest);
309 senderConnection.getIntegerSender(integerSenderRequest);
310 // Test FIFO arrival order of message.
311 integerSender.send(456); // This message should arrive first.
312 stringSender.send('goodbye');
313 });
314
315 assert_equals(value, 456);
316 }, 'fifo order should be preserved for messages');
317
318 promise_test(async () => {
319 var senderConnection = new
320 testAssociatedInterfaces.SenderConnectionPtr();
321 var senderConnectionImpl = new SenderConnectionImpl();
322 var senderConnectionBinding = new bindings.Binding(
323 testAssociatedInterfaces.SenderConnection,
324 senderConnectionImpl,
325 bindings.makeRequest(senderConnection));
326
327 // AssociatedInterfaceRequest for stringSender.
328 var stringSenderPtrInfo = new
329 associatedBindings.AssociatedInterfacePtrInfo();
330 var stringSenderRequest = associatedBindings.makeRequest(
331 stringSenderPtrInfo);
332 var stringSender =
333 new testAssociatedInterfaces.AssociatedStringSenderPtr(
334 stringSenderPtrInfo);
335
336 // AssociatedInterfaceRequest for integerSender.
337 var integerSenderPtrInfo = new
338 associatedBindings.AssociatedInterfacePtrInfo();
339 var integerSenderRequest = associatedBindings.makeRequest(
340 integerSenderPtrInfo);
341 var integerSender = new
342 testAssociatedInterfaces.AssociatedIntegerSenderPtr(
343 integerSenderPtrInfo);
344
345 var value = await new Promise(function(resolve, reject) {
346 senderConnectionImpl.getIntegerSenderCallback = reject;
347 senderConnectionImpl.getStringSenderCallback= resolve;
348 senderConnection.getStringSender(stringSenderRequest);
349 senderConnection.getIntegerSender(integerSenderRequest);
350
351 // Wait for integerSenderBinding to be created.
352 integerSender.echo(100).then(function(result) {
353 assert_equals(result.value, 100);
354
355 // This causes this endpoint handle's endpoint client to be detached.
356 var handle = senderConnectionImpl.integerSenderBinding_.
357 interfaceEndpointClient_.passHandle();
358
359 // Cache message. Connector will pause processing incoming messages.
360 integerSender.send(456);
361 stringSender.send('goodbye');
362
363 // Closing the target endpoint handle of the cached message will cause
364 // the cached message to be discarded and the connector to resume
365 // processing incoming messages.
366 setTimeout(handle.reset.bind(handle), 0);
367 });
368 });
369
370 assert_equals(value, 'goodbye');
371 }, 'discard cached message if target endpoint closed');
372
223 done(); 373 done();
224 }); 374 });
225 375
226 </script> 376 </script>
OLDNEW
« no previous file with comments | « mojo/public/js/router.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698