diff options
author | Matt A. Tobin <email@mattatobin.com> | 2020-02-25 15:07:00 -0500 |
---|---|---|
committer | Matt A. Tobin <email@mattatobin.com> | 2020-02-25 15:07:00 -0500 |
commit | 0ddd00f1959c78ce37c14fef3c83401408fca3bf (patch) | |
tree | d408e02767c86cf8aac3acbb86722b03c77ede6f /toolkit/components/passwordmgr/test/unit/test_logins_change.js | |
parent | 20f0905b33cbb18d1caa80c55e2f552c2e18957b (diff) | |
download | UXP-0ddd00f1959c78ce37c14fef3c83401408fca3bf.tar UXP-0ddd00f1959c78ce37c14fef3c83401408fca3bf.tar.gz UXP-0ddd00f1959c78ce37c14fef3c83401408fca3bf.tar.lz UXP-0ddd00f1959c78ce37c14fef3c83401408fca3bf.tar.xz UXP-0ddd00f1959c78ce37c14fef3c83401408fca3bf.zip |
Issue #439 - Remove tests from toolkit/
Diffstat (limited to 'toolkit/components/passwordmgr/test/unit/test_logins_change.js')
-rw-r--r-- | toolkit/components/passwordmgr/test/unit/test_logins_change.js | 384 |
1 files changed, 0 insertions, 384 deletions
diff --git a/toolkit/components/passwordmgr/test/unit/test_logins_change.js b/toolkit/components/passwordmgr/test/unit/test_logins_change.js deleted file mode 100644 index 79c6d2f54..000000000 --- a/toolkit/components/passwordmgr/test/unit/test_logins_change.js +++ /dev/null @@ -1,384 +0,0 @@ -/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ -/* vim: set ts=2 et sw=2 tw=80: */ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -/** - * Tests methods that add, remove, and modify logins. - */ - -"use strict"; - -// Globals - -/** - * Verifies that the specified login is considered invalid by addLogin and by - * modifyLogin with both nsILoginInfo and nsIPropertyBag arguments. - * - * This test requires that the login store is empty. - * - * @param aLoginInfo - * nsILoginInfo corresponding to an invalid login. - * @param aExpectedError - * This argument is passed to the "Assert.throws" test to determine which - * error is expected from the modification functions. - */ -function checkLoginInvalid(aLoginInfo, aExpectedError) -{ - // Try to add the new login, and verify that no data is stored. - Assert.throws(() => Services.logins.addLogin(aLoginInfo), aExpectedError); - LoginTestUtils.checkLogins([]); - - // Add a login for the modification tests. - let testLogin = TestData.formLogin({ hostname: "http://modify.example.com" }); - Services.logins.addLogin(testLogin); - - // Try to modify the existing login using nsILoginInfo and nsIPropertyBag. - Assert.throws(() => Services.logins.modifyLogin(testLogin, aLoginInfo), - aExpectedError); - Assert.throws(() => Services.logins.modifyLogin(testLogin, newPropertyBag({ - hostname: aLoginInfo.hostname, - formSubmitURL: aLoginInfo.formSubmitURL, - httpRealm: aLoginInfo.httpRealm, - username: aLoginInfo.username, - password: aLoginInfo.password, - usernameField: aLoginInfo.usernameField, - passwordField: aLoginInfo.passwordField, - })), aExpectedError); - - // Verify that no data was stored by the previous calls. - LoginTestUtils.checkLogins([testLogin]); - Services.logins.removeLogin(testLogin); -} - -/** - * Verifies that two objects are not the same instance - * but have equal attributes. - * - * @param {Object} objectA - * An object to compare. - * - * @param {Object} objectB - * Another object to compare. - * - * @param {string[]} attributes - * Attributes to compare. - * - * @return true if all passed attributes are equal for both objects, false otherwise. - */ -function compareAttributes(objectA, objectB, attributes) { - // If it's the same object, we want to return false. - if (objectA == objectB) { - return false; - } - return attributes.every(attr => objectA[attr] == objectB[attr]); -} - -// Tests - -/** - * Tests that adding logins to the database works. - */ -add_task(function test_addLogin_removeLogin() -{ - // Each login from the test data should be valid and added to the list. - for (let loginInfo of TestData.loginList()) { - Services.logins.addLogin(loginInfo); - } - LoginTestUtils.checkLogins(TestData.loginList()); - - // Trying to add each login again should result in an error. - for (let loginInfo of TestData.loginList()) { - Assert.throws(() => Services.logins.addLogin(loginInfo), /already exists/); - } - - // Removing each login should succeed. - for (let loginInfo of TestData.loginList()) { - Services.logins.removeLogin(loginInfo); - } - - LoginTestUtils.checkLogins([]); -}); - -/** - * Tests invalid combinations of httpRealm and formSubmitURL. - * - * For an nsILoginInfo to be valid for storage, one of the two properties should - * be strictly equal to null, and the other must not be null or an empty string. - * - * The legacy case of an empty string in formSubmitURL and a null value in - * httpRealm is also supported for storage at the moment. - */ -add_task(function test_invalid_httpRealm_formSubmitURL() -{ - // httpRealm === null, formSubmitURL === null - checkLoginInvalid(TestData.formLogin({ formSubmitURL: null }), - /without a httpRealm or formSubmitURL/); - - // httpRealm === "", formSubmitURL === null - checkLoginInvalid(TestData.authLogin({ httpRealm: "" }), - /without a httpRealm or formSubmitURL/); - - // httpRealm === null, formSubmitURL === "" - // This is not enforced for now. - // checkLoginInvalid(TestData.formLogin({ formSubmitURL: "" }), - // /without a httpRealm or formSubmitURL/); - - // httpRealm === "", formSubmitURL === "" - checkLoginInvalid(TestData.formLogin({ formSubmitURL: "", httpRealm: "" }), - /both a httpRealm and formSubmitURL/); - - // !!httpRealm, !!formSubmitURL - checkLoginInvalid(TestData.formLogin({ httpRealm: "The HTTP Realm" }), - /both a httpRealm and formSubmitURL/); - - // httpRealm === "", !!formSubmitURL - checkLoginInvalid(TestData.formLogin({ httpRealm: "" }), - /both a httpRealm and formSubmitURL/); - - // !!httpRealm, formSubmitURL === "" - checkLoginInvalid(TestData.authLogin({ formSubmitURL: "" }), - /both a httpRealm and formSubmitURL/); -}); - -/** - * Tests null or empty values in required login properties. - */ -add_task(function test_missing_properties() -{ - checkLoginInvalid(TestData.formLogin({ hostname: null }), - /null or empty hostname/); - - checkLoginInvalid(TestData.formLogin({ hostname: "" }), - /null or empty hostname/); - - checkLoginInvalid(TestData.formLogin({ username: null }), - /null username/); - - checkLoginInvalid(TestData.formLogin({ password: null }), - /null or empty password/); - - checkLoginInvalid(TestData.formLogin({ password: "" }), - /null or empty password/); -}); - -/** - * Tests invalid NUL characters in nsILoginInfo properties. - */ -add_task(function test_invalid_characters() -{ - let loginList = [ - TestData.authLogin({ hostname: "http://null\0X.example.com" }), - TestData.authLogin({ httpRealm: "realm\0" }), - TestData.formLogin({ formSubmitURL: "http://null\0X.example.com" }), - TestData.formLogin({ usernameField: "field\0_null" }), - TestData.formLogin({ usernameField: ".\0" }), // Special single dot case - TestData.formLogin({ passwordField: "field\0_null" }), - TestData.formLogin({ username: "user\0name" }), - TestData.formLogin({ password: "pass\0word" }), - ]; - for (let loginInfo of loginList) { - checkLoginInvalid(loginInfo, /login values can't contain nulls/); - } -}); - -/** - * Tests removing a login that does not exists. - */ -add_task(function test_removeLogin_nonexisting() -{ - Assert.throws(() => Services.logins.removeLogin(TestData.formLogin()), - /No matching logins/); -}); - -/** - * Tests removing all logins at once. - */ -add_task(function test_removeAllLogins() -{ - for (let loginInfo of TestData.loginList()) { - Services.logins.addLogin(loginInfo); - } - Services.logins.removeAllLogins(); - LoginTestUtils.checkLogins([]); - - // The function should also work when there are no logins to delete. - Services.logins.removeAllLogins(); -}); - -/** - * Tests the modifyLogin function with an nsILoginInfo argument. - */ -add_task(function test_modifyLogin_nsILoginInfo() -{ - let loginInfo = TestData.formLogin(); - let updatedLoginInfo = TestData.formLogin({ - username: "new username", - password: "new password", - usernameField: "new_form_field_username", - passwordField: "new_form_field_password", - }); - let differentLoginInfo = TestData.authLogin(); - - // Trying to modify a login that does not exist should throw. - Assert.throws(() => Services.logins.modifyLogin(loginInfo, updatedLoginInfo), - /No matching logins/); - - // Add the first form login, then modify it to match the second. - Services.logins.addLogin(loginInfo); - Services.logins.modifyLogin(loginInfo, updatedLoginInfo); - - // The data should now match the second login. - LoginTestUtils.checkLogins([updatedLoginInfo]); - Assert.throws(() => Services.logins.modifyLogin(loginInfo, updatedLoginInfo), - /No matching logins/); - - // The login can be changed to have a different type and hostname. - Services.logins.modifyLogin(updatedLoginInfo, differentLoginInfo); - LoginTestUtils.checkLogins([differentLoginInfo]); - - // It is now possible to add a login with the old type and hostname. - Services.logins.addLogin(loginInfo); - LoginTestUtils.checkLogins([loginInfo, differentLoginInfo]); - - // Modifying a login to match an existing one should not be possible. - Assert.throws( - () => Services.logins.modifyLogin(loginInfo, differentLoginInfo), - /already exists/); - LoginTestUtils.checkLogins([loginInfo, differentLoginInfo]); - - LoginTestUtils.clearData(); -}); - -/** - * Tests the modifyLogin function with an nsIPropertyBag argument. - */ -add_task(function test_modifyLogin_nsIProperyBag() -{ - let loginInfo = TestData.formLogin(); - let updatedLoginInfo = TestData.formLogin({ - username: "new username", - password: "new password", - usernameField: "", - passwordField: "new_form_field_password", - }); - let differentLoginInfo = TestData.authLogin(); - let differentLoginProperties = newPropertyBag({ - hostname: differentLoginInfo.hostname, - formSubmitURL: differentLoginInfo.formSubmitURL, - httpRealm: differentLoginInfo.httpRealm, - username: differentLoginInfo.username, - password: differentLoginInfo.password, - usernameField: differentLoginInfo.usernameField, - passwordField: differentLoginInfo.passwordField, - }); - - // Trying to modify a login that does not exist should throw. - Assert.throws(() => Services.logins.modifyLogin(loginInfo, newPropertyBag()), - /No matching logins/); - - // Add the first form login, then modify it to match the second, changing - // only some of its properties and checking the behavior with an empty string. - Services.logins.addLogin(loginInfo); - Services.logins.modifyLogin(loginInfo, newPropertyBag({ - username: "new username", - password: "new password", - usernameField: "", - passwordField: "new_form_field_password", - })); - - // The data should now match the second login. - LoginTestUtils.checkLogins([updatedLoginInfo]); - Assert.throws(() => Services.logins.modifyLogin(loginInfo, newPropertyBag()), - /No matching logins/); - - // It is also possible to provide no properties to be modified. - Services.logins.modifyLogin(updatedLoginInfo, newPropertyBag()); - - // Specifying a null property for a required value should throw. - Assert.throws(() => Services.logins.modifyLogin(loginInfo, newPropertyBag({ - usernameField: null, - }))); - - // The login can be changed to have a different type and hostname. - Services.logins.modifyLogin(updatedLoginInfo, differentLoginProperties); - LoginTestUtils.checkLogins([differentLoginInfo]); - - // It is now possible to add a login with the old type and hostname. - Services.logins.addLogin(loginInfo); - LoginTestUtils.checkLogins([loginInfo, differentLoginInfo]); - - // Modifying a login to match an existing one should not be possible. - Assert.throws( - () => Services.logins.modifyLogin(loginInfo, differentLoginProperties), - /already exists/); - LoginTestUtils.checkLogins([loginInfo, differentLoginInfo]); - - LoginTestUtils.clearData(); -}); - -/** - * Tests the login deduplication function. - */ -add_task(function test_deduplicate_logins() { - // Different key attributes combinations and the amount of unique - // results expected for the TestData login list. - let keyCombinations = [ - { - keyset: ["username", "password"], - results: 13, - }, - { - keyset: ["hostname", "username"], - results: 17, - }, - { - keyset: ["hostname", "username", "password"], - results: 18, - }, - { - keyset: ["hostname", "username", "password", "formSubmitURL"], - results: 23, - }, - ]; - - let logins = TestData.loginList(); - - for (let testCase of keyCombinations) { - // Deduplicate the logins using the current testcase keyset. - let deduped = LoginHelper.dedupeLogins(logins, testCase.keyset); - Assert.equal(deduped.length, testCase.results, "Correct amount of results."); - - // Checks that every login after deduping is unique. - Assert.ok(deduped.every(loginA => - deduped.every(loginB => !compareAttributes(loginA, loginB, testCase.keyset)) - ), "Every login is unique."); - } -}); - -/** - * Ensure that the login deduplication function keeps the most recent login. - */ -add_task(function test_deduplicate_keeps_most_recent() { - // Logins to deduplicate. - let logins = [ - TestData.formLogin({timeLastUsed: Date.UTC(2004, 11, 4, 0, 0, 0)}), - TestData.formLogin({formSubmitURL: "http://example.com", timeLastUsed: Date.UTC(2015, 11, 4, 0, 0, 0)}), - ]; - - // Deduplicate the logins. - let deduped = LoginHelper.dedupeLogins(logins); - Assert.equal(deduped.length, 1, "Deduplicated the logins array."); - - // Verify that the remaining login have the most recent date. - let loginTimeLastUsed = deduped[0].QueryInterface(Ci.nsILoginMetaInfo).timeLastUsed; - Assert.equal(loginTimeLastUsed, Date.UTC(2015, 11, 4, 0, 0, 0), "Most recent login was kept."); - - // Deduplicate the reverse logins array. - deduped = LoginHelper.dedupeLogins(logins.reverse()); - Assert.equal(deduped.length, 1, "Deduplicated the reversed logins array."); - - // Verify that the remaining login have the most recent date. - loginTimeLastUsed = deduped[0].QueryInterface(Ci.nsILoginMetaInfo).timeLastUsed; - Assert.equal(loginTimeLastUsed, Date.UTC(2015, 11, 4, 0, 0, 0), "Most recent login was kept."); -}); |