Index: extensions/test/data/api_test/audio/test.js |
diff --git a/extensions/test/data/api_test/audio/test.js b/extensions/test/data/api_test/audio/test.js |
index 6261cc44d9b513ea51ad1e3ade9b3d4b75b2b1e0..f79afa85b7cc6f14829ea09c20103d42b7eef670 100644 |
--- a/extensions/test/data/api_test/audio/test.js |
+++ b/extensions/test/data/api_test/audio/test.js |
@@ -2,123 +2,210 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-function verifyGetInfoOutput(outputs) { |
- chrome.test.assertEq("30001", outputs[0].id); |
- chrome.test.assertEq("Jabra Speaker: Jabra Speaker 1", outputs[0].name); |
- |
- chrome.test.assertEq("30002", outputs[1].id); |
- chrome.test.assertEq("Jabra Speaker: Jabra Speaker 2", outputs[1].name); |
- |
- chrome.test.assertEq("30003", outputs[2].id); |
- chrome.test.assertEq("HDMI output: HDA Intel MID", outputs[2].name); |
-} |
- |
-function verifyGetInfoInput(inputs) { |
- chrome.test.assertEq("40001", inputs[0].id); |
- chrome.test.assertEq("Jabra Mic: Jabra Mic 1", inputs[0].name); |
- |
- chrome.test.assertEq("40002", inputs[1].id); |
- chrome.test.assertEq("Jabra Mic: Jabra Mic 2", inputs[1].name); |
- |
- chrome.test.assertEq("40003", inputs[2].id); |
- chrome.test.assertEq("Webcam Mic: Logitech Webcam", inputs[2].name); |
-} |
- |
-function verifyActiveDevices(output_id, input_id) { |
- chrome.audio.getInfo( |
- chrome.test.callbackPass(function(outputInfo, inputInfo) { |
- var outputFound = false; |
- var inputFound = false; |
- for (var i = 0; i < outputInfo.length; ++i) { |
- if (outputInfo[i].isActive) { |
- chrome.test.assertTrue(outputInfo[i].id == output_id); |
- outputFound = true; |
- } |
- } |
- for (var i = 0; i < inputInfo.length; ++i) { |
- if (inputInfo[i].isActive) { |
- chrome.test.assertTrue(inputInfo[i].id == input_id); |
- inputFound = true; |
- } |
- } |
- chrome.test.assertTrue(outputFound); |
- chrome.test.assertTrue(inputFound); |
- })); |
+/** |
+ * Asserts that device property values match properties in |expectedProperties|. |
+ * The method will *not* assert that the device contains *only* properties |
+ * specified in expected properties. |
+ * @param {Object} expectedProperties Expected device properties. |
+ * @param {Object} device Device object to test. |
+ */ |
+function assertDeviceMatches(expectedProperties, device) { |
+ Object.keys(expectedProperties).forEach(function(key) { |
+ chrome.test.assertEq(expectedProperties[key], device[key], |
+ 'Property ' + key + ' of device ' + device.id); |
+ }); |
} |
+/** |
+ * Verifies that list of devices contains all and only devices from set of |
+ * expected devices. If will fail the test if an unexpected device is found. |
+ * |
+ * @param {Object.<string, Object>} expectedDevices Expected set of test |
+ * devices. Maps device ID to device properties. |
+ * @param {Array.<Object>} devices List of input devices. |
+ */ |
+function assertDevicesMatch(expectedDevices, devices) { |
+ var deviceIds = {}; |
+ devices.forEach(function(device) { |
+ chrome.test.assertFalse(!!deviceIds[device.id], |
+ 'Duplicated device id: \'' + device.id + '\'.'); |
+ deviceIds[device.id] = true; |
+ }); |
-function verifyDeviceProperties(output_id, input_id, |
- output_props, input_props) { |
- chrome.audio.getInfo( |
- chrome.test.callbackPass(function(outputInfo, inputInfo) { |
- var outputFound = false; |
- var inputFound = false; |
- for (var i = 0; i < outputInfo.length; ++i) { |
- if (outputInfo[i].id == output_id) { |
- chrome.test.assertEq(output_props.volume, outputInfo[i].volume); |
- chrome.test.assertEq(output_props.isMuted, outputInfo[i].isMuted); |
- outputFound = true; |
- } |
- } |
- for (var i = 0; i < inputInfo.length; ++i) { |
- if (inputInfo[i].id == input_id) { |
- chrome.test.assertEq(input_props.gain, inputInfo[i].gain); |
- chrome.test.assertEq(input_props.isMuted, inputInfo[i].isMuted); |
- inputFound = true; |
- } |
- } |
- chrome.test.assertTrue(outputFound); |
- chrome.test.assertTrue(inputFound); |
- })); |
-} |
- |
+ function sortedKeys(obj) { |
+ return Object.keys(obj).sort(); |
+ } |
+ chrome.test.assertEq(sortedKeys(expectedDevices), sortedKeys(deviceIds)); |
-function setActiveDevicesAndVerify(output_id, input_id) { |
- chrome.audio.setActiveDevices([output_id, input_id], |
- chrome.test.callbackPass(function() { |
- verifyActiveDevices(output_id, input_id); |
- })); |
+ devices.forEach(function(device) { |
+ assertDeviceMatches(expectedDevices[device.id], device); |
+ }); |
} |
-function setPropertiesAndVerify(outputInfo, inputInfo) { |
- var outputProps = new Object; |
- outputProps.isMuted = true; |
- outputProps.volume = 55; |
- chrome.audio.setProperties(outputInfo.id, outputProps, |
- chrome.test.callbackPass(function() { |
- // Once the output properties have been set, set input properties, then |
- // verify. |
- var inputProps = new Object; |
- inputProps.isMuted = true; |
- inputProps.gain = 35; |
- chrome.audio.setProperties(inputInfo.id, inputProps, |
- chrome.test.callbackPass(function() { |
- verifyDeviceProperties(outputInfo.id, inputInfo.id, |
- outputProps, inputProps); |
- })); |
- })); |
+/** |
+ * |
+ * @param {Array.<Object>} devices List of devices returned by getInfo |
+ * @returns {Object.<string, Object>} List of devices formatted as map of |
+ * expected devices used to assert devices match expectation. |
+ */ |
+function deviceListToExpectedDevicesMap(devices) { |
+ var expectedDevicesMap = {}; |
+ devices.forEach(function(device) { |
+ expectedDevicesMap[device.id] = device; |
+ }); |
+ return expectedDevicesMap; |
} |
chrome.test.runTests([ |
function getInfoTest() { |
+ // Test output devices. Maps device ID -> tested device properties. |
+ var kTestOutputDevices = { |
+ '30001': { |
+ id: '30001', |
+ name: 'Jabra Speaker: Jabra Speaker 1' |
+ }, |
+ '30002': { |
+ id: '30002', |
+ name: 'Jabra Speaker: Jabra Speaker 2' |
+ }, |
+ '30003': { |
+ id: '30003', |
+ name: 'HDMI output: HDA Intel MID' |
+ } |
+ }; |
+ |
+ // Test input devices. Maps device ID -> tested device properties. |
+ var kTestInputDevices = { |
+ '40001': { |
+ id: '40001', |
+ name: 'Jabra Mic: Jabra Mic 1' |
+ }, |
+ '40002': { |
+ id: '40002', |
+ name: 'Jabra Mic: Jabra Mic 2' |
+ }, |
+ '40003': { |
+ id: '40003', |
+ name: 'Webcam Mic: Logitech Webcam' |
+ } |
+ }; |
+ |
chrome.audio.getInfo( |
chrome.test.callbackPass(function(outputInfo, inputInfo) { |
- verifyGetInfoOutput(outputInfo); |
- verifyGetInfoInput(inputInfo); |
- })); |
+ assertDevicesMatch(kTestOutputDevices, outputInfo); |
+ assertDevicesMatch(kTestInputDevices, inputInfo); |
+ })); |
}, |
function setActiveDevicesTest() { |
- chrome.audio.getInfo( |
- chrome.test.callbackPass(function(outputInfo, inputInfo) { |
- setActiveDevicesAndVerify(outputInfo[2].id, inputInfo[1].id); |
+ //Test output devices. Maps device ID -> tested device properties. |
+ var kTestOutputDevices = { |
+ '30001': { |
+ id: '30001', |
+ isActive: false |
+ }, |
+ '30002': { |
+ id: '30002', |
+ isActive: false |
+ }, |
+ '30003': { |
+ id: '30003', |
+ isActive: true |
+ } |
+ }; |
+ |
+ // Test input devices. Maps device ID -> tested device properties. |
+ var kTestInputDevices = { |
+ '40001': { |
+ id: '40001', |
+ isActive: false |
+ }, |
+ '40002': { |
+ id: '40002', |
+ isActive: true |
+ }, |
+ '40003': { |
+ id: '40003', |
+ isActive: false |
+ } |
+ }; |
+ |
+ chrome.audio.setActiveDevices([ |
+ '30003', |
+ '40002' |
+ ], chrome.test.callbackPass(function() { |
+ chrome.audio.getInfo( |
+ chrome.test.callbackPass(function(outputInfo, inputInfo) { |
+ assertDevicesMatch(kTestOutputDevices, outputInfo); |
+ assertDevicesMatch(kTestInputDevices, inputInfo); |
+ })); |
})); |
}, |
function setPropertiesTest() { |
- chrome.audio.getInfo( |
- chrome.test.callbackPass(function(outputInfo, inputInfo) { |
- setPropertiesAndVerify(outputInfo[0], inputInfo[1]); |
- })); |
+ chrome.audio.getInfo(function(originalOutputInfo, originalInputInfo) { |
+ chrome.test.assertNoLastError(); |
+ |
+ var expectedInput = deviceListToExpectedDevicesMap(originalInputInfo); |
+ // Update expected input devices with values that should be changed in |
+ // test. |
+ var updatedInput = expectedInput['40002']; |
+ chrome.test.assertFalse(updatedInput.isMuted); |
+ chrome.test.assertFalse(updatedInput.gain === 55); |
+ updatedInput.isMuted = true; |
+ updatedInput.gain = 55; |
+ |
+ var expectedOutput = deviceListToExpectedDevicesMap(originalOutputInfo); |
+ // Update expected output devices with values that should be changed in |
+ // test. |
+ var updatedOutput = expectedOutput['30001']; |
+ chrome.test.assertFalse(updatedOutput.isMuted); |
+ chrome.test.assertFalse(updatedOutput.volume === 35); |
+ updatedOutput.isMuted = true; |
+ updatedOutput.volume = 35; |
+ |
+ chrome.audio.setProperties('30001', { |
+ isMuted: true, |
+ volume: 35 |
+ }, chrome.test.callbackPass(function() { |
+ chrome.audio.setProperties('40002', { |
+ isMuted: true, |
+ gain: 55 |
+ }, chrome.test.callbackPass(function() { |
+ chrome.audio.getInfo( |
+ chrome.test.callbackPass(function(outputInfo, inputInfo) { |
+ assertDevicesMatch(expectedInput, inputInfo); |
+ assertDevicesMatch(expectedOutput, outputInfo); |
+ })); |
+ })); |
+ })); |
+ }); |
+ }, |
+ |
+ function setPropertiesInvalidValuesTest() { |
+ chrome.audio.getInfo(function(originalOutputInfo, originalInputInfo) { |
+ chrome.test.assertNoLastError(); |
+ var expectedInput = deviceListToExpectedDevicesMap(originalInputInfo); |
+ var expectedOutput = deviceListToExpectedDevicesMap(originalOutputInfo); |
+ |
+ chrome.audio.setProperties('30001', { |
+ isMuted: true, |
+ // Output device - should have volume set. |
+ gain: 55 |
+ }, chrome.test.callbackFail('Could not set properties', function() { |
+ chrome.audio.setProperties('40002', { |
+ isMuted: true, |
+ // Input device - should have gain set. |
+ volume:55 |
+ }, chrome.test.callbackFail('Could not set properties', function() { |
+ // Assert that device properties haven't changed. |
+ chrome.audio.getInfo( |
+ chrome.test.callbackPass(function(outputInfo, inputInfo) { |
+ assertDevicesMatch(expectedOutput, outputInfo); |
+ assertDevicesMatch(expectedInput, inputInfo); |
+ })); |
+ })); |
+ })); |
+ }); |
} |
]); |