1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_migrateAddonRepository.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,127 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +const EXPECTED_SCHEMA_VERSION = 4; 1.9 +let dbfile; 1.10 + 1.11 +function run_test() { 1.12 + do_test_pending(); 1.13 + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.14 + 1.15 + // Write out a minimal database. 1.16 + dbfile = gProfD.clone(); 1.17 + dbfile.append("addons.sqlite"); 1.18 + let db = AM_Cc["@mozilla.org/storage/service;1"]. 1.19 + getService(AM_Ci.mozIStorageService). 1.20 + openDatabase(dbfile); 1.21 + 1.22 + db.createTable("addon", 1.23 + "internal_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 1.24 + "id TEXT UNIQUE, " + 1.25 + "type TEXT, " + 1.26 + "name TEXT, " + 1.27 + "version TEXT, " + 1.28 + "creator TEXT, " + 1.29 + "creatorURL TEXT, " + 1.30 + "description TEXT, " + 1.31 + "fullDescription TEXT, " + 1.32 + "developerComments TEXT, " + 1.33 + "eula TEXT, " + 1.34 + "iconURL TEXT, " + 1.35 + "homepageURL TEXT, " + 1.36 + "supportURL TEXT, " + 1.37 + "contributionURL TEXT, " + 1.38 + "contributionAmount TEXT, " + 1.39 + "averageRating INTEGER, " + 1.40 + "reviewCount INTEGER, " + 1.41 + "reviewURL TEXT, " + 1.42 + "totalDownloads INTEGER, " + 1.43 + "weeklyDownloads INTEGER, " + 1.44 + "dailyUsers INTEGER, " + 1.45 + "sourceURI TEXT, " + 1.46 + "repositoryStatus INTEGER, " + 1.47 + "size INTEGER, " + 1.48 + "updateDate INTEGER"); 1.49 + 1.50 + db.createTable("developer", 1.51 + "addon_internal_id INTEGER, " + 1.52 + "num INTEGER, " + 1.53 + "name TEXT, " + 1.54 + "url TEXT, " + 1.55 + "PRIMARY KEY (addon_internal_id, num)"); 1.56 + 1.57 + db.createTable("screenshot", 1.58 + "addon_internal_id INTEGER, " + 1.59 + "num INTEGER, " + 1.60 + "url TEXT, " + 1.61 + "thumbnailURL TEXT, " + 1.62 + "caption TEXT, " + 1.63 + "PRIMARY KEY (addon_internal_id, num)"); 1.64 + 1.65 + let stmt = db.createStatement("INSERT INTO addon (id) VALUES (:id)"); 1.66 + stmt.params.id = "test1@tests.mozilla.org"; 1.67 + stmt.execute(); 1.68 + stmt.finalize(); 1.69 + 1.70 + stmt = db.createStatement("INSERT INTO screenshot VALUES " + 1.71 + "(:addon_internal_id, :num, :url, :thumbnailURL, :caption)"); 1.72 + 1.73 + stmt.params.addon_internal_id = 1; 1.74 + stmt.params.num = 0; 1.75 + stmt.params.url = "http://localhost/full1-1.png"; 1.76 + stmt.params.thumbnailURL = "http://localhost/thumbnail1-1.png"; 1.77 + stmt.params.caption = "Caption 1 - 1"; 1.78 + stmt.execute(); 1.79 + stmt.finalize(); 1.80 + 1.81 + db.schemaVersion = 1; 1.82 + db.close(); 1.83 + 1.84 + 1.85 + Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true); 1.86 + AddonRepository.getCachedAddonByID("test1@tests.mozilla.org", function (aAddon) { 1.87 + do_check_neq(aAddon, null); 1.88 + do_check_eq(aAddon.screenshots.length, 1); 1.89 + do_check_true(aAddon.screenshots[0].width === null); 1.90 + do_check_true(aAddon.screenshots[0].height === null); 1.91 + do_check_true(aAddon.screenshots[0].thumbnailWidth === null); 1.92 + do_check_true(aAddon.screenshots[0].thumbnailHeight === null); 1.93 + do_check_eq(aAddon.iconURL, undefined); 1.94 + do_check_eq(JSON.stringify(aAddon.icons), "{}"); 1.95 + AddonRepository.shutdown().then( 1.96 + function checkAfterRepoShutdown() { 1.97 + // Check the DB schema has changed once AddonRepository has freed it. 1.98 + db = AM_Cc["@mozilla.org/storage/service;1"]. 1.99 + getService(AM_Ci.mozIStorageService). 1.100 + openDatabase(dbfile); 1.101 + do_check_eq(db.schemaVersion, EXPECTED_SCHEMA_VERSION); 1.102 + do_check_true(db.indexExists("developer_idx")); 1.103 + do_check_true(db.indexExists("screenshot_idx")); 1.104 + do_check_true(db.indexExists("compatibility_override_idx")); 1.105 + do_check_true(db.tableExists("compatibility_override")); 1.106 + do_check_true(db.indexExists("icon_idx")); 1.107 + do_check_true(db.tableExists("icon")); 1.108 + 1.109 + // Check the trigger is working 1.110 + db.executeSimpleSQL("INSERT INTO addon (id, type, name) VALUES('test_addon', 'extension', 'Test Addon')"); 1.111 + let internalID = db.lastInsertRowID; 1.112 + db.executeSimpleSQL("INSERT INTO compatibility_override (addon_internal_id, num, type) VALUES('" + internalID + "', '1', 'incompatible')"); 1.113 + 1.114 + let stmt = db.createStatement("SELECT COUNT(*) AS count FROM compatibility_override"); 1.115 + stmt.executeStep(); 1.116 + do_check_eq(stmt.row.count, 1); 1.117 + stmt.reset(); 1.118 + 1.119 + db.executeSimpleSQL("DELETE FROM addon"); 1.120 + stmt.executeStep(); 1.121 + do_check_eq(stmt.row.count, 0); 1.122 + stmt.finalize(); 1.123 + 1.124 + db.close(); 1.125 + do_test_finished(); 1.126 + }, 1.127 + do_report_unexpected_exception 1.128 + ); 1.129 + }); 1.130 +}