'use strict'; // Run a set of tests for a given |sensorName|. // |readingData| is an object with 3 keys, all of which are arrays of arrays: // 1. "readings". Each value corresponds to one raw reading that will be // processed by a sensor. // 2. "expectedReadings". Each value corresponds to the processed value a // sensor will make available to users (i.e. a capped or rounded value). // Its length must match |readings|'. // 3. "expectedRemappedReadings" (optional). Similar to |expectedReadings|, but // used only by spatial sensors, whose reference frame can change the values // returned by a sensor. // Its length should match |readings|'. // |verificationFunction| is called to verify that a given reading matches a // value in |expectedReadings|. // |featurePolicies| represents |sensorName|'s associated sensor feature name. function runGenericSensorTests(sensorData, readingData) { validate_sensor_data(sensorData); validate_reading_data(readingData); const {sensorName, permissionName, testDriverName, featurePolicyNames} = sensorData; const sensorType = self[sensorName]; function sensor_test(func, name, properties) { promise_test(async t => { assert_implements(sensorName in self, `${sensorName} is not supported.`); const readings = new RingBuffer(readingData.readings); const expectedReadings = new RingBuffer(readingData.expectedReadings); const expectedRemappedReadings = readingData.expectedRemappedReadings ? new RingBuffer(readingData.expectedRemappedReadings) : undefined; return func(t, readings, expectedReadings, expectedRemappedReadings); }, name, properties); } sensor_test(async t => { await test_driver.set_permission({name: permissionName}, 'denied'); await test_driver.create_virtual_sensor(testDriverName); const sensor = new sensorType; t.add_cleanup(async () => { sensor.stop(); await test_driver.remove_virtual_sensor(testDriverName); }); const sensorWatcher = new EventWatcher(t, sensor, ['reading', 'error']); sensor.start(); const event = await sensorWatcher.wait_for('error'); assert_false(sensor.activated); assert_equals(event.error.name, 'NotAllowedError'); }, `${sensorName}: Test that onerror is sent when permissions are not\ granted.`); sensor_test(async t => { await test_driver.set_permission({name: permissionName}, 'granted'); await test_driver.create_virtual_sensor(testDriverName, {connected: false}); const sensor = new sensorType; t.add_cleanup(async () => { sensor.stop(); await test_driver.remove_virtual_sensor(testDriverName); }); const sensorWatcher = new EventWatcher(t, sensor, ['reading', 'error']); sensor.start(); const event = await sensorWatcher.wait_for('error'); assert_false(sensor.activated); assert_equals(event.error.name, 'NotReadableError'); }, `${sensorName}: Test that onerror is send when start() call has failed.`); sensor_test(async t => { await test_driver.set_permission({name: permissionName}, 'granted'); await test_driver.create_virtual_sensor(testDriverName); const sensor = new sensorType({frequency: 560}); t.add_cleanup(async () => { sensor.stop(); await test_driver.remove_virtual_sensor(testDriverName); }); const sensorWatcher = new EventWatcher(t, sensor, ['activate', 'error']); sensor.start(); await sensorWatcher.wait_for('activate'); const mockSensorInfo = await test_driver.get_virtual_sensor_information(testDriverName); assert_less_than_equal(mockSensorInfo.requestedSamplingFrequency, 60); }, `${sensorName}: Test that frequency is capped to allowed maximum.`); sensor_test(async t => { await test_driver.set_permission({name: permissionName}, 'granted'); const maxSupportedFrequency = 5; await test_driver.create_virtual_sensor( testDriverName, {maxSamplingFrequency: maxSupportedFrequency}); const sensor = new sensorType({frequency: 50}); t.add_cleanup(async () => { sensor.stop(); await test_driver.remove_virtual_sensor(testDriverName); }); const sensorWatcher = new EventWatcher(t, sensor, ['activate', 'error']); sensor.start(); await sensorWatcher.wait_for('activate'); const mockSensorInfo = await test_driver.get_virtual_sensor_information(testDriverName); assert_equals( mockSensorInfo.requestedSamplingFrequency, maxSupportedFrequency); }, `${sensorName}: Test that frequency is capped to the maximum supported\ frequency.`); sensor_test(async t => { await test_driver.set_permission({name: permissionName}, 'granted'); const minSupportedFrequency = 2; await test_driver.create_virtual_sensor( testDriverName, {minSamplingFrequency: minSupportedFrequency}); const sensor = new sensorType({frequency: -1}); t.add_cleanup(async () => { sensor.stop(); await test_driver.remove_virtual_sensor(testDriverName); }); const sensorWatcher = new EventWatcher(t, sensor, ['activate', 'error']); sensor.start(); await sensorWatcher.wait_for('activate'); const mockSensorInfo = await test_driver.get_virtual_sensor_information(testDriverName); assert_equals( mockSensorInfo.requestedSamplingFrequency, minSupportedFrequency); }, `${sensorName}: Test that frequency is limited to the minimum supported\ frequency.`); sensor_test(async t => { const iframe = document.createElement('iframe'); iframe.allow = featurePolicyNames.join(' \'none\'; ') + ' \'none\';'; iframe.srcdoc = '