Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
/* import-globals-from helper-telemetry.js */
Services.scriptloader.loadSubScript(
CHROME_URL_ROOT + "helper-telemetry.js",
this
);
const DEVICE_A = "Device A";
const USB_RUNTIME_1 = {
id: "runtime-id-1",
deviceName: DEVICE_A,
name: "Runtime 1",
shortName: "R1",
};
const USB_RUNTIME_2 = {
id: "runtime-id-2",
deviceName: DEVICE_A,
name: "Runtime 2",
shortName: "R2",
};
const DEVICE_A_EXTRAS = {
connection_type: "usb",
device_name: DEVICE_A,
};
const RUNTIME_1_EXTRAS = {
connection_type: "usb",
device_name: USB_RUNTIME_1.deviceName,
runtime_name: USB_RUNTIME_1.shortName,
};
const RUNTIME_2_EXTRAS = {
connection_type: "usb",
device_name: USB_RUNTIME_2.deviceName,
runtime_name: USB_RUNTIME_2.shortName,
};
/**
* Check that telemetry events are recorded for USB runtimes when:
* - adding a device/runtime
* - removing a device/runtime
* - connecting to a runtime
*/
add_task(async function testUsbRuntimeUpdates() {
// enable USB devices mocks
const mocks = new Mocks();
setupTelemetryTest();
const { tab, document } = await openAboutDebugging();
const sessionId = getOpenEventSessionId();
ok(!isNaN(sessionId), "Open event has a valid session id");
await addUsbRuntime(USB_RUNTIME_1, mocks, document);
let evts = checkTelemetryEvents(
[
{ method: "device_added", extras: DEVICE_A_EXTRAS },
{ method: "runtime_added", extras: RUNTIME_1_EXTRAS },
],
sessionId
);
// Now that a first telemetry event has been logged for RUNTIME_1, retrieve the id
// generated for telemetry, and check that we keep logging the same id for all events
// related to runtime 1.
const runtime1Id = evts.filter(e => e.method === "runtime_added")[0].extras
.runtime_id;
const runtime1Extras = Object.assign({}, RUNTIME_1_EXTRAS, {
runtime_id: runtime1Id,
});
// Same as runtime1Extras, but the runtime name should be the complete one.
const runtime1ConnectedExtras = Object.assign({}, runtime1Extras, {
runtime_name: USB_RUNTIME_1.name,
});
await connectToRuntime(USB_RUNTIME_1.deviceName, document);
checkTelemetryEvents(
[
{ method: "runtime_connected", extras: runtime1ConnectedExtras },
{ method: "connection_attempt", extras: { status: "start" } },
{ method: "connection_attempt", extras: { status: "success" } },
],
sessionId
);
info("Add a second runtime");
await addUsbRuntime(USB_RUNTIME_2, mocks, document);
evts = checkTelemetryEvents(
[{ method: "runtime_added", extras: RUNTIME_2_EXTRAS }],
sessionId
);
// Similar to what we did for RUNTIME_1,w e want to check we reuse the same telemetry id
// for all the events related to RUNTIME_2.
const runtime2Id = evts.filter(e => e.method === "runtime_added")[0].extras
.runtime_id;
const runtime2Extras = Object.assign({}, RUNTIME_2_EXTRAS, {
runtime_id: runtime2Id,
});
info("Remove runtime 1");
await removeUsbRuntime(USB_RUNTIME_1, mocks, document);
checkTelemetryEvents(
[
{ method: "runtime_disconnected", extras: runtime1ConnectedExtras },
{ method: "runtime_removed", extras: runtime1Extras },
],
sessionId
);
info("Remove runtime 2");
await removeUsbRuntime(USB_RUNTIME_2, mocks, document);
checkTelemetryEvents(
[
{ method: "runtime_removed", extras: runtime2Extras },
{ method: "device_removed", extras: DEVICE_A_EXTRAS },
],
sessionId
);
await removeTab(tab);
});
async function addUsbRuntime(runtime, mocks, doc) {
mocks.createUSBRuntime(runtime.id, {
deviceName: runtime.deviceName,
name: runtime.name,
shortName: runtime.shortName,
});
mocks.emitUSBUpdate();
info("Wait for the runtime to appear in the sidebar");
await waitUntil(() => findSidebarItemByText(runtime.shortName, doc));
}
async function removeUsbRuntime(runtime, mocks, doc) {
mocks.removeRuntime(runtime.id);
mocks.emitUSBUpdate();
await waitUntil(
() =>
!findSidebarItemByText(runtime.name, doc) &&
!findSidebarItemByText(runtime.shortName, doc)
);
}