diff --git a/internal/experiment/webconnectivitylte/analysisclassic.go b/internal/experiment/webconnectivitylte/analysisclassic.go index 68a4534864..eae59c41b4 100644 --- a/internal/experiment/webconnectivitylte/analysisclassic.go +++ b/internal/experiment/webconnectivitylte/analysisclassic.go @@ -373,7 +373,17 @@ func analysisClassicComputeBlockingAccessible(woa *minipipeline.WebAnalysis, tk return } - // 5.3. Handle the case where just the probe failed. + // 5.3. When the probe says dns_no_answer the control would otherwise say that + // we have resolved zero IP addresses for historical reasons. In such a case, + // let's pretend that also the control returned dns_no_answer. + if entry.Failure.Unwrap() == netxlite.FailureDNSNoAnswer && + !entry.ControlDNSResolvedAddrs.IsNone() && + entry.ControlDNSResolvedAddrs.Unwrap().Len() <= 0 { + tk.setWebsiteDown() + return + } + + // 5.4. Handle the case where just the probe failed. tk.setBlockingString("dns") tk.setHTTPExperimentFailure(entry.Failure) return @@ -406,9 +416,6 @@ func analysisClassicComputeBlockingAccessible(woa *minipipeline.WebAnalysis, tk tk.setWebsiteDown() return } - - // TODO(bassosimone): we should handle the case where a domain - // exists but there aren't IP addresses for it. } } diff --git a/internal/experiment/webconnectivityqa/testcase.go b/internal/experiment/webconnectivityqa/testcase.go index c06c4dc3e2..9718282be4 100644 --- a/internal/experiment/webconnectivityqa/testcase.go +++ b/internal/experiment/webconnectivityqa/testcase.go @@ -88,6 +88,7 @@ func AllTestCases() []*TestCase { tlsBlockingConnectionResetWithInconsistentDNS(), websiteDownNXDOMAIN(), + websiteDownNoAddrs(), websiteDownTCPConnect(), } } diff --git a/internal/experiment/webconnectivityqa/websitedown.go b/internal/experiment/webconnectivityqa/websitedown.go index 4c429621a7..947954bf4a 100644 --- a/internal/experiment/webconnectivityqa/websitedown.go +++ b/internal/experiment/webconnectivityqa/websitedown.go @@ -1,5 +1,7 @@ package webconnectivityqa +import "github.com/ooni/probe-cli/v3/internal/netemx" + // websiteDownNXDOMAIN describes the test case where the website domain // is NXDOMAIN according to the TH and the probe. func websiteDownNXDOMAIN() *TestCase { @@ -60,3 +62,29 @@ func websiteDownTCPConnect() *TestCase { }, } } + +// websiteDownNoAddrs describes the test case where the website domain +// does not return any address according to the TH and the probe. +func websiteDownNoAddrs() *TestCase { + return &TestCase{ + Name: "websiteDownNoAddrs", + Flags: TestCaseFlagNoV04, + Input: "http://www.example.com/", + Configure: func(env *netemx.QAEnv) { + + // reconfigure with only CNAME but no addresses and do this + // for all the resolvers of the kingdom + env.AddRecordToAllResolvers("www.example.com", "web01.example.com" /* No addrs */) + + }, + ExpectErr: false, + ExpectTestKeys: &testKeys{ + DNSExperimentFailure: "dns_no_answer", + DNSConsistency: "consistent", + XBlockingFlags: 0, + XNullNullFlags: 1, // AnalysisFlagNullNullExpectedDNSLookupFailure + Accessible: false, + Blocking: false, + }, + } +} diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go index df693f1cfb..7498ff1e68 100644 --- a/internal/minipipeline/analysis.go +++ b/internal/minipipeline/analysis.go @@ -4,6 +4,7 @@ import ( "sort" "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/netxlite" "github.com/ooni/probe-cli/v3/internal/optional" "github.com/ooni/probe-cli/v3/internal/runtimex" ) @@ -449,7 +450,17 @@ func (wa *WebAnalysis) dnsComputeFailureMetrics(c *WebObservationsContainer) { } // handle the case where only the probe failed - if obs.DNSLookupFailure.Unwrap() != "" { + if failure := obs.DNSLookupFailure.Unwrap(); failure != "" { + // When the probe says dns_no_answer the control would otherwise say that + // we have resolved zero IP addresses for historical reasons. In such a case, + // let's pretend that also the control returned dns_no_answer. + if failure == netxlite.FailureDNSNoAnswer { + if !obs.ControlDNSResolvedAddrs.IsNone() && obs.ControlDNSResolvedAddrs.Unwrap().Len() <= 0 { + wa.DNSLookupExpectedFailure.Add(obs.DNSTransactionID.Unwrap()) + continue + } + // fallthrough + } wa.DNSLookupUnexpectedFailure.Add(obs.DNSTransactionID.Unwrap()) continue } diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/analysis.json new file mode 100644 index 0000000000..86dc00dd72 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/analysis.json @@ -0,0 +1,261 @@ +{ + "ControlExpectations": { + "DNSAddresses": [], + "FinalResponseFailure": "dns_lookup_error" + }, + "DNSLookupSuccess": [], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [], + "DNSLookupSuccessWithBogonAddresses": [], + "DNSLookupSuccessWithInvalidAddressesClassic": [], + "DNSLookupSuccessWithValidAddressClassic": [], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": "dns_no_answer", + "DNSLookupExpectedFailure": [ + 2, + 3 + ], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_nxdomain_error", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_nxdomain_error", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/analysis_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/analysis_classic.json new file mode 100644 index 0000000000..7e1be9e189 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/analysis_classic.json @@ -0,0 +1,88 @@ +{ + "ControlExpectations": { + "DNSAddresses": [], + "FinalResponseFailure": "dns_lookup_error" + }, + "DNSLookupSuccess": [], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [], + "DNSLookupSuccessWithBogonAddresses": [], + "DNSLookupSuccessWithInvalidAddressesClassic": [], + "DNSLookupSuccessWithValidAddressClassic": [], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": "dns_no_answer", + "DNSLookupExpectedFailure": [ + 2 + ], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/measurement.json new file mode 100644 index 0000000000..fea124dff8 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/measurement.json @@ -0,0 +1,337 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.com/", + "measurement_start_time": "2024-01-24 17:21:11", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.21.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000369, + "t": 0.000369, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.013384, + "t": 0.013384, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + } + ], + "queries": [ + { + "answers": null, + "engine": "getaddrinfo", + "failure": "dns_nxdomain_error", + "hostname": "dns.nextdns.io", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.001478, + "t": 0.007366, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "getaddrinfo", + "failure": "dns_nxdomain_error", + "hostname": "dns.nextdns.io", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.007389, + "t": 0.013371, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + } + ], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000364, + "t": 0.000364, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.001164, + "t": 0.001176, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.001152, + "t": 0.001184, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 79, + "operation": "read", + "proto": "udp", + "t0": 0.00233, + "t": 0.006537, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 79, + "operation": "read", + "proto": "udp", + "t0": 0.002324, + "t": 0.007131, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.007139, + "t": 0.007139, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": null, + "engine": "getaddrinfo", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000423, + "t": 0.007015, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + }, + { + "answers": [ + { + "answer_type": "CNAME", + "hostname": "web01.example.com.", + "ttl": null + } + ], + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "aWGBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAABQABAAAOEAATBXdlYjAxB2V4YW1wbGUDY29tAA==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000521, + "t": 0.006562, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + }, + { + "answers": [ + { + "answer_type": "CNAME", + "hostname": "web01.example.com.", + "ttl": null + } + ], + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "9V2BAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAABA3d3dwdleGFtcGxlA2NvbQAABQABAAAOEAATBXdlYjAxB2V4YW1wbGUDY29tAA==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000501, + "t": 0.007134, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + }, + { + "answers": null, + "engine": "doh", + "failure": "dns_nxdomain_error", + "hostname": "www.example.com", + "query_type": "AAAA", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.nextdns.io/dns-query", + "t0": 0.000563, + "t": 0.007412, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "doh", + "failure": "dns_nxdomain_error", + "hostname": "www.example.com", + "query_type": "A", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.nextdns.io/dns-query", + "t0": 0.00054, + "t": 0.01338, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + } + ], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [], + "x_control_request": { + "http_request": "http://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.3" + ] + }, + "tcp_connect": null, + "x_quic_enabled": false + }, + "control": { + "tcp_connect": {}, + "quic_handshake": {}, + "http_request": { + "body_length": -1, + "discovered_h3_endpoint": "", + "failure": "dns_lookup_error", + "title": "", + "headers": {}, + "status_code": -1 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [] + } + }, + "x_conn_priority_log": [ + { + "msg": "create with []", + "t": 0.013423 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": "dns_no_answer", + "dns_consistency": "consistent", + "http_experiment_failure": "dns_no_answer", + "x_blocking_flags": 0, + "x_null_null_flags": 1, + "body_proportion": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "dns", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.50724, + "test_start_time": "2024-01-24 17:21:11", + "test_version": "0.5.28" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/observations.json new file mode 100644 index 0000000000..c0f11f29ee --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/observations.json @@ -0,0 +1,225 @@ +{ + "DNSLookupFailures": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_nxdomain_error", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_nxdomain_error", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ], + "DNSLookupSuccesses": [], + "KnownTCPEndpoints": {}, + "ControlExpectations": { + "DNSAddresses": [], + "FinalResponseFailure": "dns_lookup_error" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/observations_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/observations_classic.json new file mode 100644 index 0000000000..dd66ee6811 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNoAddrs/observations_classic.json @@ -0,0 +1,53 @@ +{ + "DNSLookupFailures": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "dns_lookup_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ], + "DNSLookupSuccesses": [], + "KnownTCPEndpoints": {}, + "ControlExpectations": { + "DNSAddresses": [], + "FinalResponseFailure": "dns_lookup_error" + } +} \ No newline at end of file