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
113
|
Cu.import("resource://gre/modules/Promise.jsm");
const SINGLE_TRY_TIMEOUT = 100;
const NUMBER_OF_TRIES = 30;
function waitForConditionPromise(condition, timeoutMsg, tryCount=NUMBER_OF_TRIES) {
let defer = Promise.defer();
let tries = 0;
function checkCondition() {
if (tries >= tryCount) {
defer.reject(timeoutMsg);
}
var conditionPassed;
try {
conditionPassed = condition();
} catch (e) {
return defer.reject(e);
}
if (conditionPassed) {
return defer.resolve();
}
tries++;
setTimeout(checkCondition, SINGLE_TRY_TIMEOUT);
return undefined;
}
setTimeout(checkCondition, SINGLE_TRY_TIMEOUT);
return defer.promise;
}
function waitForCondition(condition, nextTest, errorMsg) {
waitForConditionPromise(condition, errorMsg).then(nextTest, (reason) => {
ok(false, reason + (reason.stack ? "\n" + reason.stack : ""));
});
}
/**
* Checks if the snapshotted keyed scalars contain the expected
* data.
*
* @param {Object} scalars
* The snapshot of the keyed scalars.
* @param {String} scalarName
* The name of the keyed scalar to check.
* @param {String} key
* The key that must be within the keyed scalar.
* @param {String|Boolean|Number} expectedValue
* The expected value for the provided key in the scalar.
*/
function checkKeyedScalar(scalars, scalarName, key, expectedValue) {
Assert.ok(scalarName in scalars,
scalarName + " must be recorded.");
Assert.ok(key in scalars[scalarName],
scalarName + " must contain the '" + key + "' key.");
Assert.ok(scalars[scalarName][key], expectedValue,
scalarName + "['" + key + "'] must contain the expected value");
}
/**
* An utility function to write some text in the search input box
* in a content page.
* @param {Object} browser
* The browser that contains the content.
* @param {String} text
* The string to write in the search field.
* @param {String} fieldName
* The name of the field to write to.
*/
let typeInSearchField = Task.async(function* (browser, text, fieldName) {
yield ContentTask.spawn(browser, { fieldName, text }, function* ({fieldName, text}) {
// Avoid intermittent failures.
if (fieldName === "searchText") {
content.wrappedJSObject.gContentSearchController.remoteTimeout = 5000;
}
// Put the focus on the search box.
let searchInput = content.document.getElementById(fieldName);
searchInput.focus();
searchInput.value = text;
});
});
/**
* Clear and get the SEARCH_COUNTS histogram.
*/
function getSearchCountsHistogram() {
let search_hist = Services.telemetry.getKeyedHistogramById("SEARCH_COUNTS");
search_hist.clear();
return search_hist;
}
/**
* Check that the keyed histogram contains the right value.
*/
function checkKeyedHistogram(h, key, expectedValue) {
const snapshot = h.snapshot();
Assert.ok(key in snapshot, `The histogram must contain ${key}.`);
Assert.equal(snapshot[key].sum, expectedValue, `The key ${key} must contain ${expectedValue}.`);
}
function checkEvents(events, expectedEvents) {
if (!Services.telemetry.canRecordExtended) {
// Currently we only collect the tested events when extended Telemetry is enabled.
return;
}
Assert.equal(events.length, expectedEvents.length, "Should have matching amount of events.");
// Strip timestamps from the events for easier comparison.
events = events.map(e => e.slice(1));
for (let i = 0; i < events.length; ++i) {
Assert.deepEqual(events[i], expectedEvents[i], "Events should match.");
}
}
|