OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <script src="../resources/testharness.js"></script> | 2 <script src="../resources/testharness.js"></script> |
3 <script src="../resources/testharness-helpers.js"></script> | 3 <script src="../resources/testharness-helpers.js"></script> |
4 <script src="../resources/testharnessreport.js"></script> | 4 <script src="../resources/testharnessreport.js"></script> |
5 <script src="resources/bluetooth-helpers.js"></script> | 5 <script src="resources/bluetooth-helpers.js"></script> |
6 <script> | 6 <script> |
7 'use strict'; | 7 'use strict'; |
8 | 8 |
9 test(function(t) { assert_true(window.testRunner instanceof Object); t.done(); }
, | 9 test(function(t) { assert_true(window.testRunner instanceof Object); t.done(); }
, |
10 'window.testRunner is required for the following tests.'); | 10 'window.testRunner is required for the following tests.'); |
11 | 11 |
12 sequential_promise_test(() => { | 12 promise_test(() => { |
13 testRunner.setBluetoothMockDataSet('EmptyAdapter'); | 13 testRunner.setBluetoothMockDataSet('EmptyAdapter'); |
14 return assert_promise_rejects(requestDeviceWithKeyDown(), | 14 return assert_promise_rejects(requestDeviceWithKeyDown(), |
15 new TypeError()); | 15 new TypeError()); |
16 }, 'Requires an argument.'); | 16 }, 'Requires an argument.'); |
17 | 17 |
18 sequential_promise_test(() => { | 18 promise_test(() => { |
19 testRunner.setBluetoothMockDataSet('EmptyAdapter'); | 19 testRunner.setBluetoothMockDataSet('EmptyAdapter'); |
20 return assert_promise_rejects(requestDeviceWithKeyDown({}), | 20 return assert_promise_rejects(requestDeviceWithKeyDown({}), |
21 new TypeError()); | 21 new TypeError()); |
22 }, 'RequestDeviceOptions requires a |filters| member.'); | 22 }, 'RequestDeviceOptions requires a |filters| member.'); |
23 | 23 |
24 sequential_promise_test(() => { | 24 promise_test(() => { |
25 testRunner.setBluetoothMockDataSet('FailStartDiscoveryAdapter'); | 25 testRunner.setBluetoothMockDataSet('FailStartDiscoveryAdapter'); |
26 return assert_promise_rejects_with_message( | 26 return assert_promise_rejects_with_message( |
27 requestDeviceWithKeyDown({filters: [{services: ['generic_access']}]}), | 27 requestDeviceWithKeyDown({filters: [{services: ['generic_access']}]}), |
28 {name: 'NotFoundError', message: 'Couldn\'t start discovery session.'}, | 28 {name: 'NotFoundError', message: 'Couldn\'t start discovery session.'}, |
29 'The adapter failed to start a discovery session.'); | 29 'The adapter failed to start a discovery session.'); |
30 }, 'Discovery session fails to start.'); | 30 }, 'Discovery session fails to start.'); |
31 | 31 |
32 sequential_promise_test(() => { | 32 promise_test(() => { |
33 testRunner.setBluetoothMockDataSet('NotPresentAdapter'); | 33 testRunner.setBluetoothMockDataSet('NotPresentAdapter'); |
34 return assert_promise_rejects_with_message( | 34 return assert_promise_rejects_with_message( |
35 requestDeviceWithKeyDown({filters: [{services: ['generic_access']}]}), | 35 requestDeviceWithKeyDown({filters: [{services: ['generic_access']}]}), |
36 {name: 'NotFoundError', message: 'Bluetooth adapter not available.'}, | 36 {name: 'NotFoundError', message: 'Bluetooth adapter not available.'}, |
37 'Bluetooth adapter is not present.'); | 37 'Bluetooth adapter is not present.'); |
38 }, 'Reject with NotFoundError if the adapter is not present.'); | 38 }, 'Reject with NotFoundError if the adapter is not present.'); |
39 | 39 |
40 sequential_promise_test(() => { | 40 promise_test(() => { |
41 testRunner.setBluetoothMockDataSet('NotPoweredAdapter'); | 41 testRunner.setBluetoothMockDataSet('NotPoweredAdapter'); |
42 return assert_promise_rejects_with_message( | 42 return assert_promise_rejects_with_message( |
43 requestDeviceWithKeyDown({filters: [{services: ['generic_access']}]}), | 43 requestDeviceWithKeyDown({filters: [{services: ['generic_access']}]}), |
44 {name: 'NotFoundError', message: 'Bluetooth adapter is off.'}, | 44 {name: 'NotFoundError', message: 'Bluetooth adapter is off.'}, |
45 'Bluetooth adapter is not powered.'); | 45 'Bluetooth adapter is not powered.'); |
46 }, 'Reject with NotFoundError if the adapter is off.'); | 46 }, 'Reject with NotFoundError if the adapter is off.'); |
47 | 47 |
48 sequential_promise_test(() => { | 48 promise_test(() => { |
49 testRunner.setBluetoothMockDataSet('EmptyAdapter'); | 49 testRunner.setBluetoothMockDataSet('EmptyAdapter'); |
50 return assert_promise_rejects_with_message( | 50 return assert_promise_rejects_with_message( |
51 requestDeviceWithKeyDown({filters: [{services: ['generic_access']}]}), | 51 requestDeviceWithKeyDown({filters: [{services: ['generic_access']}]}), |
52 {name: 'NotFoundError', message: 'No Bluetooth devices in range.'}, | 52 {name: 'NotFoundError', message: 'No Bluetooth devices in range.'}, |
53 'No Bluetooth devices in range.'); | 53 'No Bluetooth devices in range.'); |
54 }, 'Reject with NotFoundError if there are no devices around.'); | 54 }, 'Reject with NotFoundError if there are no devices around.'); |
55 | 55 |
56 sequential_promise_test(() => { | 56 promise_test(() => { |
57 testRunner.setBluetoothMockDataSet('GenericAccessAdapter'); | 57 testRunner.setBluetoothMockDataSet('GenericAccessAdapter'); |
58 return Promise.all([ | 58 return Promise.all([ |
59 requestDeviceWithKeyDown({filters: [{services: [generic_access.alias]}]}), | 59 requestDeviceWithKeyDown({filters: [{services: [generic_access.alias]}]}), |
60 requestDeviceWithKeyDown({filters: [{services: [generic_access.name]}]}), | 60 requestDeviceWithKeyDown({filters: [{services: [generic_access.name]}]}), |
61 requestDeviceWithKeyDown({filters: [{services: [generic_access.uuid]}]}) | 61 requestDeviceWithKeyDown({filters: [{services: [generic_access.uuid]}]}) |
62 ]).then(devices => { | 62 ]).then(devices => { |
63 devices.forEach(device => { | 63 devices.forEach(device => { |
64 assert_equals(device.constructor.name, 'BluetoothDevice'); | 64 assert_equals(device.constructor.name, 'BluetoothDevice'); |
65 }); | 65 }); |
66 }); | 66 }); |
67 }, 'Mock will resolve.'); | 67 }, 'Mock will resolve.'); |
68 | 68 |
69 sequential_promise_test(() => { | 69 promise_test(() => { |
70 testRunner.setBluetoothMockDataSet('GenericAccessAdapter'); | 70 testRunner.setBluetoothMockDataSet('GenericAccessAdapter'); |
71 return assert_promise_rejects( | 71 return assert_promise_rejects( |
72 navigator.bluetooth.requestDevice({filters: [{services: ['generic_access']}]
}), | 72 navigator.bluetooth.requestDevice({filters: [{services: ['generic_access']}]
}), |
73 'SecurityError'); | 73 'SecurityError'); |
74 }, 'Requires a user gesture.'); | 74 }, 'Requires a user gesture.'); |
75 | 75 |
76 sequential_promise_test(() => { | 76 promise_test(() => { |
77 testRunner.setBluetoothMockDataSet('GenericAccessAdapter'); | 77 testRunner.setBluetoothMockDataSet('GenericAccessAdapter'); |
78 return callWithKeyDown(() => { | 78 return callWithKeyDown(() => { |
79 var first = navigator.bluetooth.requestDevice({filters: [{services: ['generi
c_access']}]}); | 79 var first = navigator.bluetooth.requestDevice({filters: [{services: ['generi
c_access']}]}); |
80 var second = navigator.bluetooth.requestDevice({filters: [{services: ['gener
ic_access']}]}); | 80 var second = navigator.bluetooth.requestDevice({filters: [{services: ['gener
ic_access']}]}); |
81 return Promise.all([ | 81 return Promise.all([ |
82 first.then(device => assert_equals(device.constructor.name, 'BluetoothDevi
ce')), | 82 first.then(device => assert_equals(device.constructor.name, 'BluetoothDevi
ce')), |
83 assert_promise_rejects(second, 'SecurityError'), | 83 assert_promise_rejects(second, 'SecurityError'), |
84 ]); | 84 ]); |
85 }); | 85 }); |
86 }, 'Consumes a user gesture.'); | 86 }, 'Consumes a user gesture.'); |
87 | 87 |
88 sequential_promise_test(() => { | 88 promise_test(() => { |
89 testRunner.setBluetoothMockDataSet('GenericAccessAdapter'); | 89 testRunner.setBluetoothMockDataSet('GenericAccessAdapter'); |
90 return Promise.all([ | 90 return Promise.all([ |
91 requestDeviceWithKeyDown({filters: [{services: [generic_access.alias]}]}), | 91 requestDeviceWithKeyDown({filters: [{services: [generic_access.alias]}]}), |
92 requestDeviceWithKeyDown({filters: [{services: [generic_access.name]}]}), | 92 requestDeviceWithKeyDown({filters: [{services: [generic_access.name]}]}), |
93 requestDeviceWithKeyDown({filters: [{services: [generic_access.uuid]}]}) | 93 requestDeviceWithKeyDown({filters: [{services: [generic_access.uuid]}]}) |
94 ]).then(devices => { | 94 ]).then(devices => { |
95 // requestDevice should return the same object if it was created | 95 // requestDevice should return the same object if it was created |
96 // earlier. https://crbug.com/495270 | 96 // earlier. https://crbug.com/495270 |
97 // TODO(ortuno): Change to assert_equals. | 97 // TODO(ortuno): Change to assert_equals. |
98 assert_not_equals(devices[0], devices[1]); | 98 assert_not_equals(devices[0], devices[1]); |
99 assert_not_equals(devices[1], devices[2]); | 99 assert_not_equals(devices[1], devices[2]); |
100 }); | 100 }); |
101 }, 'Returned device should always be the same.'); | 101 }, 'Returned device should always be the same.'); |
102 | 102 |
103 sequential_promise_test(() => { | 103 promise_test(() => { |
104 testRunner.setBluetoothMockDataSet('ScanFilterCheckingAdapter'); | 104 testRunner.setBluetoothMockDataSet('ScanFilterCheckingAdapter'); |
105 // The work of this test is done in the ScanFilterCheckingAdapter. It asserts | 105 // The work of this test is done in the ScanFilterCheckingAdapter. It asserts |
106 // that this requestDevice() call tells the platform to scan for only devices | 106 // that this requestDevice() call tells the platform to scan for only devices |
107 // that include the Battery, Glucose, or Heart Rate services. | 107 // that include the Battery, Glucose, or Heart Rate services. |
108 return requestDeviceWithKeyDown({ | 108 return requestDeviceWithKeyDown({ |
109 filters: [ | 109 filters: [ |
110 {services: ['battery_service']}, | 110 {services: ['battery_service']}, |
111 {services: ['glucose', 'heart_rate']} | 111 {services: ['glucose', 'heart_rate']} |
112 ], | 112 ], |
113 // The optionalServices shouldn't affect the platform's scan. | 113 // The optionalServices shouldn't affect the platform's scan. |
114 optionalServices: [generic_access.name] | 114 optionalServices: [generic_access.name] |
115 }); | 115 }); |
116 }, 'Filters restrict the platform\'s Bluetooth scan.'); | 116 }, 'Filters restrict the platform\'s Bluetooth scan.'); |
117 | 117 |
118 sequential_promise_test(() => { | 118 promise_test(() => { |
119 testRunner.setBluetoothMockDataSet('GlucoseHeartRateAdapter'); | 119 testRunner.setBluetoothMockDataSet('GlucoseHeartRateAdapter'); |
120 return requestDeviceWithKeyDown({filters: [{services: ['glucose']}]}) | 120 return requestDeviceWithKeyDown({filters: [{services: ['glucose']}]}) |
121 .then(device => assert_equals(device.name, 'Glucose Device')); | 121 .then(device => assert_equals(device.name, 'Glucose Device')); |
122 }, 'Simple filter selects matching device.'); | 122 }, 'Simple filter selects matching device.'); |
123 | 123 |
124 sequential_promise_test(() => { | 124 promise_test(() => { |
125 testRunner.setBluetoothMockDataSet('GlucoseHeartRateAdapter'); | 125 testRunner.setBluetoothMockDataSet('GlucoseHeartRateAdapter'); |
126 return requestDeviceWithKeyDown({ | 126 return requestDeviceWithKeyDown({ |
127 filters: [{services: ['generic_access', 'heart_rate']}] | 127 filters: [{services: ['generic_access', 'heart_rate']}] |
128 }).then(device => assert_equals(device.name, 'Heart Rate Device')); | 128 }).then(device => assert_equals(device.name, 'Heart Rate Device')); |
129 }, 'Filter with 2 services returns a matching device.'); | 129 }, 'Filter with 2 services returns a matching device.'); |
130 | 130 |
131 sequential_promise_test(() => { | 131 promise_test(() => { |
132 testRunner.setBluetoothMockDataSet('GlucoseHeartRateAdapter'); | 132 testRunner.setBluetoothMockDataSet('GlucoseHeartRateAdapter'); |
133 return requestDeviceWithKeyDown({ | 133 return requestDeviceWithKeyDown({ |
134 filters: [{services: ['battery_service']}, | 134 filters: [{services: ['battery_service']}, |
135 {services: ['heart_rate']}] | 135 {services: ['heart_rate']}] |
136 }).then(device => assert_equals(device.name, 'Heart Rate Device')); | 136 }).then(device => assert_equals(device.name, 'Heart Rate Device')); |
137 }, 'An extra filter doesn\'t prevent matching.'); | 137 }, 'An extra filter doesn\'t prevent matching.'); |
138 | 138 |
139 sequential_promise_test(() => { | 139 promise_test(() => { |
140 testRunner.setBluetoothMockDataSet('GlucoseHeartRateAdapter'); | 140 testRunner.setBluetoothMockDataSet('GlucoseHeartRateAdapter'); |
141 // Both devices support the Generic Access service, but things need to | 141 // Both devices support the Generic Access service, but things need to |
142 // support both services to pass the filter, and neither has a Battery | 142 // support both services to pass the filter, and neither has a Battery |
143 // service. | 143 // service. |
144 return assert_promise_rejects(requestDeviceWithKeyDown({ | 144 return assert_promise_rejects(requestDeviceWithKeyDown({ |
145 filters: [{services: ['generic_access', 'battery_service']}] | 145 filters: [{services: ['generic_access', 'battery_service']}] |
146 }), 'NotFoundError'); | 146 }), 'NotFoundError'); |
147 }, 'Too-strict filters do prevent matching.'); | 147 }, 'Too-strict filters do prevent matching.'); |
148 </script> | 148 </script> |
OLD | NEW |