Bug 1190323: [webext] Part 2: Complete i18n API test coverage. r?billm draft
authorKris Maglione <maglione.k@gmail.com>
Fri, 08 Jan 2016 16:23:54 -0800
changeset 320196 7c298b4a2db9a8611a3a2390761821abaa4391b7
parent 320195 ff7738b62dc61b06de96a3eb5499f95de70f0cd3
child 512706 06cfd9161de8f4bb0db9edeb36888a803ac3ece2
push id9154
push usermaglione.k@gmail.com
push dateSat, 09 Jan 2016 00:28:18 +0000
reviewersbillm
bugs1190323
milestone46.0a1
Bug 1190323: [webext] Part 2: Complete i18n API test coverage. r?billm
toolkit/components/extensions/test/mochitest/test_ext_i18n.html
toolkit/components/extensions/test/xpcshell/test_locale_data.js
toolkit/components/extensions/test/xpcshell/xpcshell.ini
--- a/toolkit/components/extensions/test/mochitest/test_ext_i18n.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_i18n.html
@@ -12,20 +12,28 @@
 
 <script type="text/javascript">
 "use strict";
 
 add_task(function* test_i18n() {
   function runTests(assertEq) {
     let _ = browser.i18n.getMessage.bind(browser.i18n);
 
+    let url = browser.runtime.getURL("/");
+    assertEq(url, `moz-extension://${_("@@extension_id")}/`, "@@extension_id builtin message");
+
     assertEq("Foo.", _("Foo"), "Simple message in selected locale.");
 
     assertEq("(bar)", _("bar"), "Simple message fallback in default locale.");
 
+    assertEq("??", _("some-unknown-locale-string"), "Unknown locale string.");
+
+    assertEq("??", _("@@unknown_builtin_string"), "Unknown built-in string.");
+    assertEq("??", _("@@bidi_unknown_builtin_string"), "Unknown built-in bidi string.");
+
     let substitutions = [];
     substitutions[4] = "5";
     substitutions[13] = "14";
 
     assertEq("'$0' '14' '' '5' '$$$$' '$'.", _("basic_substitutions", substitutions),
              "Basic numeric substitutions");
 
     assertEq("'$0' '' 'just a string' '' '$$$$' '$'.", _("basic_substitutions", "just a string"),
new file mode 100644
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_locale_data.js
@@ -0,0 +1,111 @@
+"use strict";
+
+Cu.import("resource://gre/modules/Extension.jsm");
+
+/* globals ExtensionData */
+
+const uuidGenerator = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator);
+
+function* generateAddon(data) {
+  let id = uuidGenerator.generateUUID().number;
+
+  let xpi = Extension.generateXPI(id, data);
+  do_register_cleanup(() => {
+    xpi.remove(false);
+  });
+
+  let fileURI = Services.io.newFileURI(xpi);
+  let jarURI = NetUtil.newURI(`jar:${fileURI.spec}!/`);
+
+  let extension = new ExtensionData(jarURI);
+  yield extension.readManifest();
+
+  return extension;
+}
+
+add_task(function* testMissingDefaultLocale() {
+  let extension = yield generateAddon({
+    "files": {
+      "_locales/en_US/messages.json": {},
+    },
+  });
+
+  equal(extension.errors.length, 0, "No errors reported");
+
+  yield extension.initAllLocales();
+
+  equal(extension.errors.length, 1, "One error reported");
+
+  do_print(`Got error: ${extension.errors[0]}`);
+
+  ok(extension.errors[0].includes('"default_locale" property is required'),
+     "Got missing default_locale error");
+});
+
+
+add_task(function* testInvalidDefaultLocale() {
+  let extension = yield generateAddon({
+    "manifest": {
+      "default_locale": "en",
+    },
+
+    "files": {
+      "_locales/en_US/messages.json": {},
+    },
+  });
+
+  equal(extension.errors.length, 0, "No errors reported");
+
+  yield extension.initAllLocales();
+
+  equal(extension.errors.length, 1, "One error reported");
+
+  do_print(`Got error: ${extension.errors[0]}`);
+
+  ok(extension.errors[0].includes('"default_locale" property must correspond'),
+     "Got invalid default_locale error");
+});
+
+
+add_task(function* testUnexpectedDefaultLocale() {
+  let extension = yield generateAddon({
+    "manifest": {
+      "default_locale": "en_US",
+    },
+  });
+
+  equal(extension.errors.length, 0, "No errors reported");
+
+  yield extension.initAllLocales();
+
+  equal(extension.errors.length, 1, "One error reported");
+
+  do_print(`Got error: ${extension.errors[0]}`);
+
+  ok(extension.errors[0].includes('"default_locale" property must correspond'),
+     "Got unexpected default_locale error");
+});
+
+
+add_task(function* testInvalidSyntax() {
+  let extension = yield generateAddon({
+    "manifest": {
+      "default_locale": "en_US",
+    },
+
+    "files": {
+      "_locales/en_US/messages.json": '{foo: {message: "bar", description: "baz"}}',
+    },
+  });
+
+  equal(extension.errors.length, 0, "No errors reported");
+
+  yield extension.initAllLocales();
+
+  equal(extension.errors.length, 1, "One error reported");
+
+  do_print(`Got error: ${extension.errors[0]}`);
+
+  ok(extension.errors[0].includes("Loading locale file _locales\/en_US\/messages\.json: SyntaxError"),
+     "Got syntax error");
+});
--- a/toolkit/components/extensions/test/xpcshell/xpcshell.ini
+++ b/toolkit/components/extensions/test/xpcshell/xpcshell.ini
@@ -1,7 +1,9 @@
 [DEFAULT]
 head = head.js
 tail =
+firefox-appdir = browser
 skip-if = toolkit == 'android' || toolkit == 'gonk'
 
+[test_locale_data.js]
 [test_locale_converter.js]
 [test_ext_schemas.js]