Bug 1774581 - Use telemetry data to test whether TRR is retried, r=necko-reviewers,dragana

Differential Revision: https://phabricator.services.mozilla.com/D149510
This commit is contained in:
Kershaw Chang 2022-07-06 08:45:23 +00:00
Родитель 6cc792275f
Коммит 15596177b5
3 изменённых файлов: 163 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,141 @@
"use strict";
/* import-globals-from trr_common.js */
const { TelemetryTestUtils } = ChromeUtils.import(
"resource://testing-common/TelemetryTestUtils.jsm"
);
function setup() {
h2Port = trr_test_setup();
runningODoHTests = false;
}
setup();
registerCleanupFunction(async () => {
trr_clear_prefs();
});
let TRR_OK = 1;
let TRR_NOT_CONFIRMED = 14;
let TRR_DECODE_FAILED = 25;
let TRR_EXCLUDED = 26;
let TRR_NXDOMAIN = 30;
async function trr_retry_decode_failure() {
Services.prefs.setBoolPref("network.trr.retry_on_recoverable_errors", true);
let chan = makeChan(
`https://foo.example.com:${h2Port}/reset-doh-request-count`,
Ci.nsIRequest.TRR_DISABLED_MODE
);
await new Promise(resolve =>
chan.asyncOpen(new ChannelListener(resolve, null))
);
setModeAndURI(2, "doh?responseIP=2.2.2.2&retryOnDecodeFailure=true");
dns.clearCache(true);
await new TRRDNSListener("retry_ok.example.com", "2.2.2.2");
}
add_task(async function test_trr_retry_decode_failure() {
let hist = TelemetryTestUtils.getAndClearKeyedHistogram(
"TRR_SKIP_REASON_STRICT_MODE"
);
await trr_retry_decode_failure();
TelemetryTestUtils.assertKeyedHistogramValue(
hist,
`(other)|${TRR_DECODE_FAILED}`,
TRR_OK,
1
);
});
async function trr_not_retry_nxdomain() {
dns.clearCache(true);
Services.prefs.setBoolPref("network.trr.strict_native_fallback", false);
info("Test nxdomain");
Services.prefs.setBoolPref("network.trr.retry_on_recoverable_errors", true);
setModeAndURI(2, "doh?responseIP=2.2.2.2&nxdomain=true");
await new TRRDNSListener("nxdomain.example.com", {
expectedAnswer: "127.0.0.1",
});
}
add_task(async function check_nxdomain_not_retry() {
let hist = TelemetryTestUtils.getAndClearKeyedHistogram(
"TRR_SKIP_REASON_STRICT_MODE"
);
await trr_not_retry_nxdomain();
TelemetryTestUtils.assertKeyedHistogramValue(
hist,
"(other)",
TRR_NXDOMAIN,
1
);
});
async function trr_not_retry_confirmation_failed() {
dns.clearCache(true);
Services.prefs.setBoolPref("network.trr.retry_on_recoverable_errors", true);
setModeAndURI(2, "doh?responseIP=2.2.2.2&nxdomain=true");
Services.prefs.setCharPref("network.trr.confirmationNS", "example.com");
await TestUtils.waitForCondition(
// 3 => CONFIRM_FAILED
() => dns.currentTrrConfirmationState == 3,
`Timed out waiting for confirmation failed. Currently ${dns.currentTrrConfirmationState}`,
1,
5000
);
await new TRRDNSListener("not_confirm.example.com", {
expectedAnswer: "127.0.0.1",
});
}
add_task(async function check_confirmation_failure_not_retry() {
let hist = TelemetryTestUtils.getAndClearKeyedHistogram(
"TRR_SKIP_REASON_STRICT_MODE"
);
await trr_not_retry_confirmation_failed();
TelemetryTestUtils.assertKeyedHistogramValue(
hist,
"(other)",
TRR_NOT_CONFIRMED,
1
);
});
async function trr_not_retry_trr_excluded() {
dns.clearCache(true);
Services.prefs.setBoolPref("network.trr.retry_on_recoverable_errors", true);
dns.clearCache(true);
setModeAndURI(2, "doh?responseIP=2.2.2.2");
Services.prefs.setCharPref("network.trr.excluded-domains", "bar.example.com");
await new TRRDNSListener("bar.example.com", "127.0.0.1");
}
add_task(async function check_trr_excluded_not_retry() {
let hist = TelemetryTestUtils.getAndClearKeyedHistogram(
"TRR_SKIP_REASON_STRICT_MODE"
);
await trr_not_retry_trr_excluded();
TelemetryTestUtils.assertKeyedHistogramValue(
hist,
"(other)",
TRR_EXCLUDED,
1
);
});

Просмотреть файл

@ -611,3 +611,6 @@ skip-if =
run-sequentially = node server exceptions dont replay well
[test_http_408_retry.js]
[test_brotli_decoding.js]
[test_trr_telemetry.js]
head = head_channels.js head_cache.js head_cookies.js head_trr.js head_http3.js trr_common.js
skip-if = socketprocess_networking

Просмотреть файл

@ -958,6 +958,25 @@ function handleRequest(req, res) {
return;
}
if (u.query.nxdomain) {
let nxConent = dnsPacket.encode({
id: 0,
type: "response",
flags: dnsPacket.rcodes.toRcode("NXDOMAIN"),
questions: [
{
name: "nxdomain.example.com",
type: "A",
class: "IN",
},
],
answers: [],
});
writeDNSResponse(res, nxConent, 0, "application/dns-message");
return;
}
if (u.query.push) {
// push.example.org has AAAA entry 2018::2018
let pcontent = dnsPacket.encode({