diff options
Diffstat (limited to 'browser/components/migration/tests/unit/test_IE_cookies.js')
-rw-r--r-- | browser/components/migration/tests/unit/test_IE_cookies.js | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/browser/components/migration/tests/unit/test_IE_cookies.js b/browser/components/migration/tests/unit/test_IE_cookies.js new file mode 100644 index 000000000..37a7462f2 --- /dev/null +++ b/browser/components/migration/tests/unit/test_IE_cookies.js @@ -0,0 +1,111 @@ +"use strict"; + +XPCOMUtils.defineLazyModuleGetter(this, "ctypes", + "resource://gre/modules/ctypes.jsm"); + +add_task(function* () { + let migrator = MigrationUtils.getMigrator("ie"); + // Sanity check for the source. + Assert.ok(migrator.sourceExists); + + const BOOL = ctypes.bool; + const LPCTSTR = ctypes.char16_t.ptr; + const DWORD = ctypes.uint32_t; + const LPDWORD = DWORD.ptr; + + let wininet = ctypes.open("Wininet"); + + /* + BOOL InternetSetCookieW( + _In_ LPCTSTR lpszUrl, + _In_ LPCTSTR lpszCookieName, + _In_ LPCTSTR lpszCookieData + ); + */ + let setIECookie = wininet.declare("InternetSetCookieW", + ctypes.default_abi, + BOOL, + LPCTSTR, + LPCTSTR, + LPCTSTR); + + /* + BOOL InternetGetCookieW( + _In_ LPCTSTR lpszUrl, + _In_ LPCTSTR lpszCookieName, + _Out_ LPCTSTR lpszCookieData, + _Inout_ LPDWORD lpdwSize + ); + */ + let getIECookie = wininet.declare("InternetGetCookieW", + ctypes.default_abi, + BOOL, + LPCTSTR, + LPCTSTR, + LPCTSTR, + LPDWORD); + + // We need to randomize the cookie to avoid clashing with other cookies + // that might have been set by previous tests and not properly cleared. + let date = (new Date()).getDate(); + const COOKIE = { + get host() { + return new URL(this.href).host; + }, + href: `http://mycookietest.${Math.random()}.com`, + name: "testcookie", + value: "testvalue", + expiry: new Date(new Date().setDate(date + 2)) + }; + let data = ctypes.char16_t.array()(256); + let sizeRef = DWORD(256).address(); + + do_register_cleanup(() => { + // Remove the cookie. + try { + let expired = new Date(new Date().setDate(date - 2)); + let rv = setIECookie(COOKIE.href, COOKIE.name, + `; expires=${expired.toUTCString()}`); + Assert.ok(rv, "Expired the IE cookie"); + Assert.ok(!getIECookie(COOKIE.href, COOKIE.name, data, sizeRef), + "The cookie has been properly removed"); + } catch (ex) {} + + // Close the library. + try { + wininet.close(); + } catch (ex) {} + }); + + // Create the persistent cookie in IE. + let value = `${COOKIE.value}; expires=${COOKIE.expiry.toUTCString()}`; + let rv = setIECookie(COOKIE.href, COOKIE.name, value); + Assert.ok(rv, "Added a persistent IE cookie: " + value); + + // Sanity check the cookie has been created. + Assert.ok(getIECookie(COOKIE.href, COOKIE.name, data, sizeRef), + "Found the added persistent IE cookie"); + do_print("Found cookie: " + data.readString()); + Assert.equal(data.readString(), `${COOKIE.name}=${COOKIE.value}`, + "Found the expected cookie"); + + // Sanity check that there are no cookies. + Assert.equal(Services.cookies.countCookiesFromHost(COOKIE.host), 0, + "There are no cookies initially"); + + // Migrate cookies. + yield promiseMigration(migrator, MigrationUtils.resourceTypes.COOKIES); + + Assert.equal(Services.cookies.countCookiesFromHost(COOKIE.host), 1, + "Migrated the expected number of cookies"); + + // Now check the cookie details. + let enumerator = Services.cookies.getCookiesFromHost(COOKIE.host, {}); + Assert.ok(enumerator.hasMoreElements()); + let foundCookie = enumerator.getNext().QueryInterface(Ci.nsICookie2); + + Assert.equal(foundCookie.name, COOKIE.name); + Assert.equal(foundCookie.value, COOKIE.value); + Assert.equal(foundCookie.host, "." + COOKIE.host); + Assert.equal(foundCookie.expiry, Math.floor(COOKIE.expiry / 1000)); +}); |