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.js288
1 files changed, 288 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 0000000000..e49a794ebc
--- /dev/null
+++ b/dom/presentation/tests/xpcshell/test_presentation_device_manager.js
@@ -0,0 +1,288 @@
+/* -*- 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 { Services } = ChromeUtils.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: ChromeUtils.generateQI(["nsIPresentationControlChannel"]),
+ sendOffer(offer) {},
+ sendAnswer(answer) {},
+ disconnect() {},
+ launch() {},
+ terminate() {},
+ reconnect() {},
+ set listener(listener) {},
+ get listener() {},
+};
+
+var testProvider = {
+ QueryInterface: ChromeUtils.generateQI(["nsIPresentationDeviceProvider"]),
+
+ forceDiscovery() {},
+ set listener(listener) {},
+ get listener() {},
+};
+
+const forbiddenRequestedUrl = "http://example.com";
+var testDevice = {
+ QueryInterface: ChromeUtils.generateQI(["nsIPresentationDevice"]),
+ id: "id",
+ name: "name",
+ type: "type",
+ establishControlChannel(url, presentationId) {
+ return null;
+ },
+ disconnect() {},
+ isRequestedUrlSupported(requestedUrl) {
+ return forbiddenRequestedUrl !== requestedUrl;
+ },
+};
+
+function addProvider() {
+ Object.defineProperty(testProvider, "listener", {
+ configurable: true,
+ set(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");
+ 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");
+ 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);
+ 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");
+ manager
+ .QueryInterface(Ci.nsIPresentationDeviceListener)
+ .onSessionRequest(
+ testDevice,
+ testUrl,
+ testPresentationId,
+ testControlChannel
+ );
+}
+
+function terminateRequest() {
+ 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");
+ 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");
+ 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");
+ manager
+ .QueryInterface(Ci.nsIPresentationDeviceListener)
+ .removeDevice(testDevice);
+}
+
+function removeProvider() {
+ Object.defineProperty(testProvider, "listener", {
+ configurable: true,
+ set(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);