1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Bug 1017502 - Add a foreign_count column to moz_places
This tests, tests the triggers that adjust the foreign_count when a bookmark is
added or removed and also the maintenance task to fix wrong counts.
*/
const T_URI = NetUtil.newURI("https://www.mozilla.org/firefox/nightly/firstrun/");
function* getForeignCountForURL(conn, url) {
yield PlacesTestUtils.promiseAsyncUpdates();
url = url instanceof Ci.nsIURI ? url.spec : url;
let rows = yield conn.executeCached(
`SELECT foreign_count FROM moz_places WHERE url_hash = hash(:t_url)
AND url = :t_url`, { t_url: url });
return rows[0].getResultByName("foreign_count");
}
function run_test() {
run_next_test();
}
add_task(function* add_remove_change_bookmark_test() {
let conn = yield PlacesUtils.promiseDBConnection();
// Simulate a visit to the url
yield PlacesTestUtils.addVisits(T_URI);
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 0);
// Add 1st bookmark which should increment foreign_count by 1
let id1 = PlacesUtils.bookmarks.insertBookmark(PlacesUtils.unfiledBookmarksFolderId,
T_URI, PlacesUtils.bookmarks.DEFAULT_INDEX, "First Run");
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 1);
// Add 2nd bookmark
let id2 = PlacesUtils.bookmarks.insertBookmark(PlacesUtils.bookmarksMenuFolderId,
T_URI, PlacesUtils.bookmarks.DEFAULT_INDEX, "First Run");
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 2);
// Remove 2nd bookmark which should decrement foreign_count by 1
PlacesUtils.bookmarks.removeItem(id2);
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 1);
// Change first bookmark's URI
const URI2 = NetUtil.newURI("http://www.mozilla.org");
PlacesUtils.bookmarks.changeBookmarkURI(id1, URI2);
// Check foreign count for original URI
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 0);
// Check foreign count for new URI
Assert.equal((yield getForeignCountForURL(conn, URI2)), 1);
// Cleanup - Remove changed bookmark
let id = PlacesUtils.bookmarks.getBookmarkIdsForURI(URI2);
PlacesUtils.bookmarks.removeItem(id);
Assert.equal((yield getForeignCountForURL(conn, URI2)), 0);
});
add_task(function* maintenance_foreign_count_test() {
let conn = yield PlacesUtils.promiseDBConnection();
// Simulate a visit to the url
yield PlacesTestUtils.addVisits(T_URI);
// Adjust the foreign_count for the added entry to an incorrect value
let deferred = Promise.defer();
let stmt = DBConn().createAsyncStatement(
`UPDATE moz_places SET foreign_count = 10 WHERE url_hash = hash(:t_url)
AND url = :t_url `);
stmt.params.t_url = T_URI.spec;
stmt.executeAsync({
handleCompletion: function() {
deferred.resolve();
}
});
stmt.finalize();
yield deferred.promise;
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 10);
// Run maintenance
Components.utils.import("resource://gre/modules/PlacesDBUtils.jsm");
let promiseMaintenanceFinished =
promiseTopicObserved("places-maintenance-finished");
PlacesDBUtils.maintenanceOnIdle();
yield promiseMaintenanceFinished;
// Check if the foreign_count has been adjusted to the correct value
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 0);
});
add_task(function* add_remove_tags_test() {
let conn = yield PlacesUtils.promiseDBConnection();
yield PlacesTestUtils.addVisits(T_URI);
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 0);
// Check foreign count incremented by 1 for a single tag
PlacesUtils.tagging.tagURI(T_URI, ["test tag"]);
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 1);
// Check foreign count is incremented by 2 for two tags
PlacesUtils.tagging.tagURI(T_URI, ["one", "two"]);
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 3);
// Check foreign count is set to 0 when all tags are removed
PlacesUtils.tagging.untagURI(T_URI, ["test tag", "one", "two"]);
Assert.equal((yield getForeignCountForURL(conn, T_URI)), 0);
});
|