summaryrefslogtreecommitdiffstats
path: root/toolkit/components/telemetry/dap/tests/xpcshell
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/telemetry/dap/tests/xpcshell')
-rw-r--r--toolkit/components/telemetry/dap/tests/xpcshell/test_dap.js195
-rw-r--r--toolkit/components/telemetry/dap/tests/xpcshell/xpcshell.ini2
2 files changed, 197 insertions, 0 deletions
diff --git a/toolkit/components/telemetry/dap/tests/xpcshell/test_dap.js b/toolkit/components/telemetry/dap/tests/xpcshell/test_dap.js
new file mode 100644
index 0000000000..9c1cae0b1e
--- /dev/null
+++ b/toolkit/components/telemetry/dap/tests/xpcshell/test_dap.js
@@ -0,0 +1,195 @@
+/* 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/. */
+
+"use strict";
+
+const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js");
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ DAPTelemetrySender: "resource://gre/modules/DAPTelemetrySender.sys.mjs",
+});
+
+const BinaryOutputStream = Components.Constructor(
+ "@mozilla.org/binaryoutputstream;1",
+ "nsIBinaryOutputStream",
+ "setOutputStream"
+);
+
+const BinaryInputStream = Components.Constructor(
+ "@mozilla.org/binaryinputstream;1",
+ "nsIBinaryInputStream",
+ "setInputStream"
+);
+
+const PREF_LEADER = "toolkit.telemetry.dap_leader";
+const PREF_HELPER = "toolkit.telemetry.dap_helper";
+
+let received = false;
+let server;
+let server_addr;
+
+function hpkeConfigHandler(request, response) {
+ if (
+ request.queryString == "task_id=StldO2czL_iaUF2iljFbiLiNTxxVNdPHgPuuEWLHnsk"
+ ) {
+ let config_bytes;
+ if (request.path.startsWith("/leader")) {
+ config_bytes = new Uint8Array([
+ 47,
+ 0,
+ 32,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 32,
+ 11,
+ 33,
+ 206,
+ 33,
+ 131,
+ 56,
+ 220,
+ 82,
+ 153,
+ 110,
+ 228,
+ 200,
+ 53,
+ 98,
+ 210,
+ 38,
+ 177,
+ 197,
+ 252,
+ 198,
+ 36,
+ 201,
+ 86,
+ 121,
+ 169,
+ 238,
+ 220,
+ 34,
+ 143,
+ 112,
+ 177,
+ 10,
+ ]);
+ } else {
+ config_bytes = new Uint8Array([
+ 42,
+ 0,
+ 32,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 32,
+ 28,
+ 62,
+ 242,
+ 195,
+ 117,
+ 7,
+ 173,
+ 149,
+ 250,
+ 15,
+ 139,
+ 178,
+ 86,
+ 241,
+ 117,
+ 143,
+ 75,
+ 26,
+ 57,
+ 60,
+ 88,
+ 130,
+ 199,
+ 175,
+ 195,
+ 9,
+ 241,
+ 130,
+ 61,
+ 47,
+ 215,
+ 101,
+ ]);
+ }
+ response.setHeader("Content-Type", "application/dap-hpke-config");
+ let bos = new BinaryOutputStream(response.bodyOutputStream);
+ bos.writeByteArray(config_bytes);
+ } else {
+ Assert.ok(false, "Unknown query string.");
+ }
+}
+
+function uploadHandler(request, response) {
+ Assert.equal(
+ request.getHeader("Content-Type"),
+ "application/dap-report",
+ "Wrong Content-Type header."
+ );
+ let body = new BinaryInputStream(request.bodyInputStream);
+ Assert.equal(body.available(), 432, "Wrong request body size.");
+ received = true;
+ response.setStatusLine(request.httpVersion, 200);
+}
+
+add_setup(async function() {
+ do_get_profile();
+ Services.fog.initializeFOG();
+
+ // Set up a mock server to represent the DAP endpoints.
+ server = new HttpServer();
+ server.registerPathHandler("/leader_endpoint/hpke_config", hpkeConfigHandler);
+ server.registerPathHandler("/helper_endpoint/hpke_config", hpkeConfigHandler);
+ server.registerPathHandler("/leader_endpoint/upload", uploadHandler);
+ server.start(-1);
+
+ const orig_leader = Services.prefs.getStringPref(PREF_LEADER);
+ const orig_helper = Services.prefs.getStringPref(PREF_HELPER);
+ const i = server.identity;
+ server_addr = i.primaryScheme + "://" + i.primaryHost + ":" + i.primaryPort;
+ Services.prefs.setStringPref(PREF_LEADER, server_addr + "/leader_endpoint");
+ Services.prefs.setStringPref(PREF_HELPER, server_addr + "/helper_endpoint");
+ registerCleanupFunction(() => {
+ Services.prefs.setStringPref(PREF_LEADER, orig_leader);
+ Services.prefs.setStringPref(PREF_HELPER, orig_helper);
+
+ return new Promise(resolve => {
+ server.stop(resolve);
+ });
+ });
+});
+
+add_task(async function testVerificationTask() {
+ Services.fog.testResetFOG();
+ let before = Glean.dap.uploadStatus.success.testGetValue() ?? 0;
+ await lazy.DAPTelemetrySender.sendVerificationTaskReport();
+ let after = Glean.dap.uploadStatus.success.testGetValue();
+ Assert.equal(before + 1, after, "Successful submissions should be counted.");
+ Assert.ok(received, "Report upload successful.");
+});
+
+add_task(async function testNetworkError() {
+ Services.fog.testResetFOG();
+ let before = Glean.dap.reportGenerationStatus.failure.testGetValue() ?? 0;
+ Services.prefs.setStringPref(PREF_LEADER, server_addr + "/invalid-endpoint");
+ await lazy.DAPTelemetrySender.sendVerificationTaskReport();
+ let after = Glean.dap.reportGenerationStatus.failure.testGetValue() ?? 0;
+ Assert.equal(
+ before + 1,
+ after,
+ "Failed report generation should be counted."
+ );
+});
diff --git a/toolkit/components/telemetry/dap/tests/xpcshell/xpcshell.ini b/toolkit/components/telemetry/dap/tests/xpcshell/xpcshell.ini
new file mode 100644
index 0000000000..6698b43873
--- /dev/null
+++ b/toolkit/components/telemetry/dap/tests/xpcshell/xpcshell.ini
@@ -0,0 +1,2 @@
+[test_dap.js]
+skip-if = os == "android" # DAP is not supported on Android