gecko/services/sync/tests/unit/test_places_guid_downgrade.js
Gregory Szorc 45d3f90cf3 Bug 785225 - Part 9: Refactor engines to not use singletons; r=rnewman
Engines now maintain a reference to the service they belong to. This
allows them to obtain references to other engine instances belonging to
that service and that service only.

Stores and trackers now maintain a reference to the engine they belong
to.

Engine managers now maintain a reference back to a service.

The clients singleton has been removed. It now exists as an instance
variable on Service. Parts of ClientsEngine do behave as singletons
(e.g. commands). This will be addressed in future refactoring.
2012-08-29 14:43:41 -07:00

215 lines
6.2 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
Cu.import("resource://services-common/async.js");
Cu.import("resource://services-sync/util.js");
Cu.import("resource://services-sync/engines.js");
Cu.import("resource://services-sync/engines/history.js");
Cu.import("resource://services-sync/engines/bookmarks.js");
Cu.import("resource://services-sync/service.js");
const kDBName = "places.sqlite";
const storageSvc = Cc["@mozilla.org/storage/service;1"]
.getService(Ci.mozIStorageService);
const fxuri = Utils.makeURI("http://getfirefox.com/");
const tburi = Utils.makeURI("http://getthunderbird.com/");
function setPlacesDatabase(aFileName) {
removePlacesDatabase();
_("Copying over places.sqlite.");
let file = do_get_file(aFileName);
file.copyTo(gSyncProfile, kDBName);
}
function removePlacesDatabase() {
_("Removing places.sqlite.");
let file = gSyncProfile.clone();
file.append(kDBName);
try {
file.remove(false);
} catch (ex) {
// Windows is awesome. NOT.
}
}
Svc.Obs.add("places-shutdown", function () {
do_timeout(0, removePlacesDatabase);
});
// Verify initial database state. Function borrowed from places tests.
add_test(function test_initial_state() {
_("Verify initial setup: v11 database is available");
// Mostly sanity checks our starting DB to make sure it's setup as we expect
// it to be.
let dbFile = gSyncProfile.clone();
dbFile.append(kDBName);
let db = storageSvc.openUnsharedDatabase(dbFile);
let stmt = db.createStatement("PRAGMA journal_mode");
do_check_true(stmt.executeStep());
// WAL journal mode should have been unset this database when it was migrated
// down to v10.
do_check_neq(stmt.getString(0).toLowerCase(), "wal");
stmt.finalize();
do_check_true(db.indexExists("moz_bookmarks_guid_uniqueindex"));
do_check_true(db.indexExists("moz_places_guid_uniqueindex"));
// There should be a non-zero amount of bookmarks without a guid.
stmt = db.createStatement(
"SELECT COUNT(1) "
+ "FROM moz_bookmarks "
+ "WHERE guid IS NULL "
);
do_check_true(stmt.executeStep());
do_check_neq(stmt.getInt32(0), 0);
stmt.finalize();
// There should be a non-zero amount of places without a guid.
stmt = db.createStatement(
"SELECT COUNT(1) "
+ "FROM moz_places "
+ "WHERE guid IS NULL "
);
do_check_true(stmt.executeStep());
do_check_neq(stmt.getInt32(0), 0);
stmt.finalize();
// Check our schema version to make sure it is actually at 10.
do_check_eq(db.schemaVersion, 10);
db.close();
run_next_test();
});
add_test(function test_history_guids() {
let engine = new HistoryEngine(Service);
let store = engine._store;
let places = [
{
uri: fxuri,
title: "Get Firefox!",
visits: [{
visitDate: Date.now() * 1000,
transitionType: Ci.nsINavHistoryService.TRANSITION_LINK
}]
},
{
uri: tburi,
title: "Get Thunderbird!",
visits: [{
visitDate: Date.now() * 1000,
transitionType: Ci.nsINavHistoryService.TRANSITION_LINK
}]
}
];
PlacesUtils.asyncHistory.updatePlaces(places, {
handleError: function handleError() {
do_throw("Unexpected error in adding visit.");
},
handleResult: function handleResult() {},
handleCompletion: onVisitAdded
});
function onVisitAdded() {
let fxguid = store.GUIDForUri(fxuri, true);
let tbguid = store.GUIDForUri(tburi, true);
dump("fxguid: " + fxguid + "\n");
dump("tbguid: " + tbguid + "\n");
_("History: Verify GUIDs are added to the guid column.");
let connection = PlacesUtils.history
.QueryInterface(Ci.nsPIPlacesDatabase)
.DBConnection;
let stmt = connection.createAsyncStatement(
"SELECT id FROM moz_places WHERE guid = :guid");
stmt.params.guid = fxguid;
let result = Async.querySpinningly(stmt, ["id"]);
do_check_eq(result.length, 1);
stmt.params.guid = tbguid;
result = Async.querySpinningly(stmt, ["id"]);
do_check_eq(result.length, 1);
stmt.finalize();
_("History: Verify GUIDs weren't added to annotations.");
stmt = connection.createAsyncStatement(
"SELECT a.content AS guid FROM moz_annos a WHERE guid = :guid");
stmt.params.guid = fxguid;
result = Async.querySpinningly(stmt, ["guid"]);
do_check_eq(result.length, 0);
stmt.params.guid = tbguid;
result = Async.querySpinningly(stmt, ["guid"]);
do_check_eq(result.length, 0);
stmt.finalize();
run_next_test();
}
});
add_test(function test_bookmark_guids() {
let engine = new BookmarksEngine(Service);
let store = engine._store;
let fxid = PlacesUtils.bookmarks.insertBookmark(
PlacesUtils.bookmarks.toolbarFolder,
fxuri,
PlacesUtils.bookmarks.DEFAULT_INDEX,
"Get Firefox!");
let tbid = PlacesUtils.bookmarks.insertBookmark(
PlacesUtils.bookmarks.toolbarFolder,
tburi,
PlacesUtils.bookmarks.DEFAULT_INDEX,
"Get Thunderbird!");
let fxguid = store.GUIDForId(fxid);
let tbguid = store.GUIDForId(tbid);
_("Bookmarks: Verify GUIDs are added to the guid column.");
let connection = PlacesUtils.history
.QueryInterface(Ci.nsPIPlacesDatabase)
.DBConnection;
let stmt = connection.createAsyncStatement(
"SELECT id FROM moz_bookmarks WHERE guid = :guid");
stmt.params.guid = fxguid;
let result = Async.querySpinningly(stmt, ["id"]);
do_check_eq(result.length, 1);
do_check_eq(result[0].id, fxid);
stmt.params.guid = tbguid;
result = Async.querySpinningly(stmt, ["id"]);
do_check_eq(result.length, 1);
do_check_eq(result[0].id, tbid);
stmt.finalize();
_("Bookmarks: Verify GUIDs weren't added to annotations.");
stmt = connection.createAsyncStatement(
"SELECT a.content AS guid FROM moz_items_annos a WHERE guid = :guid");
stmt.params.guid = fxguid;
result = Async.querySpinningly(stmt, ["guid"]);
do_check_eq(result.length, 0);
stmt.params.guid = tbguid;
result = Async.querySpinningly(stmt, ["guid"]);
do_check_eq(result.length, 0);
stmt.finalize();
run_next_test();
});
function run_test() {
setPlacesDatabase("places_v10_from_v11.sqlite");
run_next_test();
}