'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(sensorName, readingData, verificationFunction, featurePolicies) { const sensorType = self[sensorName]; function validateReadingFormat(data) { return Array.isArray(data) && data.every(element => Array.isArray(element)); } const { readings, expectedReadings, expectedRemappedReadings } = readingData; if (!validateReadingFormat(readings)) { throw new TypeError('readingData.readings must be an array of arrays.'); } if (!validateReadingFormat(expectedReadings)) { throw new TypeError('readingData.expectedReadings must be an array of ' + 'arrays.'); } if (readings.length < expectedReadings.length) { throw new TypeError('readingData.readings\' length must be bigger than ' + 'or equal to readingData.expectedReadings\' length.'); } if (expectedRemappedReadings && !validateReadingFormat(expectedRemappedReadings)) { throw new TypeError('readingData.expectedRemappedReadings must be an ' + 'array of arrays.'); } if (expectedRemappedReadings && expectedReadings.length != expectedRemappedReadings.length) { throw new TypeError('readingData.expectedReadings and ' + 'readingData.expectedRemappedReadings must have the same ' + 'length.'); } sensor_test(async (t, sensorProvider) => { assert_implements(sensorName in self, `${sensorName} is not supported.`); sensorProvider.setGetSensorShouldFail(sensorName, true); const sensor = new sensorType; 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 sent when sensor is not supported.`); sensor_test(async (t, sensorProvider) => { assert_implements(sensorName in self, `${sensorName} is not supported.`); sensorProvider.setPermissionsDenied(sensorName, true); const sensor = new sensorType; 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, sensorProvider) => { assert_implements(sensorName in self, `${sensorName} is not supported.`); const sensor = new sensorType({frequency: 560}); const sensorWatcher = new EventWatcher(t, sensor, ["reading", "error"]); sensor.start(); const mockSensor = await sensorProvider.getCreatedSensor(sensorName); mockSensor.setStartShouldFail(true); 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, sensorProvider) => { assert_implements(sensorName in self, `${sensorName} is not supported.`); const sensor = new sensorType({frequency: 560}); const sensorWatcher = new EventWatcher(t, sensor, ["activate", "error"]); sensor.start(); const mockSensor = await sensorProvider.getCreatedSensor(sensorName); await sensorWatcher.wait_for("activate"); assert_less_than_equal(mockSensor.getSamplingFrequency(), 60); sensor.stop(); assert_false(sensor.activated); }, `${sensorName}: Test that frequency is capped to allowed maximum.`); sensor_test(async (t, sensorProvider) => { assert_implements(sensorName in self, `${sensorName} is not supported.`); const maxSupportedFrequency = 5; sensorProvider.setMaximumSupportedFrequency(maxSupportedFrequency); const sensor = new sensorType({frequency: 50}); const sensorWatcher = new EventWatcher(t, sensor, ["activate", "error"]); sensor.start(); const mockSensor = await sensorProvider.getCreatedSensor(sensorName); await sensorWatcher.wait_for("activate"); assert_equals(mockSensor.getSamplingFrequency(), maxSupportedFrequency); sensor.stop(); assert_false(sensor.activated); }, `${sensorName}: Test that frequency is capped to the maximum supported\ frequency.`); sensor_test(async (t, sensorProvider) => { assert_implements(sensorName in self, `${sensorName} is not supported.`); const minSupportedFrequency = 2; sensorProvider.setMinimumSupportedFrequency(minSupportedFrequency); const sensor = new sensorType({frequency: -1}); const sensorWatcher = new EventWatcher(t, sensor, ["activate", "error"]); sensor.start(); const mockSensor = await sensorProvider.getCreatedSensor(sensorName); await sensorWatcher.wait_for("activate"); assert_equals(mockSensor.getSamplingFrequency(), minSupportedFrequency); sensor.stop(); assert_false(sensor.activated); }, `${sensorName}: Test that frequency is limited to the minimum supported\ frequency.`); promise_test(async t => { assert_implements(sensorName in self, `${sensorName} is not supported.`); const iframe = document.createElement('iframe'); iframe.allow = featurePolicies.join(' \'none\'; ') + ' \'none\';'; iframe.srcdoc = '