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

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

Issue 1726943002: First set of WebUSB layout tests with Mojo service mocks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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
(Empty)
1 'use strict';
2
3 const usbMocks = new Promise(resolve => {
Ken Rockot(use gerrit already) 2016/02/23 23:12:49 How about making usbMocks a function which takes a
Reilly Grant (use Gerrit) 2016/02/24 20:18:47 Done.
4 define('USB Mocks', [
5 'device/usb/public/interfaces/device_manager.mojom',
6 'device/usb/public/interfaces/device.mojom',
7 'device/usb/public/interfaces/permission_provider.mojom',
8 'content/public/renderer/service_provider',
Ken Rockot(use gerrit already) 2016/02/23 23:12:48 nit: I suppose we should keep these sorted
Reilly Grant (use Gerrit) 2016/02/24 20:18:47 No longer an issue now that it takes mojo as a par
9 'mojo/public/js/core',
10 'mojo/public/js/router',
11 ], (deviceManager, device, permissionProvider, serviceRegistry, core,
12 router) => {
13 function assertDeviceInfoEquals(device, info) {
14 assert_equals(device.guid, info.guid);
15 assert_equals(device.usbVersionMajor, info.usb_version_major);
16 assert_equals(device.usbVersionMinor, info.usb_version_minor);
17 assert_equals(device.usbVersionSubminor, info.usb_version_subminor);
18 assert_equals(device.deviceClass, info.class_code);
19 assert_equals(device.deviceSubclass, info.subclass_code);
20 assert_equals(device.deviceProtocol, info.protocol_code);
21 assert_equals(device.vendorId, info.vendor_id);
22 assert_equals(device.productId, info.product_id);
23 assert_equals(device.deviceVersionMajor, info.device_version_major);
24 assert_equals(device.deviceVersionMinor, info.device_version_minor);
25 assert_equals(device.deviceVersionSubminor,
26 info.device_version_subminor);
27 assert_equals(device.manufacturerName, info.manufacturer_name);
28 assert_equals(device.productName, info.product_name);
29 assert_equals(device.serialNumber, info.serial_number);
30 assert_equals(device.configurations.length,
31 info.configurations.length);
32 for (var i = 0; i < device.configurations.length; ++i) {
33 assertConfigurationInfoEquals(device.configurations[i],
34 info.configurations[i]);
35 }
36 };
37
38 function assertConfigurationInfoEquals(configuration, info) {
39 assert_equals(configuration.configurationValue,
40 info.configuration_value);
41 assert_equals(configuration.configurationName,
42 info.configuration_name);
43 assert_equals(configuration.interfaces.length,
44 info.interfaces.length);
45 for (var i = 0; i < configuration.interfaces.length; ++i) {
46 assertInterfaceInfoEquals(configuration.interfaces[i],
47 info.interfaces[i]);
48 }
49 };
50
51 function assertInterfaceInfoEquals(iface, info) {
52 assert_equals(iface.interfaceNumber, info.interface_number);
53 assert_equals(iface.alternates.length, info.alternates.length);
54 for (var i = 0; i < iface.alternates.length; ++i) {
55 assertAlternateInfoEquals(iface.alternates[i], info.alternates[i]);
56 }
57 };
58
59 function assertAlternateInfoEquals(alternate, info) {
60 assert_equals(alternate.alternateSetting, info.alternate_setting);
61 assert_equals(alternate.interfaceClass, info.class_code);
62 assert_equals(alternate.interfaceSubclass, info.subclass_code);
63 assert_equals(alternate.interfaceProtocol, info.protocol_code);
64 assert_equals(alternate.interfaceName, info.interface_name);
65 assert_equals(alternate.endpoints.length, info.endpoints.length);
66 for (var i = 0; i < alternate.endpoints.length; ++i) {
67 assertEndpointInfoEquals(alternate.endpoints[i], info.endpoints[i]);
68 }
69 }
70
71 function assertEndpointInfoEquals(endpoint, info) {
72 var direction;
73 switch (info.direction) {
74 case device.TransferDirection.INBOUND:
75 direction = "in";
76 break;
77 case device.TransferDirection.OUTBOUND:
78 direction = "out";
79 break;
80 }
81
82 var type;
83 switch (info.type) {
84 case device.EndpointType.BULK:
85 type = "bulk";
86 break;
87 case device.EndpointType.INTERRUPT:
88 type = "interrupt";
89 break;
90 case device.EndpointType.ISOCHRONOUS:
91 type = "isochronous";
92 break;
93 }
94
95 assert_equals(endpoint.endpointNumber, info.endpoint_number);
96 assert_equals(endpoint.direction, direction);
97 assert_equals(endpoint.type, type);
98 assert_equals(endpoint.packetSize, info.packet_size);
99 }
100
101 class MockDevice extends device.Device.stubClass {
102 constructor(info, pipe) {
103 super();
104 this.info_ = info;
105 this.pipe_ = pipe;
106 this.router_ = new router.Router(pipe);
107 this.router_.setIncomingReceiver(this);
108 this.opened_ = false;
109 this.currentConfiguration_ = undefined;
110 this.claimedInterfaces_ = new Map();
111 }
112
113 getDeviceInfo() {
114 return Promise.resolve({ info: this.info_ });
115 }
116
117 getConfiguration() {
118 if (this.currentConfiguration_ === undefined) {
119 return Promise.resolve({ value: 0 });
120 } else {
121 return Promise.resolve({
122 value: this.currentConfiguration_.configuration_value });
123 }
124 }
125
126 open() {
127 // TODO(reillyg): Check if the device is opened and return
128 // OpenDeviceError.ALREADY_OPEN.
129 this.opened_ = true;
130 return Promise.resolve({ error: device.OpenDeviceError.OK });
131 }
132
133 close() {
134 this.opened_ = false;
135 return Promise.resolve({});
136 }
137
138 setConfiguration(value) {
139 if (!this.opened_)
140 return Promise.resolve({ success: false });
141
142 let selected_configuration = this.info_.configurations.find(
143 configuration => configuration.configuration_value == value);
144 if (selected_configuration !== undefined) {
145 this.currentConfiguration_ = selected_configuration;
146 return Promise.resolve({ success: true });
147 } else {
148 return Promise.resolve({ success: false });
149 }
150 }
151
152 claimInterface(interfaceNumber) {
153 if (!this.opened_)
154 return Promise.resolve({ success: false });
155
156 if (this.currentConfiguration_ === undefined)
157 return Promise.resolve({ success: false });
158
159 if (this.claimedInterfaces_.has(interfaceNumber))
160 return Promise.resolve({ success: false });
161
162 if (this.currentConfiguration_.interfaces.some(
163 iface => iface.interface_number == interfaceNumber)) {
164 this.claimedInterfaces_.set(interfaceNumber, 0);
165 return Promise.resolve({ success: true });
166 } else {
167 return Promise.resolve({ success: false });
168 }
169 }
170
171 releaseInterface(interfaceNumber) {
172 if (!this.opened_)
173 return Promise.resolve({ success: false });
174
175 if (this.currentConfiguration_ === undefined)
176 return Promise.resolve({ success: false });
177
178 if (this.claimedInterfaces_.has(interfaceNumber)) {
179 this.claimedInterfaces_.delete(interfaceNumber);
180 return Promise.resolve({ success: true });
181 } else {
182 return Promise.resolve({ success: false });
183 }
184 }
185
186 setInterfaceAlternateSetting(interfaceNumber, alternateSetting) {
187 if (!this.opened_ || this.currentConfiguration_ === undefined)
188 return Promise.resolve({ success: false });
189
190 if (!this.claimedInterfaces_.has(interfaceNumber))
191 return Promise.resolve({ success: false });
192
193 let iface = this.currentConfiguration_.interfaces.find(
194 iface => iface.interface_number == interfaceNumber);
195 if (iface === undefined)
196 return Promise.resolve({ success: false });
197
198 if (iface.alternates.some(
199 x => x.alternate_setting == alternateSetting)) {
200 this.claimedInterfaces_.set(interfaceNumber, alternateSetting);
201 return Promise.resolve({ success: true });
202 } else {
203 return Promise.resolve({ success: false });
204 }
205 }
206
207 reset() { throw 'Not implemented!'; }
208 clearHalt(endpoint) { throw 'Not implemented!'; }
209
210 controlTransferIn(params, length, timeout) {
211 return Promise.resolve({
212 status: device.TransferStatus.OK,
213 data: [length >> 8, length & 0xff, params.request, params.value >> 8,
214 params.value & 0xff, params.index >> 8, params.index & 0xff]
215 });
216 }
217
218 controlTransferOut(params, data, timeout) {
219 throw 'Not implemented!';
220 }
221 genericTransferIn(endpointNumber, length, timeout) {
222 throw 'Not implemented!';
223 }
224 genericTransferOut(endpointNumber, data, timeout) {
225 throw 'Not implemented!';
226 }
227 isochronousTransferIn(endpointNumber, numPackets, packetLength,
228 timeout) {
229 throw 'Not implemented!';
230 }
231 isochronousTransferOut(endpointNumber, packets, timeout) {
232 throw 'Not implemented!';
233 }
234 };
235
236 class MockDeviceManager extends deviceManager.DeviceManager.stubClass {
237 constructor() {
238 super();
239 this.router_ = null;
240 this.mockDevices_ = new Map();
241 this.addedDevices_ = [];
242 this.removedDevices_ = [];
243 this.deviceChangePromiseResolvers_ = [];
244 }
245
246 reset() {
247 this.mockDevices_.forEach(device => {
248 for (var handle of device.handles)
249 core.close(handle.pipe_);
250 this.removedDevices_.push(device.info);
251 });
252 this.mockDevices_.clear();
253 this.maybeResolveDeviceChangePromise();
254 }
255
256 addMockDevice(info) {
257 let device = {
258 info: info,
259 handles: []
260 };
261 this.mockDevices_.set(info.guid, device);
262 this.addedDevices_.push(info);
263 this.maybeResolveDeviceChangePromise();
264 }
265
266 removeMockDevice(info) {
267 let device = this.mockDevices_.get(info.guid);
268 for (var handle of device.handles)
269 core.close(handle.pipe_);
270 this.mockDevices_.delete(info.guid);
271 this.removedDevices_.push(info);
272 this.maybeResolveDeviceChangePromise();
273 }
274
275 bindToPipe(pipe) {
276 assert_equals(this.router_, null);
277 this.router_ = new router.Router(pipe);
278 this.router_.setIncomingReceiver(this);
279 }
280
281 getDevices(options) {
282 let devices = [];
283 this.mockDevices_.forEach(device => {
284 devices.push(device.info);
285 });
286 return Promise.resolve({ results: devices });
287 }
288
289 getDeviceChanges() {
290 let promise = new Promise((resolve, reject) => {
291 this.deviceChangePromiseResolvers_.push(resolve);
292 });
293 this.maybeResolveDeviceChangePromise();
294 return promise;
295 }
296
297 maybeResolveDeviceChangePromise() {
298 if (this.addedDevices_.length == 0 &&
299 this.removedDevices_.length == 0) {
300 return;
301 }
302
303 let resolve = this.deviceChangePromiseResolvers_.shift();
304 if (resolve === undefined)
305 return;
306
307 resolve({
308 changes: {
309 devices_added: this.addedDevices_,
310 devices_removed: this.removedDevices_
311 }
312 });
313 this.addedDevices_ = [];
314 this.removedDevices_ = [];
315 }
316
317 getDevice(guid, pipe) {
318 let device = this.mockDevices_.get(guid);
319 if (device !== undefined) {
320 var mock = new MockDevice(device.info, pipe);
321 device.handles.push(mock);
322 }
323 }
324 }
325
326 let mockDeviceManager = new MockDeviceManager;
327
328 serviceRegistry.addServiceOverrideForTesting(
329 deviceManager.DeviceManager.name,
330 pipe => {
331 mockDeviceManager.bindToPipe(pipe);
332 });
333
334 serviceRegistry.addServiceOverrideForTesting(
335 permissionProvider.PermissionProvider.name,
336 pipe => {
337 console.log('Connected to PermissionProvider!');
338 });
339
340 fakeUsbDevices.then(fakeDevices => {
341 resolve({
342 DeviceManager: deviceManager.DeviceManager,
343 Device: device.Device,
344 PermissionProvider: permissionProvider.PermissionProvider,
345 mockDeviceManager: mockDeviceManager,
346 fakeDevices: fakeDevices,
347 assertDeviceInfoEquals: assertDeviceInfoEquals,
348 assertConfigurationInfoEquals: assertConfigurationInfoEquals,
349 });
350 });
351 });
352 });
353
354 function usb_test(func, name, properties) {
355 mojo_test(mojo => {
356 usbMocks.then(usb => {
Ken Rockot(use gerrit already) 2016/02/23 23:12:48 and then you can just call: usbMocks(mojo).then(u
Reilly Grant (use Gerrit) 2016/02/24 20:18:47 Done.
357 let result = new Promise((resolve, reject) => {
358 try {
359 resolve(func(usb));
360 } catch (e) {
361 reject(e);
362 }
363 });
364 let cleanUp = () => usb.mockDeviceManager.reset();
365 result.then(cleanUp, cleanUp);
366 return result;
Ken Rockot(use gerrit already) 2016/02/23 23:12:49 nit: You can return result.then(cleanUp, cleanUp)
Reilly Grant (use Gerrit) 2016/02/24 20:18:47 Done.
367 });
368 }, name, properties);
369 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698