michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: const EXPECTED_SCHEMA_VERSION = 4; michael@0: let dbfile; michael@0: michael@0: function run_test() { michael@0: do_test_pending(); michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: michael@0: // Write out a minimal database. michael@0: dbfile = gProfD.clone(); michael@0: dbfile.append("addons.sqlite"); michael@0: let db = AM_Cc["@mozilla.org/storage/service;1"]. michael@0: getService(AM_Ci.mozIStorageService). michael@0: openDatabase(dbfile); michael@0: michael@0: db.createTable("addon", michael@0: "internal_id INTEGER PRIMARY KEY AUTOINCREMENT, " + michael@0: "id TEXT UNIQUE, " + michael@0: "type TEXT, " + michael@0: "name TEXT, " + michael@0: "version TEXT, " + michael@0: "creator TEXT, " + michael@0: "creatorURL TEXT, " + michael@0: "description TEXT, " + michael@0: "fullDescription TEXT, " + michael@0: "developerComments TEXT, " + michael@0: "eula TEXT, " + michael@0: "iconURL TEXT, " + michael@0: "homepageURL TEXT, " + michael@0: "supportURL TEXT, " + michael@0: "contributionURL TEXT, " + michael@0: "contributionAmount TEXT, " + michael@0: "averageRating INTEGER, " + michael@0: "reviewCount INTEGER, " + michael@0: "reviewURL TEXT, " + michael@0: "totalDownloads INTEGER, " + michael@0: "weeklyDownloads INTEGER, " + michael@0: "dailyUsers INTEGER, " + michael@0: "sourceURI TEXT, " + michael@0: "repositoryStatus INTEGER, " + michael@0: "size INTEGER, " + michael@0: "updateDate INTEGER"); michael@0: michael@0: db.createTable("developer", michael@0: "addon_internal_id INTEGER, " + michael@0: "num INTEGER, " + michael@0: "name TEXT, " + michael@0: "url TEXT, " + michael@0: "PRIMARY KEY (addon_internal_id, num)"); michael@0: michael@0: db.createTable("screenshot", michael@0: "addon_internal_id INTEGER, " + michael@0: "num INTEGER, " + michael@0: "url TEXT, " + michael@0: "thumbnailURL TEXT, " + michael@0: "caption TEXT, " + michael@0: "PRIMARY KEY (addon_internal_id, num)"); michael@0: michael@0: let stmt = db.createStatement("INSERT INTO addon (id) VALUES (:id)"); michael@0: stmt.params.id = "test1@tests.mozilla.org"; michael@0: stmt.execute(); michael@0: stmt.finalize(); michael@0: michael@0: stmt = db.createStatement("INSERT INTO screenshot VALUES " + michael@0: "(:addon_internal_id, :num, :url, :thumbnailURL, :caption)"); michael@0: michael@0: stmt.params.addon_internal_id = 1; michael@0: stmt.params.num = 0; michael@0: stmt.params.url = "http://localhost/full1-1.png"; michael@0: stmt.params.thumbnailURL = "http://localhost/thumbnail1-1.png"; michael@0: stmt.params.caption = "Caption 1 - 1"; michael@0: stmt.execute(); michael@0: stmt.finalize(); michael@0: michael@0: db.schemaVersion = 1; michael@0: db.close(); michael@0: michael@0: michael@0: Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true); michael@0: AddonRepository.getCachedAddonByID("test1@tests.mozilla.org", function (aAddon) { michael@0: do_check_neq(aAddon, null); michael@0: do_check_eq(aAddon.screenshots.length, 1); michael@0: do_check_true(aAddon.screenshots[0].width === null); michael@0: do_check_true(aAddon.screenshots[0].height === null); michael@0: do_check_true(aAddon.screenshots[0].thumbnailWidth === null); michael@0: do_check_true(aAddon.screenshots[0].thumbnailHeight === null); michael@0: do_check_eq(aAddon.iconURL, undefined); michael@0: do_check_eq(JSON.stringify(aAddon.icons), "{}"); michael@0: AddonRepository.shutdown().then( michael@0: function checkAfterRepoShutdown() { michael@0: // Check the DB schema has changed once AddonRepository has freed it. michael@0: db = AM_Cc["@mozilla.org/storage/service;1"]. michael@0: getService(AM_Ci.mozIStorageService). michael@0: openDatabase(dbfile); michael@0: do_check_eq(db.schemaVersion, EXPECTED_SCHEMA_VERSION); michael@0: do_check_true(db.indexExists("developer_idx")); michael@0: do_check_true(db.indexExists("screenshot_idx")); michael@0: do_check_true(db.indexExists("compatibility_override_idx")); michael@0: do_check_true(db.tableExists("compatibility_override")); michael@0: do_check_true(db.indexExists("icon_idx")); michael@0: do_check_true(db.tableExists("icon")); michael@0: michael@0: // Check the trigger is working michael@0: db.executeSimpleSQL("INSERT INTO addon (id, type, name) VALUES('test_addon', 'extension', 'Test Addon')"); michael@0: let internalID = db.lastInsertRowID; michael@0: db.executeSimpleSQL("INSERT INTO compatibility_override (addon_internal_id, num, type) VALUES('" + internalID + "', '1', 'incompatible')"); michael@0: michael@0: let stmt = db.createStatement("SELECT COUNT(*) AS count FROM compatibility_override"); michael@0: stmt.executeStep(); michael@0: do_check_eq(stmt.row.count, 1); michael@0: stmt.reset(); michael@0: michael@0: db.executeSimpleSQL("DELETE FROM addon"); michael@0: stmt.executeStep(); michael@0: do_check_eq(stmt.row.count, 0); michael@0: stmt.finalize(); michael@0: michael@0: db.close(); michael@0: do_test_finished(); michael@0: }, michael@0: do_report_unexpected_exception michael@0: ); michael@0: }); michael@0: }