зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
6cc792275f
Коммит
15596177b5
|
@ -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({
|
||||
|
|
Загрузка…
Ссылка в новой задаче