diff options
Diffstat (limited to 'devtools/client/shared/remote-debugging/test/xpcshell')
5 files changed, 336 insertions, 0 deletions
diff --git a/devtools/client/shared/remote-debugging/test/xpcshell/.eslintrc.js b/devtools/client/shared/remote-debugging/test/xpcshell/.eslintrc.js new file mode 100644 index 0000000000..86bd54c245 --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/xpcshell/.eslintrc.js @@ -0,0 +1,6 @@ +"use strict"; + +module.exports = { + // Extend from the common devtools xpcshell eslintrc config. + extends: "../../../../../.eslintrc.xpcshell.js", +}; diff --git a/devtools/client/shared/remote-debugging/test/xpcshell/test_remote_client_manager.js b/devtools/client/shared/remote-debugging/test/xpcshell/test_remote_client_manager.js new file mode 100644 index 0000000000..e66c38b67d --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/xpcshell/test_remote_client_manager.js @@ -0,0 +1,153 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const { + remoteClientManager, +} = require("resource://devtools/client/shared/remote-debugging/remote-client-manager.js"); +const { + CONNECTION_TYPES, +} = require("resource://devtools/client/shared/remote-debugging/constants.js"); + +add_task(async function testRemoteClientManager() { + for (const type of Object.values(CONNECTION_TYPES)) { + const fakeClient = createFakeClient(); + const runtimeInfo = {}; + const clientId = "clientId"; + const remoteId = remoteClientManager.getRemoteId(clientId, type); + + const connectionType = + remoteClientManager.getConnectionTypeByRemoteId(remoteId); + equal( + connectionType, + type, + `[${type}]: Correct connection type was returned by getConnectionTypeByRemoteId` + ); + + equal( + remoteClientManager.hasClient(clientId, type), + false, + `[${type}]: hasClient returns false if no client was set` + ); + equal( + remoteClientManager.getClient(clientId, type), + null, + `[${type}]: getClient returns null if no client was set` + ); + equal( + remoteClientManager.getClientByRemoteId(remoteId), + null, + `[${type}]: getClientByRemoteId returns null if no client was set` + ); + equal( + remoteClientManager.getRuntimeInfoByRemoteId(remoteId), + null, + `[${type}]: getRuntimeInfoByRemoteId returns null if no client was set` + ); + + remoteClientManager.setClient(clientId, type, fakeClient, runtimeInfo); + equal( + remoteClientManager.hasClient(clientId, type), + true, + `[${type}]: hasClient returns true` + ); + equal( + remoteClientManager.getClient(clientId, type), + fakeClient, + `[${type}]: getClient returns the correct client` + ); + equal( + remoteClientManager.getClientByRemoteId(remoteId), + fakeClient, + `[${type}]: getClientByRemoteId returns the correct client` + ); + equal( + remoteClientManager.getRuntimeInfoByRemoteId(remoteId), + runtimeInfo, + `[${type}]: getRuntimeInfoByRemoteId returns the correct object` + ); + + remoteClientManager.removeClient(clientId, type); + equal( + remoteClientManager.hasClient(clientId, type), + false, + `[${type}]: hasClient returns false after removing the client` + ); + equal( + remoteClientManager.getClient(clientId, type), + null, + `[${type}]: getClient returns null after removing the client` + ); + equal( + remoteClientManager.getClientByRemoteId(remoteId), + null, + `[${type}]: getClientByRemoteId returns null after removing the client` + ); + equal( + remoteClientManager.getRuntimeInfoByRemoteId(), + null, + `[${type}]: getRuntimeInfoByRemoteId returns null after removing the client` + ); + } + + // Test various fallback scenarios for APIs relying on remoteId, when called without a + // remoteId, we expect to get the information for the local this-firefox runtime. + const { THIS_FIREFOX } = CONNECTION_TYPES; + const thisFirefoxClient = createFakeClient(); + const thisFirefoxInfo = {}; + remoteClientManager.setClient( + THIS_FIREFOX, + THIS_FIREFOX, + thisFirefoxClient, + thisFirefoxInfo + ); + + equal( + remoteClientManager.getClientByRemoteId(), + thisFirefoxClient, + `[fallback]: getClientByRemoteId returns this-firefox if remoteId is null` + ); + equal( + remoteClientManager.getRuntimeInfoByRemoteId(), + thisFirefoxInfo, + `[fallback]: getRuntimeInfoByRemoteId returns this-firefox if remoteId is null` + ); + + const otherRemoteId = remoteClientManager.getRemoteId( + "clientId", + CONNECTION_TYPES.USB + ); + equal( + remoteClientManager.getClientByRemoteId(otherRemoteId), + null, + `[fallback]: getClientByRemoteId does not fallback if remoteId is non-null` + ); + equal( + remoteClientManager.getRuntimeInfoByRemoteId(otherRemoteId), + null, + `[fallback]: getRuntimeInfoByRemoteId does not fallback if remoteId is non-null` + ); +}); + +add_task(async function testRemoteClientManagerWithUnknownType() { + const remoteId = remoteClientManager.getRemoteId( + "someClientId", + "NotARealType" + ); + const connectionType = + remoteClientManager.getConnectionTypeByRemoteId(remoteId); + equal( + connectionType, + CONNECTION_TYPES.UNKNOWN, + `Connection type UNKNOWN was returned by getConnectionTypeByRemoteId` + ); +}); + +function createFakeClient() { + const EventEmitter = require("resource://devtools/shared/event-emitter.js"); + + const client = {}; + EventEmitter.decorate(client); + return client; +} diff --git a/devtools/client/shared/remote-debugging/test/xpcshell/test_version_checker.js b/devtools/client/shared/remote-debugging/test/xpcshell/test_version_checker.js new file mode 100644 index 0000000000..92f7d54a1e --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/xpcshell/test_version_checker.js @@ -0,0 +1,159 @@ +/* global equal */ + +"use strict"; + +const { + _compareVersionCompatibility, + checkVersionCompatibility, + COMPATIBILITY_STATUS, +} = require("resource://devtools/client/shared/remote-debugging/version-checker.js"); + +const TEST_DATA = [ + { + description: "same build date and same version number", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "60.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same build date and older version in range (-1)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "59.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same build date and older version in range (-2)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "58.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same build date and older version in range (-2 Nightly)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "58.0a1", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same build date and older version out of range (-3)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "57.0", + expected: COMPATIBILITY_STATUS.TOO_OLD, + }, + { + description: "same build date and newer version out of range (+1)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "61.0", + expected: COMPATIBILITY_STATUS.TOO_RECENT, + }, + { + description: "same major version and build date in range (-10 days)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190121000000", + runtimeVersion: "60.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same major version and build date in range (+2 days)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190202000000", + runtimeVersion: "60.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same major version and build date out of range (+8 days)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190208000000", + runtimeVersion: "60.0", + expected: COMPATIBILITY_STATUS.TOO_RECENT, + }, + { + description: + "fennec 68 compatibility error not raised for 68 -> 68 Android", + localBuildId: "20190131000000", + localVersion: "68.0", + runtimeBuildId: "20190202000000", + runtimeVersion: "68.0", + runtimeOs: "Android", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: + "fennec 68 compatibility error not raised for 70 -> 68 Android", + localBuildId: "20190131000000", + localVersion: "70.0", + runtimeBuildId: "20190202000000", + runtimeVersion: "68.0", + runtimeOs: "Android", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "fennec 68 compatibility error raised for 71 -> 68 Android", + localBuildId: "20190131000000", + localVersion: "71.0", + runtimeBuildId: "20190202000000", + runtimeVersion: "68.0", + runtimeOs: "Android", + expected: COMPATIBILITY_STATUS.TOO_OLD_FENNEC, + }, + { + description: + "fennec 68 compatibility error not raised for 71 -> 68 non-Android", + localBuildId: "20190131000000", + localVersion: "71.0", + runtimeBuildId: "20190202000000", + runtimeVersion: "68.0", + runtimeOs: "NotAndroid", + expected: COMPATIBILITY_STATUS.TOO_OLD, + }, +]; + +add_task(async function testVersionChecker() { + for (const testData of TEST_DATA) { + const localDescription = { + appbuildid: testData.localBuildId, + platformversion: testData.localVersion, + }; + + const runtimeDescription = { + appbuildid: testData.runtimeBuildId, + platformversion: testData.runtimeVersion, + os: testData.runtimeOs, + }; + + const report = _compareVersionCompatibility( + localDescription, + runtimeDescription + ); + equal( + report.status, + testData.expected, + "Expected status for test: " + testData.description + ); + } +}); + +add_task(async function testVersionCheckWithVeryOldClient() { + // Use an empty object as devtools client, calling any method on it will fail. + const emptyClient = {}; + const report = await checkVersionCompatibility(emptyClient); + equal( + report.status, + COMPATIBILITY_STATUS.TOO_OLD, + "Report status too old if devtools client is not implementing expected interface" + ); +}); diff --git a/devtools/client/shared/remote-debugging/test/xpcshell/xpcshell-head.js b/devtools/client/shared/remote-debugging/test/xpcshell/xpcshell-head.js new file mode 100644 index 0000000000..733c0400da --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/xpcshell/xpcshell-head.js @@ -0,0 +1,10 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* eslint no-unused-vars: [2, {"vars": "local"}] */ + +const { require } = ChromeUtils.importESModule( + "resource://devtools/shared/loader/Loader.sys.mjs" +); diff --git a/devtools/client/shared/remote-debugging/test/xpcshell/xpcshell.ini b/devtools/client/shared/remote-debugging/test/xpcshell/xpcshell.ini new file mode 100644 index 0000000000..0579b8a674 --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/xpcshell/xpcshell.ini @@ -0,0 +1,8 @@ +[DEFAULT] +tags = devtools +head = xpcshell-head.js +firefox-appdir = browser +skip-if = toolkit == 'android' + +[test_remote_client_manager.js] +[test_version_checker.js] |