summaryrefslogtreecommitdiffstats
path: root/dom/presentation/tests/xpcshell/test_presentation_device_manager.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/presentation/tests/xpcshell/test_presentation_device_manager.js')
-rw-r--r--dom/presentation/tests/xpcshell/test_presentation_device_manager.js244
1 files changed, 244 insertions, 0 deletions
diff --git a/dom/presentation/tests/xpcshell/test_presentation_device_manager.js b/dom/presentation/tests/xpcshell/test_presentation_device_manager.js
new file mode 100644
index 000000000..68f07df65
--- /dev/null
+++ b/dom/presentation/tests/xpcshell/test_presentation_device_manager.js
@@ -0,0 +1,244 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+'use strict';
+
+const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
+
+Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+Cu.import('resource://gre/modules/Services.jsm');
+
+const manager = Cc['@mozilla.org/presentation-device/manager;1']
+ .getService(Ci.nsIPresentationDeviceManager);
+
+function TestPresentationDevice() {}
+
+
+function TestPresentationControlChannel() {}
+
+TestPresentationControlChannel.prototype = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPresentationControlChannel]),
+ sendOffer: function(offer) {},
+ sendAnswer: function(answer) {},
+ disconnect: function() {},
+ launch: function() {},
+ terminate: function() {},
+ reconnect: function() {},
+ set listener(listener) {},
+ get listener() {},
+};
+
+var testProvider = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPresentationDeviceProvider]),
+
+ forceDiscovery: function() {
+ },
+ set listener(listener) {
+ },
+ get listener() {
+ },
+};
+
+const forbiddenRequestedUrl = 'http://example.com';
+var testDevice = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPresentationDevice]),
+ id: 'id',
+ name: 'name',
+ type: 'type',
+ establishControlChannel: function(url, presentationId) {
+ return null;
+ },
+ disconnect: function() {},
+ isRequestedUrlSupported: function(requestedUrl) {
+ return forbiddenRequestedUrl !== requestedUrl;
+ },
+};
+
+function addProvider() {
+ Object.defineProperty(testProvider, 'listener', {
+ configurable: true,
+ set: function(listener) {
+ Assert.strictEqual(listener, manager, 'listener setter is invoked by PresentationDeviceManager');
+ delete testProvider.listener;
+ run_next_test();
+ },
+ });
+ manager.addDeviceProvider(testProvider);
+}
+
+function forceDiscovery() {
+ testProvider.forceDiscovery = function() {
+ testProvider.forceDiscovery = function() {};
+ Assert.ok(true, 'forceDiscovery is invoked by PresentationDeviceManager');
+ run_next_test();
+ };
+ manager.forceDiscovery();
+}
+
+function addDevice() {
+ Services.obs.addObserver(function observer(subject, topic, data) {
+ Services.obs.removeObserver(observer, topic);
+
+ let updatedDevice = subject.QueryInterface(Ci.nsIPresentationDevice);
+ Assert.equal(updatedDevice.id, testDevice.id, 'expected device id');
+ Assert.equal(updatedDevice.name, testDevice.name, 'expected device name');
+ Assert.equal(updatedDevice.type, testDevice.type, 'expected device type');
+ Assert.equal(data, 'add', 'expected update type');
+
+ Assert.ok(manager.deviceAvailable, 'device is available');
+
+ let devices = manager.getAvailableDevices();
+ Assert.equal(devices.length, 1, 'expect 1 available device');
+
+ let device = devices.queryElementAt(0, Ci.nsIPresentationDevice);
+ Assert.equal(device.id, testDevice.id, 'expected device id');
+ Assert.equal(device.name, testDevice.name, 'expected device name');
+ Assert.equal(device.type, testDevice.type, 'expected device type');
+
+ run_next_test();
+ }, 'presentation-device-change', false);
+ manager.QueryInterface(Ci.nsIPresentationDeviceListener).addDevice(testDevice);
+}
+
+function updateDevice() {
+ Services.obs.addObserver(function observer(subject, topic, data) {
+ Services.obs.removeObserver(observer, topic);
+
+ let updatedDevice = subject.QueryInterface(Ci.nsIPresentationDevice);
+ Assert.equal(updatedDevice.id, testDevice.id, 'expected device id');
+ Assert.equal(updatedDevice.name, testDevice.name, 'expected device name');
+ Assert.equal(updatedDevice.type, testDevice.type, 'expected device type');
+ Assert.equal(data, 'update', 'expected update type');
+
+ Assert.ok(manager.deviceAvailable, 'device is available');
+
+ let devices = manager.getAvailableDevices();
+ Assert.equal(devices.length, 1, 'expect 1 available device');
+
+ let device = devices.queryElementAt(0, Ci.nsIPresentationDevice);
+ Assert.equal(device.id, testDevice.id, 'expected device id');
+ Assert.equal(device.name, testDevice.name, 'expected name after device update');
+ Assert.equal(device.type, testDevice.type, 'expected device type');
+
+ run_next_test();
+ }, 'presentation-device-change', false);
+ testDevice.name = 'updated-name';
+ manager.QueryInterface(Ci.nsIPresentationDeviceListener).updateDevice(testDevice);
+}
+
+function filterDevice() {
+ let presentationUrls = Cc['@mozilla.org/array;1'].createInstance(Ci.nsIMutableArray);
+ let url = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString);
+ url.data = forbiddenRequestedUrl;
+ presentationUrls.appendElement(url, false);
+ let devices = manager.getAvailableDevices(presentationUrls);
+ Assert.equal(devices.length, 0, 'expect 0 available device for example.com');
+ run_next_test();
+}
+
+function sessionRequest() {
+ let testUrl = 'http://www.example.org/';
+ let testPresentationId = 'test-presentation-id';
+ let testControlChannel = new TestPresentationControlChannel();
+ Services.obs.addObserver(function observer(subject, topic, data) {
+ Services.obs.removeObserver(observer, topic);
+
+ let request = subject.QueryInterface(Ci.nsIPresentationSessionRequest);
+
+ Assert.equal(request.device.id, testDevice.id, 'expected device');
+ Assert.equal(request.url, testUrl, 'expected requesting URL');
+ Assert.equal(request.presentationId, testPresentationId, 'expected presentation Id');
+
+ run_next_test();
+ }, 'presentation-session-request', false);
+ manager.QueryInterface(Ci.nsIPresentationDeviceListener)
+ .onSessionRequest(testDevice, testUrl, testPresentationId, testControlChannel);
+}
+
+function terminateRequest() {
+ let testUrl = 'http://www.example.org/';
+ let testPresentationId = 'test-presentation-id';
+ let testControlChannel = new TestPresentationControlChannel();
+ let testIsFromReceiver = true;
+ Services.obs.addObserver(function observer(subject, topic, data) {
+ Services.obs.removeObserver(observer, topic);
+
+ let request = subject.QueryInterface(Ci.nsIPresentationTerminateRequest);
+
+ Assert.equal(request.device.id, testDevice.id, 'expected device');
+ Assert.equal(request.presentationId, testPresentationId, 'expected presentation Id');
+ Assert.equal(request.isFromReceiver, testIsFromReceiver, 'expected isFromReceiver');
+
+ run_next_test();
+ }, 'presentation-terminate-request', false);
+ manager.QueryInterface(Ci.nsIPresentationDeviceListener)
+ .onTerminateRequest(testDevice, testPresentationId,
+ testControlChannel, testIsFromReceiver);
+}
+
+function reconnectRequest() {
+ let testUrl = 'http://www.example.org/';
+ let testPresentationId = 'test-presentation-id';
+ let testControlChannel = new TestPresentationControlChannel();
+ Services.obs.addObserver(function observer(subject, topic, data) {
+ Services.obs.removeObserver(observer, topic);
+
+ let request = subject.QueryInterface(Ci.nsIPresentationSessionRequest);
+
+ Assert.equal(request.device.id, testDevice.id, 'expected device');
+ Assert.equal(request.url, testUrl, 'expected requesting URL');
+ Assert.equal(request.presentationId, testPresentationId, 'expected presentation Id');
+
+ run_next_test();
+ }, 'presentation-reconnect-request', false);
+ manager.QueryInterface(Ci.nsIPresentationDeviceListener)
+ .onReconnectRequest(testDevice, testUrl, testPresentationId, testControlChannel);
+}
+
+function removeDevice() {
+ Services.obs.addObserver(function observer(subject, topic, data) {
+ Services.obs.removeObserver(observer, topic);
+
+ let updatedDevice = subject.QueryInterface(Ci.nsIPresentationDevice);
+ Assert.equal(updatedDevice.id, testDevice.id, 'expected device id');
+ Assert.equal(updatedDevice.name, testDevice.name, 'expected device name');
+ Assert.equal(updatedDevice.type, testDevice.type, 'expected device type');
+ Assert.equal(data, 'remove', 'expected update type');
+
+ Assert.ok(!manager.deviceAvailable, 'device is not available');
+
+ let devices = manager.getAvailableDevices();
+ Assert.equal(devices.length, 0, 'expect 0 available device');
+
+ run_next_test();
+ }, 'presentation-device-change', false);
+ manager.QueryInterface(Ci.nsIPresentationDeviceListener).removeDevice(testDevice);
+}
+
+function removeProvider() {
+ Object.defineProperty(testProvider, 'listener', {
+ configurable: true,
+ set: function(listener) {
+ Assert.strictEqual(listener, null, 'unsetListener is invoked by PresentationDeviceManager');
+ delete testProvider.listener;
+ run_next_test();
+ },
+ });
+ manager.removeDeviceProvider(testProvider);
+}
+
+add_test(addProvider);
+add_test(forceDiscovery);
+add_test(addDevice);
+add_test(updateDevice);
+add_test(filterDevice);
+add_test(sessionRequest);
+add_test(terminateRequest);
+add_test(reconnectRequest);
+add_test(removeDevice);
+add_test(removeProvider);
+
+function run_test() {
+ run_next_test();
+}