"use strict"; // Some test machines and android are not returning ipv6, turn it // off to get consistent test results. Services.prefs.setBoolPref("network.dns.disableIPv6", true); function getExtension(background = undefined) { let manifest = { permissions: ["dns"], }; return ExtensionTestUtils.loadExtension({ manifest, background() { browser.test.onMessage.addListener(async (msg, data) => { browser.test.log(`=== dns resolve test ${JSON.stringify(data)}`); browser.dns .resolve(data.hostname, data.flags) .then(result => { browser.test.log( `=== dns resolve result ${JSON.stringify(result)}` ); browser.test.sendMessage("resolved", result); }) .catch(e => { browser.test.log(`=== dns resolve error ${e.message}`); browser.test.sendMessage("resolved", { message: e.message }); }); }); browser.test.sendMessage("ready"); }, }); } const tests = [ { request: { hostname: "localhost", }, expect: { addresses: ["127.0.0.1"], // ipv6 disabled , "::1" }, }, { request: { hostname: "localhost", flags: ["offline"], }, expect: { addresses: ["127.0.0.1"], // ipv6 disabled , "::1" }, }, { request: { hostname: "test.example", }, expect: { // android will error with offline error: /NS_ERROR_UNKNOWN_HOST|NS_ERROR_OFFLINE/, }, }, { request: { hostname: "127.0.0.1", flags: ["canonical_name"], }, expect: { canonicalName: "127.0.0.1", addresses: ["127.0.0.1"], }, }, { request: { hostname: "localhost", flags: ["disable_ipv6"], }, expect: { addresses: ["127.0.0.1"], }, }, ]; add_task(async function test_dns_resolve() { let extension = getExtension(); await extension.startup(); await extension.awaitMessage("ready"); for (let test of tests) { extension.sendMessage("resolve", test.request); let result = await extension.awaitMessage("resolved"); if (test.expect.error) { ok( test.expect.error.test(result.message), `expected error ${result.message}` ); } else { equal( result.canonicalName, test.expect.canonicalName, "canonicalName match" ); // It seems there are platform differences happening that make this // testing difficult. We're going to rely on other existing dns tests to validate // the dns service itself works and only validate that we're getting generally // expected results in the webext api. ok( result.addresses.length >= test.expect.addresses.length, "expected number of addresses returned" ); if (test.expect.addresses.length && result.addresses.length) { ok( result.addresses.includes(test.expect.addresses[0]), "got expected ip address" ); } } } await extension.unload(); });