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

Side by Side Diff: third_party/WebKit/LayoutTests/resources/bluetooth/bluetooth-helpers.js

Issue 2825393004: bluetooth: Check the order of event and promise resolution for readValue (Closed)
Patch Set: Address moar feedback 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 | « third_party/WebKit/LayoutTests/bluetooth/characteristic/readValue/event-is-fired.html ('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 'use strict'; 1 'use strict';
2 2
3 // Bluetooth UUID constants: 3 // Bluetooth UUID constants:
4 // Services: 4 // Services:
5 var blocklist_test_service_uuid = "611c954a-263b-4f4a-aab6-01ddb953f985"; 5 var blocklist_test_service_uuid = "611c954a-263b-4f4a-aab6-01ddb953f985";
6 var request_disconnection_service_uuid = "01d7d889-7451-419f-aeb8-d65e7b9277af"; 6 var request_disconnection_service_uuid = "01d7d889-7451-419f-aeb8-d65e7b9277af";
7 // Characteristics: 7 // Characteristics:
8 var blocklist_exclude_reads_characteristic_uuid = 8 var blocklist_exclude_reads_characteristic_uuid =
9 "bad1c9a2-9a5b-4015-8b60-1579bbbf2135"; 9 "bad1c9a2-9a5b-4015-8b60-1579bbbf2135";
10 var request_disconnection_characteristic_uuid = 10 var request_disconnection_characteristic_uuid =
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 function eventPromise(target, type, options) { 256 function eventPromise(target, type, options) {
257 return new Promise(resolve => { 257 return new Promise(resolve => {
258 let wrapper = function(event) { 258 let wrapper = function(event) {
259 target.removeEventListener(type, wrapper); 259 target.removeEventListener(type, wrapper);
260 resolve(event); 260 resolve(event);
261 }; 261 };
262 target.addEventListener(type, wrapper, options); 262 target.addEventListener(type, wrapper, options);
263 }); 263 });
264 } 264 }
265 265
266 // Creates |num_listeners| promises. Each adds an event listener
267 // to object. The promises resolve once the object fires |event| but
268 // reject if the event is fired before |object|.|func|() resolves.
269 // Returns a promise that fulfills with the result of |object|.|func()|
270 // and |event.target.value| of each of the other promises.
271 // If |ignore_event_promise_order| is set true, this function will ignore
272 // the relative order of the event and the promise; otherwise it will assert
273 // the event is triggered after the promise is resolved.
274 function assert_event_fires_after_promise(object, func, event, num_listeners, ig nore_event_promise_order) {
275 num_listeners = num_listeners !== undefined ? num_listeners : 1;
276 266
277 if (object[func] === undefined) { 267
278 return Promise.reject('Function \'' + func + '\' not available in object.'); 268 // Helper function to assert that events are fired and a promise resolved
279 } 269 // in the correct order.
280 let should_resolve = false; 270 // 'event' should be passed as |should_be_first| to indicate that the events
281 let event_promises = []; 271 // should be fired first, otherwise 'promiseresolved' should be passed.
272 // Attaches |num_listeners| |event| listeners to |object|. If all events have
273 // been fired and the promise resolved in the correct order, returns a promise
274 // that fulfills with the result of |object|.|func()| and |event.target.value|
275 // of each of event listeners. Otherwise throws an error.
276 function assert_promise_event_order_(should_be_first, object, func, event, num_l isteners) {
277 let order = [];
278 let event_promises = []
282 for (let i = 0; i < num_listeners; i++) { 279 for (let i = 0; i < num_listeners; i++) {
283 event_promises.push(new Promise((resolve, reject) => { 280 event_promises.push(new Promise(resolve => {
284 let event_listener = (e) => { 281 let event_listener = (e) => {
285 object.removeEventListener(event, event_listener); 282 object.removeEventListener(event, event_listener);
286 if (should_resolve || ignore_event_promise_order) { 283 order.push('event');
287 resolve(e.target.value); 284 resolve(e.target.value);
288 } else { 285 }
289 reject(event + ' was triggered before the promise resolved.');
290 }
291 };
292 object.addEventListener(event, event_listener); 286 object.addEventListener(event, event_listener);
293 })); 287 }));
294 } 288 }
295 return object[func]().then(result => { 289
296 should_resolve = true; 290 let func_promise = object[func]().then(result => {
297 return Promise.all([result, ...event_promises]); 291 order.push('promiseresolved');
292 return result;
298 }); 293 });
294
295 return Promise.all([func_promise, ...event_promises])
296 .then((result) => {
297 if (should_be_first !== order[0]) {
298 throw should_be_first === 'promiseresolved' ?
299 `'${event}' was fired before promise resolved.` :
300 `Promise resolved before '${event}' was fired.`;
301 }
302
303 if (order[0] !== 'promiseresolved' &&
304 order[order.length - 1] !== 'promiseresolved') {
305 throw 'Promise resolved in between event listeners.';
306 }
307
308 return result;
309 });
310 }
311
312 // See assert_promise_event_order_ above.
313 function assert_promise_resolves_before_event(
314 object, func, event, num_listeners=1) {
315 return assert_promise_event_order_(
316 'promiseresolved', object, func, event, num_listeners);
317 }
318
319 // See assert_promise_event_order_ above.
320 function assert_promise_resolves_after_event(
321 object, func, event, num_listeners=1) {
322 return assert_promise_event_order_(
323 'event', object, func, event, num_listeners);
299 } 324 }
300 325
301 // Returns a promise that resolves after 100ms unless 326 // Returns a promise that resolves after 100ms unless
302 // the the event is fired on the object in which case 327 // the the event is fired on the object in which case
303 // the promise rejects. 328 // the promise rejects.
304 function assert_no_events(object, event_name) { 329 function assert_no_events(object, event_name) {
305 return new Promise((resolve, reject) => { 330 return new Promise((resolve, reject) => {
306 let event_listener = (e) => { 331 let event_listener = (e) => {
307 object.removeEventListener(event_name, event_listener); 332 object.removeEventListener(event_name, event_listener);
308 assert_unreached('Object should not fire an event.'); 333 assert_unreached('Object should not fire an event.');
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 filters: [{ services: services, name: 'Name' }], 415 filters: [{ services: services, name: 'Name' }],
391 optionalServices: ['heart_rate'] 416 optionalServices: ['heart_rate']
392 }, { 417 }, {
393 filters: [{ services: services, namePrefix: 'Pre' }], 418 filters: [{ services: services, namePrefix: 'Pre' }],
394 optionalServices: ['heart_rate'] 419 optionalServices: ['heart_rate']
395 }, { 420 }, {
396 filters: [{ services: services, name: 'Name', namePrefix: 'Pre' }], 421 filters: [{ services: services, name: 'Name', namePrefix: 'Pre' }],
397 optionalServices: ['heart_rate'] 422 optionalServices: ['heart_rate']
398 }]; 423 }];
399 } 424 }
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/bluetooth/characteristic/readValue/event-is-fired.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698