michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: "use strict"; michael@0: michael@0: /** michael@0: * This file tests the DirectoryLinksProvider singleton in the DirectoryLinksProvider.jsm module. michael@0: */ michael@0: michael@0: const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components; michael@0: Cu.import("resource://gre/modules/Services.jsm"); michael@0: Cu.import("resource://gre/modules/DirectoryLinksProvider.jsm"); michael@0: Cu.import("resource://gre/modules/Promise.jsm"); michael@0: michael@0: const DIRECTORY_FRECENCY = 1000; michael@0: const kTestSource = 'data:application/json,{"en-US": [{"url":"http://example.com","title":"TestSource"}]}'; michael@0: michael@0: function isIdentical(actual, expected) { michael@0: if (expected == null) { michael@0: do_check_eq(actual, expected); michael@0: } michael@0: else if (typeof expected == "object") { michael@0: // Make sure all the keys match up michael@0: do_check_eq(Object.keys(actual).sort() + "", Object.keys(expected).sort()); michael@0: michael@0: // Recursively check each value individually michael@0: Object.keys(expected).forEach(key => { michael@0: isIdentical(actual[key], expected[key]); michael@0: }); michael@0: } michael@0: else { michael@0: do_check_eq(actual, expected); michael@0: } michael@0: } michael@0: michael@0: function fetchData(provider) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: provider.getLinks(linkData => { michael@0: deferred.resolve(linkData); michael@0: }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_task(function test_DirectoryLinksProvider__linkObservers() { michael@0: let deferred = Promise.defer(); michael@0: let testObserver = { michael@0: onManyLinksChanged: function() { michael@0: deferred.resolve(); michael@0: } michael@0: } michael@0: michael@0: let provider = DirectoryLinksProvider; michael@0: provider.init(); michael@0: provider.addObserver(testObserver); michael@0: do_check_eq(provider._observers.length, 1); michael@0: Services.prefs.setCharPref(provider._prefs['linksURL'], kTestSource); michael@0: michael@0: yield deferred.promise; michael@0: provider._removeObservers(); michael@0: do_check_eq(provider._observers.length, 0); michael@0: michael@0: provider.reset(); michael@0: Services.prefs.clearUserPref(provider._prefs['linksURL']); michael@0: }); michael@0: michael@0: add_task(function test_DirectoryLinksProvider__linksURL_locale() { michael@0: let data = { michael@0: "en-US": [{url: "http://example.com", title: "US"}], michael@0: "zh-CN": [ michael@0: {url: "http://example.net", title: "CN"}, michael@0: {url:"http://example.net/2", title: "CN2"} michael@0: ], michael@0: }; michael@0: let dataURI = 'data:application/json,' + JSON.stringify(data); michael@0: michael@0: let provider = DirectoryLinksProvider; michael@0: Services.prefs.setCharPref(provider._prefs['linksURL'], dataURI); michael@0: Services.prefs.setCharPref('general.useragent.locale', 'en-US'); michael@0: michael@0: // set up the observer michael@0: provider.init(); michael@0: do_check_eq(provider._linksURL, dataURI); michael@0: michael@0: let links; michael@0: let expected_data; michael@0: michael@0: links = yield fetchData(provider); michael@0: do_check_eq(links.length, 1); michael@0: expected_data = [{url: "http://example.com", title: "US", frecency: DIRECTORY_FRECENCY, lastVisitDate: 1}]; michael@0: isIdentical(links, expected_data); michael@0: michael@0: Services.prefs.setCharPref('general.useragent.locale', 'zh-CN'); michael@0: michael@0: links = yield fetchData(provider); michael@0: do_check_eq(links.length, 2) michael@0: expected_data = [ michael@0: {url: "http://example.net", title: "CN", frecency: DIRECTORY_FRECENCY, lastVisitDate: 2}, michael@0: {url: "http://example.net/2", title: "CN2", frecency: DIRECTORY_FRECENCY, lastVisitDate: 1} michael@0: ]; michael@0: isIdentical(links, expected_data); michael@0: michael@0: provider.reset(); michael@0: Services.prefs.clearUserPref('general.useragent.locale'); michael@0: Services.prefs.clearUserPref(provider._prefs['linksURL']); michael@0: }); michael@0: michael@0: add_task(function test_DirectoryLinksProvider__prefObserver_url() { michael@0: let provider = DirectoryLinksProvider; michael@0: Services.prefs.setCharPref('general.useragent.locale', 'en-US'); michael@0: Services.prefs.setCharPref(provider._prefs['linksURL'], kTestSource); michael@0: michael@0: // set up the observer michael@0: provider.init(); michael@0: do_check_eq(provider._linksURL, kTestSource); michael@0: michael@0: let links = yield fetchData(provider); michael@0: do_check_eq(links.length, 1); michael@0: let expectedData = [{url: "http://example.com", title: "TestSource", frecency: DIRECTORY_FRECENCY, lastVisitDate: 1}]; michael@0: isIdentical(links, expectedData); michael@0: michael@0: // tests these 2 things: michael@0: // 1. observer trigger on pref change michael@0: // 2. invalid source url michael@0: let exampleUrl = 'http://nosuchhost.localhost/bad'; michael@0: Services.prefs.setCharPref(provider._prefs['linksURL'], exampleUrl); michael@0: michael@0: do_check_eq(provider._linksURL, exampleUrl); michael@0: michael@0: let newLinks = yield fetchData(provider); michael@0: isIdentical(newLinks, []); michael@0: michael@0: provider.reset(); michael@0: Services.prefs.clearUserPref('general.useragent.locale') michael@0: Services.prefs.clearUserPref(provider._prefs['linksURL']); michael@0: }); michael@0: michael@0: add_task(function test_DirectoryLinksProvider_getLinks_noLocaleData() { michael@0: let provider = DirectoryLinksProvider; michael@0: Services.prefs.setCharPref('general.useragent.locale', 'zh-CN'); michael@0: Services.prefs.setCharPref(provider._prefs['linksURL'], kTestSource); michael@0: michael@0: let links = yield fetchData(provider); michael@0: do_check_eq(links.length, 0); michael@0: provider.reset(); michael@0: Services.prefs.clearUserPref('general.useragent.locale') michael@0: Services.prefs.clearUserPref(provider._prefs['linksURL']); michael@0: });