michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: Cu.import("resource://gre/modules/FileUtils.jsm"); michael@0: Cu.import("resource://services-sync/util.js"); michael@0: michael@0: function run_test() { michael@0: initTestLogging(); michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function test_roundtrip() { michael@0: _("Do a simple write of an array to json and read"); michael@0: Utils.jsonSave("foo", {}, ["v1", "v2"], ensureThrows(function(error) { michael@0: do_check_eq(error, null); michael@0: michael@0: Utils.jsonLoad("foo", {}, ensureThrows(function(val) { michael@0: let foo = val; michael@0: do_check_eq(typeof foo, "object"); michael@0: do_check_eq(foo.length, 2); michael@0: do_check_eq(foo[0], "v1"); michael@0: do_check_eq(foo[1], "v2"); michael@0: run_next_test(); michael@0: })); michael@0: })); michael@0: }); michael@0: michael@0: add_test(function test_string() { michael@0: _("Try saving simple strings"); michael@0: Utils.jsonSave("str", {}, "hi", ensureThrows(function(error) { michael@0: do_check_eq(error, null); michael@0: michael@0: Utils.jsonLoad("str", {}, ensureThrows(function(val) { michael@0: let str = val; michael@0: do_check_eq(typeof str, "string"); michael@0: do_check_eq(str.length, 2); michael@0: do_check_eq(str[0], "h"); michael@0: do_check_eq(str[1], "i"); michael@0: run_next_test(); michael@0: })); michael@0: })); michael@0: }); michael@0: michael@0: add_test(function test_number() { michael@0: _("Try saving a number"); michael@0: Utils.jsonSave("num", {}, 42, ensureThrows(function(error) { michael@0: do_check_eq(error, null); michael@0: michael@0: Utils.jsonLoad("num", {}, ensureThrows(function(val) { michael@0: let num = val; michael@0: do_check_eq(typeof num, "number"); michael@0: do_check_eq(num, 42); michael@0: run_next_test(); michael@0: })); michael@0: })); michael@0: }); michael@0: michael@0: add_test(function test_nonexistent_file() { michael@0: _("Try loading a non-existent file."); michael@0: Utils.jsonLoad("non-existent", {}, ensureThrows(function(val) { michael@0: do_check_eq(val, undefined); michael@0: run_next_test(); michael@0: })); michael@0: }); michael@0: michael@0: add_test(function test_save_logging() { michael@0: _("Verify that writes are logged."); michael@0: let trace; michael@0: Utils.jsonSave("log", {_log: {trace: function(msg) { trace = msg; }}}, michael@0: "hi", ensureThrows(function () { michael@0: do_check_true(!!trace); michael@0: run_next_test(); michael@0: })); michael@0: }); michael@0: michael@0: add_test(function test_load_logging() { michael@0: _("Verify that reads and read errors are logged."); michael@0: michael@0: // Write a file with some invalid JSON michael@0: let filePath = "weave/log.json"; michael@0: let file = FileUtils.getFile("ProfD", filePath.split("/"), true); michael@0: let fos = Cc["@mozilla.org/network/file-output-stream;1"] michael@0: .createInstance(Ci.nsIFileOutputStream); michael@0: let flags = FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE michael@0: | FileUtils.MODE_TRUNCATE; michael@0: fos.init(file, flags, FileUtils.PERMS_FILE, fos.DEFER_OPEN); michael@0: let stream = Cc["@mozilla.org/intl/converter-output-stream;1"] michael@0: .createInstance(Ci.nsIConverterOutputStream); michael@0: stream.init(fos, "UTF-8", 4096, 0x0000); michael@0: stream.writeString("invalid json!"); michael@0: stream.close(); michael@0: michael@0: let trace, debug; michael@0: let obj = { michael@0: _log: { michael@0: trace: function(msg) { michael@0: trace = msg; michael@0: }, michael@0: debug: function(msg) { michael@0: debug = msg; michael@0: } michael@0: } michael@0: }; michael@0: Utils.jsonLoad("log", obj, ensureThrows(function(val) { michael@0: do_check_true(!val); michael@0: do_check_true(!!trace); michael@0: do_check_true(!!debug); michael@0: run_next_test(); michael@0: })); michael@0: }); michael@0: michael@0: add_task(function* test_undefined_callback() { michael@0: yield Utils.jsonSave("foo", {}, ["v1", "v2"]); michael@0: });