diff --git a/internal/cmd/minipipeline/testdata/analysis.json b/internal/cmd/minipipeline/testdata/analysis.json index dbdad0f79a..9334662739 100644 --- a/internal/cmd/minipipeline/testdata/analysis.json +++ b/internal/cmd/minipipeline/testdata/analysis.json @@ -1,8 +1,10 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -10,7 +12,7 @@ "x-drupal-cache": true, "x-generator": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "4": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go index 3886abbd6d..0ebcae042d 100644 --- a/internal/minipipeline/analysis.go +++ b/internal/minipipeline/analysis.go @@ -5,25 +5,32 @@ import ( "github.com/ooni/probe-cli/v3/internal/netxlite" "github.com/ooni/probe-cli/v3/internal/optional" + "github.com/ooni/probe-cli/v3/internal/runtimex" ) // AnalyzeWebObservations generates a [*WebAnalysis] from a [*WebObservationsContainer]. func AnalyzeWebObservations(container *WebObservationsContainer) *WebAnalysis { analysis := &WebAnalysis{} + analysis.ComputeDNSExperimentFailure(container) analysis.ComputeDNSTransactionsWithBogons(container) analysis.ComputeDNSTransactionsWithUnexpectedFailures(container) analysis.ComputeDNSPossiblyInvalidAddrs(container) + analysis.ComputeDNSPossiblyInvalidAddrsClassic(container) + analysis.ComputeDNSPossiblyNonexistingDomains(container) + analysis.ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(container) analysis.ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures(container) analysis.ComputeTCPTransactionsWithUnexpectedHTTPFailures(container) + analysis.ComputeTCPTransactionsWithUnexplainedUnexpectedFailures(container) + analysis.ComputeHTTPDiffBodyProportionFactor(container) analysis.ComputeHTTPDiffStatusCodeMatch(container) analysis.ComputeHTTPDiffUncommonHeadersIntersection(container) analysis.ComputeHTTPDiffTitleDifferentLongWords(container) - analysis.ComputeHTTPFinalResponses(container) - analysis.ComputeTCPTransactionsWithUnexplainedUnexpectedFailures(container) + analysis.ComputeHTTPFinalResponsesWithControl(container) analysis.ComputeHTTPFinalResponsesWithTLS(container) + return analysis } @@ -31,8 +38,14 @@ func AnalyzeWebObservations(container *WebObservationsContainer) *WebAnalysis { // // The zero value of this struct is ready to use. // -// Methods that mutate this struct are not idempotent. You should invoke each -// of these methods just once, after you have filled a container. +// For optional fields, they are None (i.e., `null` in JSON, `nil` in Go) when the corresponding +// algorithm either didn't run or didn't encounter enough data to determine a non-None result. When +// they are not None, they can still be empty (e.g., `{}` in JSON and in Go). In the latter case, +// them being empty means we encountered good enough data to determine whether we needed to add +// something to such a field and decided not to. For example, DNSTransactionWithBogons being None +// means that there are no suitable transactions to inspect. It being empty, instead, means we +// have transactions to inspect but none of them contains bogons. In other words, most fields are +// three state and one should take this into account when performing data analysis. type WebAnalysis struct { // DNSExperimentFailure is the first failure experienced by a getaddrinfo-like resolver. DNSExperimentFailure optional.Value[string] @@ -57,6 +70,14 @@ type WebAnalysis struct { // addresses resolved by the TH to their corresponding ASN. DNSPossiblyInvalidAddrs optional.Value[map[string]bool] + // DNSPossiblyInvalidAddrsClassic is like DNSPossiblyInvalidAddrs but does + // not use TLS to validate the IP addresses. + DNSPossiblyInvalidAddrsClassic optional.Value[map[string]bool] + + // DNSPossiblyNonexistingDomains lists all the domains for which both + // the probe and the TH failed to perform DNS lookups. + DNSPossiblyNonexistingDomains optional.Value[map[string]bool] + // HTTPDiffBodyProportionFactor is the body proportion factor. // // The generation algorithm assumes there's a single "final" response. @@ -78,13 +99,15 @@ type WebAnalysis struct { // The generation algorithm assumes there's a single "final" response. HTTPDiffUncommonHeadersIntersection optional.Value[map[string]bool] - // HTTPFinalResponses contains the transaction IDs of "final" responses (i.e., responses - // that are like 2xx, 4xx, or 5xx). Typically, we expect to have a single response that - // if final when we're analyzing Web Connectivity LTE. - HTTPFinalResponses optional.Value[map[int64]bool] + // HTTPFinalResponsesWithControl contains the transaction IDs of "final" responses (i.e., + // responses that are like 2xx, 4xx, or 5xx) for which we also have a valid HTTP control + // measurement. Typically, we expect to have a single response that is final when + // analyzing Web Connectivity LTE results. + HTTPFinalResponsesWithControl optional.Value[map[int64]bool] // HTTPFinalResponsesWithTLS is like HTTPFinalResponses but only includes the - // cases where we're using TLS to fetch the final response. + // cases where we're using TLS to fetch the final response, and does not concern + // itself with whether there's control data, because TLS suffices. HTTPFinalResponsesWithTLS optional.Value[map[int64]bool] // TCPTransactionsWithUnexpectedTCPConnectFailures contains the TCP transaction IDs that @@ -126,32 +149,30 @@ func (wa *WebAnalysis) ComputeDNSExperimentFailure(c *WebObservationsContainer) continue } - // we only care about when we're resolving the same domain + // we only care about cases where we're resolving the same domain if probeDomain != thDomain { continue } - // make sure we only include the system resolver - switch obs.DNSEngine.UnwrapOr("") { - case "getaddrinfo", "golang_net_resolver": - // skip cases where there's no DNS record for AAAA, which is a false positive - // - // in principle, this should not happen with getaddrinfo, but we add this - // check nonetheless for robustness against this corner case - if analysisDNSLookupFailureIsDNSNoAnswerForAAAA(obs) { - continue - } - - // only record the first failure - // - // we should only consider the first DNS lookup to be consistent with - // what was previously returned by Web Connectivity v0.4 - wa.DNSExperimentFailure = obs.DNSLookupFailure - return + // as documented, only include the system resolver + if !utilsEngineIsGetaddrinfo(obs.DNSEngine) { + continue + } - default: - // nothing + // skip cases where there's no DNS record for AAAA, which is a false positive + // + // in principle, this should not happen with getaddrinfo, but we add this + // check nonetheless for robustness against this corner case + if analysisDNSLookupFailureIsDNSNoAnswerForAAAA(obs) { + continue } + + // only record the first failure + // + // we should only consider the first DNS lookup to be consistent with + // what was previously returned by Web Connectivity v0.4 + wa.DNSExperimentFailure = obs.DNSLookupFailure + return } } @@ -164,6 +185,11 @@ func (wa *WebAnalysis) ComputeDNSTransactionsWithBogons(c *WebObservationsContai // // See https://github.com/ooni/probe/issues/2274 for more information. + // we cannot flip the state from None to empty until we inspect at least + // a single successful DNS lookup transaction + if len(c.DNSLookupSuccesses) <= 0 { + return + } state := make(map[int64]bool) for _, obs := range c.DNSLookupSuccesses { @@ -183,6 +209,7 @@ func (wa *WebAnalysis) ComputeDNSTransactionsWithBogons(c *WebObservationsContai } } + // note that optional.Some constructs None if state is nil wa.DNSTransactionsWithBogons = optional.Some(state) } @@ -197,19 +224,9 @@ func (wa *WebAnalysis) ComputeDNSTransactionsWithUnexpectedFailures(c *WebObserv // // See https://github.com/ooni/probe/issues/2274 - state := make(map[int64]bool) + var state map[int64]bool for _, obs := range c.DNSLookupFailures { - // skip cases with no control - if obs.ControlDNSLookupFailure.IsNone() { - continue - } - - // skip cases where the control failed as well - if obs.ControlDNSLookupFailure.Unwrap() != "" { - continue - } - // skip cases where the engine is doh (see above comment) if analysisDNSEngineIsDNSOverHTTPS(obs) { continue @@ -223,12 +240,29 @@ func (wa *WebAnalysis) ComputeDNSTransactionsWithUnexpectedFailures(c *WebObserv // TODO(bassosimone): if we set an IPv6 address as the resolver address, we // end up with false positive errors when there's no IPv6 support + // skip cases with no control + if obs.ControlDNSLookupFailure.IsNone() { + continue + } + + // flip from None to empty if we have seen at least one entry for + // which we can compare to the control + if state == nil { + state = make(map[int64]bool) + } + + // skip cases where the control failed as well + if obs.ControlDNSLookupFailure.Unwrap() != "" { + continue + } + // update state if id := obs.DNSTransactionID.UnwrapOr(0); id > 0 { state[id] = true } } + // note that optional.Some constructs None if state is nil wa.DNSTransactionsWithUnexpectedFailures = optional.Some(state) } @@ -241,16 +275,26 @@ func (wa *WebAnalysis) ComputeDNSPossiblyInvalidAddrs(c *WebObservationsContaine // // See https://github.com/ooni/probe/issues/2274 - state := make(map[string]bool) + var state map[string]bool // pass 1: insert candidates into the state map for _, obs := range c.KnownTCPEndpoints { addr := obs.IPAddress.Unwrap() + // skip the comparison if we don't have info about matching + if obs.MatchWithControlIPAddress.IsNone() || obs.MatchWithControlIPAddressASN.IsNone() { + continue + } + + // flip state from None to empty when we see the first couple of + // (probe, th) failures allowing us to perform a comparison + if state == nil { + state = make(map[string]bool) + } + // an address is suspicious if we have information regarding its potential // matching with TH info and we know it does not match - if !obs.MatchWithControlIPAddress.IsNone() && !obs.MatchWithControlIPAddressASN.IsNone() && - !obs.MatchWithControlIPAddress.Unwrap() && !obs.MatchWithControlIPAddressASN.Unwrap() { + if !obs.MatchWithControlIPAddress.Unwrap() && !obs.MatchWithControlIPAddressASN.Unwrap() { state[addr] = true continue } @@ -279,9 +323,108 @@ func (wa *WebAnalysis) ComputeDNSPossiblyInvalidAddrs(c *WebObservationsContaine delete(state, addr) } + // note that optional.Some constructs None if state is nil wa.DNSPossiblyInvalidAddrs = optional.Some(state) } +// ComputeDNSPossiblyInvalidAddrsClassic computes the DNSPossiblyInvalidAddrsClassic field. +func (wa *WebAnalysis) ComputeDNSPossiblyInvalidAddrsClassic(c *WebObservationsContainer) { + // Implementation note: in the case in which DoH returned answers, here + // it still feels okay to consider them. We should avoid flagging DoH + // failures as measurement failures but if DoH returns us some unexpected + // even-non-bogon addr, it seems worth flagging for now. + // + // See https://github.com/ooni/probe/issues/2274 + + var state map[string]bool + + for _, obs := range c.KnownTCPEndpoints { + addr := obs.IPAddress.Unwrap() + + // skip the comparison if we don't have info about matching + if obs.MatchWithControlIPAddress.IsNone() || obs.MatchWithControlIPAddressASN.IsNone() { + continue + } + + // flip state from None to empty when we see the first couple of + // (probe, th) failures allowing us to perform a comparison + if state == nil { + state = make(map[string]bool) + } + + // an address is suspicious if we have information regarding its potential + // matching with TH info and we know it does not match + if !obs.MatchWithControlIPAddress.Unwrap() && !obs.MatchWithControlIPAddressASN.Unwrap() { + state[addr] = true + continue + } + } + + // note that optional.Some constructs None if state is nil + wa.DNSPossiblyInvalidAddrsClassic = optional.Some(state) +} + +// ComputeDNSPossiblyNonexistingDomains computes the DNSPossiblyNonexistingDomains field. +func (wa *WebAnalysis) ComputeDNSPossiblyNonexistingDomains(c *WebObservationsContainer) { + var state map[string]bool + + // first inspect the failures + for _, obs := range c.DNSLookupFailures { + // skip the comparison if we don't have enough information + if obs.DNSLookupFailure.IsNone() || obs.ControlDNSLookupFailure.IsNone() { + continue + } + + // flip state from None to empty when we see the first couple of + // (probe, th) failures allowing us to perform a comparison + if state == nil { + state = make(map[string]bool) + } + + // assume the domain is set in both cases + domain := obs.DNSDomain.Unwrap() + runtimex.Assert(domain == obs.ControlDNSDomain.Unwrap(), "mismatch between domain names") + + // a domain is nonexisting if both the probe and the TH say so + if obs.DNSLookupFailure.Unwrap() != netxlite.FailureDNSNXDOMAINError { + continue + } + if obs.ControlDNSLookupFailure.Unwrap() != "dns_name_error" { + continue + } + + // set the state + state[domain] = true + } + + // then inspect the successes + for _, obs := range c.DNSLookupSuccesses { + // skip the comparison if we don't have enough information + if obs.DNSLookupFailure.IsNone() && obs.ControlDNSLookupFailure.IsNone() { + continue + } + + // assume the domain is always set + domain := obs.DNSDomain.Unwrap() + + // clear the state if the probe succeeded + if !obs.DNSLookupFailure.IsNone() && obs.DNSLookupFailure.Unwrap() == "" { + delete(state, domain) + continue + } + + // clear the state if the TH succeded + if !obs.ControlDNSLookupFailure.IsNone() && obs.ControlDNSLookupFailure.Unwrap() == "" { + runtimex.Assert(domain == obs.ControlDNSDomain.Unwrap(), "mismatch between domain names") + delete(state, domain) + continue + } + } + + // note that optional.Some constructs None if state is nil + wa.DNSPossiblyNonexistingDomains = optional.Some(state) +} + func analysisTCPConnectFailureSeemsMisconfiguredIPv6(obs *WebObservation) bool { switch obs.TCPConnectFailure.UnwrapOr("") { case netxlite.FailureNetworkUnreachable, netxlite.FailureHostUnreachable: @@ -295,7 +438,7 @@ func analysisTCPConnectFailureSeemsMisconfiguredIPv6(obs *WebObservation) bool { // ComputeTCPTransactionsWithUnexpectedTCPConnectFailures computes the TCPTransactionsWithUnexpectedTCPConnectFailures field. func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(c *WebObservationsContainer) { - state := make(map[int64]bool) + var state map[int64]bool for _, obs := range c.KnownTCPEndpoints { // we cannot do anything unless we have both records @@ -303,6 +446,12 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(c continue } + // flip state from None to empty once we have seen the first + // suitable set of measurement/control pairs + if state == nil { + state = make(map[int64]bool) + } + // skip cases with no failures if obs.TCPConnectFailure.Unwrap() == "" { continue @@ -322,12 +471,13 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(c state[obs.EndpointTransactionID.Unwrap()] = true } + // note that optional.Some constructs None if state is nil wa.TCPTransactionsWithUnexpectedTCPConnectFailures = optional.Some(state) } // ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures computes the TCPTransactionsWithUnexpectedTLSHandshakeFailures field. func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures(c *WebObservationsContainer) { - state := make(map[int64]bool) + var state map[int64]bool for _, obs := range c.KnownTCPEndpoints { // we cannot do anything unless we have both records @@ -335,6 +485,12 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures( continue } + // flip state from None to empty once we have seen the first + // suitable set of measurement/control pairs + if state == nil { + state = make(map[int64]bool) + } + // skip cases with no failures if obs.TLSHandshakeFailure.Unwrap() == "" { continue @@ -349,12 +505,13 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures( state[obs.EndpointTransactionID.Unwrap()] = true } + // note that optional.Some constructs None if state is nil wa.TCPTransactionsWithUnexpectedTLSHandshakeFailures = optional.Some(state) } // ComputeTCPTransactionsWithUnexpectedHTTPFailures computes the TCPTransactionsWithUnexpectedHTTPFailures field. func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedHTTPFailures(c *WebObservationsContainer) { - state := make(map[int64]bool) + var state map[int64]bool for _, obs := range c.KnownTCPEndpoints { // we cannot do anything unless we have both records @@ -362,6 +519,12 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedHTTPFailures(c *WebOb continue } + // flip state from None to empty once we have seen the first + // suitable set of measurement/control pairs + if state == nil { + state = make(map[int64]bool) + } + // skip cases with no failures if obs.HTTPFailure.Unwrap() == "" { continue @@ -376,6 +539,7 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedHTTPFailures(c *WebOb state[obs.EndpointTransactionID.Unwrap()] = true } + // note that optional.Some constructs None if state is nil wa.TCPTransactionsWithUnexpectedHTTPFailures = optional.Some(state) } @@ -614,27 +778,49 @@ func (wa *WebAnalysis) ComputeHTTPDiffTitleDifferentLongWords(c *WebObservations } } -// ComputeHTTPFinalResponses computes the HTTPFinalResponses field. -func (wa *WebAnalysis) ComputeHTTPFinalResponses(c *WebObservationsContainer) { - state := make(map[int64]bool) +// ComputeHTTPFinalResponsesWithControl computes the HTTPFinalResponses field. +func (wa *WebAnalysis) ComputeHTTPFinalResponsesWithControl(c *WebObservationsContainer) { + var state map[int64]bool for _, obs := range c.KnownTCPEndpoints { + // skip this entry if we don't know the transaction ID txid := obs.EndpointTransactionID.UnwrapOr(0) if txid <= 0 { continue } - if obs.HTTPResponseIsFinal.UnwrapOr(false) { - state[txid] = true + + // skip this entry if it's not final + isFinal := obs.HTTPResponseIsFinal.UnwrapOr(false) + if !isFinal { + continue + } + + // skip this entry if don't have control information + if obs.ControlHTTPFailure.IsNone() { + continue + } + + // flip state from None to empty when we have seen the first final + // response for which we have valid control info + if state == nil { + state = make(map[int64]bool) + } + + // skip in case the HTTP control failed + if obs.ControlHTTPFailure.Unwrap() != "" { continue } + + state[txid] = true } - wa.HTTPFinalResponses = optional.Some(state) + // note that optional.Some constructs None if state is nil + wa.HTTPFinalResponsesWithControl = optional.Some(state) } // ComputeTCPTransactionsWithUnexplainedUnexpectedFailures computes the TCPTransactionsWithUnexplainedUnexpectedFailures field. func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexplainedUnexpectedFailures(c *WebObservationsContainer) { - state := make(map[int64]bool) + var state map[int64]bool for _, obs := range c.KnownTCPEndpoints { // obtain the transaction ID @@ -649,6 +835,12 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexplainedUnexpectedFailures(c continue } + // flip state from None to empty when we have a reasonable + // expectation of success as explained above + if state == nil { + state = make(map[int64]bool) + } + // if we have a TCP connect measurement, the measurement failed, and we don't have // a corresponding control measurement, we cannot explain this failure using the control // @@ -669,25 +861,46 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexplainedUnexpectedFailures(c } } + // note that optional.Some constructs None if state is nil wa.TCPTransactionsWithUnexplainedUnexpectedFailures = optional.Some(state) } // ComputeHTTPFinalResponsesWithTLS computes the HTTPFinalResponsesWithTLS field. func (wa *WebAnalysis) ComputeHTTPFinalResponsesWithTLS(c *WebObservationsContainer) { - state := make(map[int64]bool) + var state map[int64]bool for _, obs := range c.KnownTCPEndpoints { + // skip this entry if we don't know the transaction ID txid := obs.EndpointTransactionID.UnwrapOr(0) if txid <= 0 { continue } + + // skip this entry if it's not final isFinal := obs.HTTPResponseIsFinal.UnwrapOr(false) - tlsSuccess := obs.TLSHandshakeFailure.UnwrapOr("unknown_failure") == "" - if isFinal && tlsSuccess { - state[txid] = true + if !isFinal { + continue + } + + // skip this entry if we didn't try a TLS handshake + if obs.TLSHandshakeFailure.IsNone() { continue } + + // flip the state from None to empty when we have an endpoint + // for which we attempted a TLS handshake + if state == nil { + state = make(map[int64]bool) + } + + // skip in case the TLS handshake failed + if obs.TLSHandshakeFailure.Unwrap() != "" { + continue + } + + state[txid] = true } + // note that optional.Some constructs None if state is nil wa.HTTPFinalResponsesWithTLS = optional.Some(state) } diff --git a/internal/minipipeline/analysis_test.go b/internal/minipipeline/analysis_test.go index a3a20d0f74..d954b2c971 100644 --- a/internal/minipipeline/analysis_test.go +++ b/internal/minipipeline/analysis_test.go @@ -312,9 +312,9 @@ func TestWebAnalysisComputeHTTPFinalResponses(t *testing.T) { } wa := &WebAnalysis{} - wa.ComputeHTTPFinalResponses(container) + wa.ComputeHTTPFinalResponsesWithControl(container) - if v := wa.HTTPFinalResponses.UnwrapOr(nil); len(v) > 0 { + if v := wa.HTTPFinalResponsesWithControl.UnwrapOr(nil); len(v) > 0 { t.Fatal("should be empty") } }) @@ -329,9 +329,9 @@ func TestWebAnalysisComputeHTTPFinalResponses(t *testing.T) { } wa := &WebAnalysis{} - wa.ComputeHTTPFinalResponses(container) + wa.ComputeHTTPFinalResponsesWithControl(container) - if v := wa.HTTPFinalResponses.UnwrapOr(nil); len(v) > 0 { + if v := wa.HTTPFinalResponsesWithControl.UnwrapOr(nil); len(v) > 0 { t.Fatal("should be empty") } }) @@ -346,9 +346,9 @@ func TestWebAnalysisComputeHTTPFinalResponses(t *testing.T) { } wa := &WebAnalysis{} - wa.ComputeHTTPFinalResponses(container) + wa.ComputeHTTPFinalResponsesWithControl(container) - if v := wa.HTTPFinalResponses.UnwrapOr(nil); len(v) > 0 { + if v := wa.HTTPFinalResponsesWithControl.UnwrapOr(nil); len(v) > 0 { t.Fatal("should be empty") } }) diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/analysis.json index 9f5839859c..645ca821a1 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/analysis.json @@ -1,16 +1,18 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, - "TCPTransactionsWithUnexplainedUnexpectedFailures": {} + "TCPTransactionsWithUnexpectedHTTPFailures": null, + "TCPTransactionsWithUnexplainedUnexpectedFailures": null } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/analysis.json index 9f5839859c..645ca821a1 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/analysis.json @@ -1,16 +1,18 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, - "TCPTransactionsWithUnexplainedUnexpectedFailures": {} + "TCPTransactionsWithUnexpectedHTTPFailures": null, + "TCPTransactionsWithUnexplainedUnexpectedFailures": null } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/analysis.json index 4b299dbc25..fb789db74f 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/analysis.json @@ -1,10 +1,14 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": { "104.154.89.105": true }, + "DNSPossiblyInvalidAddrsClassic": { + "104.154.89.105": true + }, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -12,7 +16,7 @@ "alt-svc": true, "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "4": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/analysis.json index 9f5839859c..645ca821a1 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/analysis.json @@ -1,16 +1,18 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, - "TCPTransactionsWithUnexplainedUnexpectedFailures": {} + "TCPTransactionsWithUnexpectedHTTPFailures": null, + "TCPTransactionsWithUnexplainedUnexpectedFailures": null } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/analysis.json index 4e0f0e6e33..0c5a281502 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/analysis.json @@ -1,20 +1,20 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, - "DNSPossiblyInvalidAddrs": {}, + "DNSTransactionsWithUnexpectedFailures": null, + "DNSPossiblyInvalidAddrs": null, + "DNSPossiblyInvalidAddrsClassic": null, + "DNSPossiblyNonexistingDomains": null, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": { - "3": true - }, + "HTTPFinalResponsesWithControl": null, "HTTPFinalResponsesWithTLS": { "3": true }, - "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, - "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, - "TCPTransactionsWithUnexplainedUnexpectedFailures": {} + "TCPTransactionsWithUnexpectedTCPConnectFailures": null, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": null, + "TCPTransactionsWithUnexpectedHTTPFailures": null, + "TCPTransactionsWithUnexplainedUnexpectedFailures": null } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/analysis.json index f8de1396df..8487f963a4 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/analysis.json @@ -1,18 +1,18 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, - "DNSPossiblyInvalidAddrs": {}, + "DNSTransactionsWithUnexpectedFailures": null, + "DNSPossiblyInvalidAddrs": null, + "DNSPossiblyInvalidAddrsClassic": null, + "DNSPossiblyNonexistingDomains": null, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": { - "3": true - }, - "HTTPFinalResponsesWithTLS": {}, - "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, - "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, - "TCPTransactionsWithUnexplainedUnexpectedFailures": {} + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, + "TCPTransactionsWithUnexpectedTCPConnectFailures": null, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": null, + "TCPTransactionsWithUnexpectedHTTPFailures": null, + "TCPTransactionsWithUnexplainedUnexpectedFailures": null } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/analysis.json index 61a5d50d2b..1c4fa86ff4 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/analysis.json @@ -5,6 +5,8 @@ "2": true }, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -12,7 +14,7 @@ "alt-svc": true, "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "3": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingBOGON/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingBOGON/analysis.json index c34d67f6c6..0f761b8507 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingBOGON/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingBOGON/analysis.json @@ -3,8 +3,10 @@ "DNSTransactionsWithBogons": { "2": true }, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -12,7 +14,7 @@ "alt-svc": true, "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "4": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/analysis.json index 23c80081ac..3efa3eeb31 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/analysis.json @@ -5,6 +5,8 @@ "2": true }, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -12,7 +14,7 @@ "alt-svc": true, "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "3": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/analysis.json index e53951b954..e354181f11 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/analysis.json @@ -1,8 +1,12 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": { + "130.192.182.17": true + }, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -10,7 +14,7 @@ "alt-svc": true, "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "3": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/analysis.json index 618a14e76f..78242ec3c3 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/analysis.json @@ -1,18 +1,22 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": { + "130.192.182.17": true + }, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, "HTTPDiffUncommonHeadersIntersection": { "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "3": true }, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpBlockingConnectionReset/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/httpBlockingConnectionReset/analysis.json index b8af90e860..aa25108b2e 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/httpBlockingConnectionReset/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpBlockingConnectionReset/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json index 53d41f5790..28aea62ea2 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json @@ -1,8 +1,10 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 0.12263535551206783, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": { @@ -11,10 +13,10 @@ "denied": true }, "HTTPDiffUncommonHeadersIntersection": {}, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "3": true }, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json index 53d41f5790..5e6ac9477e 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json @@ -1,8 +1,12 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": { + "130.192.182.17": true + }, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 0.12263535551206783, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": { @@ -11,10 +15,10 @@ "denied": true }, "HTTPDiffUncommonHeadersIntersection": {}, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "3": true }, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/analysis.json index 80a44a3dac..9184905c6f 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/analysis.json index b09118c64d..e9c40ca3b6 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/analysis.json index 18d9132e01..d7909752df 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/analysis.json index b09118c64d..e9c40ca3b6 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/analysis.json index 18d9132e01..d7909752df 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/analysis.json index b09118c64d..e9c40ca3b6 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/analysis.json index 9f5839859c..c8957602bf 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/analysis.json index 18d9132e01..d7909752df 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/analysis.json index b09118c64d..e9c40ca3b6 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/analysis.json @@ -1,14 +1,16 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/analysis.json index 5690c01ad8..b9cda4a5a6 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/analysis.json @@ -1,8 +1,10 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -10,10 +12,10 @@ "alt-svc": true, "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "4": true }, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/analysis.json index e53951b954..5eb6873982 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/analysis.json @@ -1,8 +1,10 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -10,7 +12,7 @@ "alt-svc": true, "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "3": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/analysis.json index c792580bd0..6de4e4a651 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/analysis.json @@ -1,18 +1,20 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": { "3": true }, - "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": null, + "TCPTransactionsWithUnexpectedHTTPFailures": null, "TCPTransactionsWithUnexplainedUnexpectedFailures": {} } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/analysis.json index 7fdae21358..1039206d4d 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/analysis.json @@ -1,10 +1,14 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": { "83.224.65.41": true }, + "DNSPossiblyInvalidAddrsClassic": { + "83.224.65.41": true + }, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": 1, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -12,10 +16,10 @@ "alt-svc": true, "content-length": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "5": true }, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": { "3": true }, diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/analysis.json index 9a34aa1ade..7c46aad0a5 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/analysis.json @@ -1,18 +1,20 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": { "3": true }, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": null, "TCPTransactionsWithUnexplainedUnexpectedFailures": {} } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/analysis.json index 5da2a782e7..67832c6f2e 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/analysis.json @@ -1,21 +1,25 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": { "130.192.182.17": true }, + "DNSPossiblyInvalidAddrsClassic": { + "130.192.182.17": true + }, + "DNSPossiblyNonexistingDomains": {}, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": { "3": true, "4": true }, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": null, "TCPTransactionsWithUnexplainedUnexpectedFailures": {} } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/analysis.json index fa27d26176..7165bcf08c 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/analysis.json @@ -1,16 +1,20 @@ { "DNSExperimentFailure": "dns_nxdomain_error", - "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithBogons": null, "DNSTransactionsWithUnexpectedFailures": {}, - "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrs": null, + "DNSPossiblyInvalidAddrsClassic": null, + "DNSPossiblyNonexistingDomains": { + "www.example.xyz": true + }, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, - "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, - "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, - "TCPTransactionsWithUnexplainedUnexpectedFailures": {} + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, + "TCPTransactionsWithUnexpectedTCPConnectFailures": null, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": null, + "TCPTransactionsWithUnexpectedHTTPFailures": null, + "TCPTransactionsWithUnexplainedUnexpectedFailures": null } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/manual/dnsgoogle80/analysis.json b/internal/minipipeline/testdata/webconnectivity/manual/dnsgoogle80/analysis.json index 9f5839859c..665f445156 100644 --- a/internal/minipipeline/testdata/webconnectivity/manual/dnsgoogle80/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/manual/dnsgoogle80/analysis.json @@ -1,16 +1,18 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": null, "HTTPDiffBodyProportionFactor": null, "HTTPDiffStatusCodeMatch": null, "HTTPDiffTitleDifferentLongWords": null, "HTTPDiffUncommonHeadersIntersection": null, - "HTTPFinalResponses": {}, - "HTTPFinalResponsesWithTLS": {}, + "HTTPFinalResponsesWithControl": null, + "HTTPFinalResponsesWithTLS": null, "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, - "TCPTransactionsWithUnexpectedHTTPFailures": {}, - "TCPTransactionsWithUnexplainedUnexpectedFailures": {} + "TCPTransactionsWithUnexpectedHTTPFailures": null, + "TCPTransactionsWithUnexplainedUnexpectedFailures": null } \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/manual/noipv6/analysis.json b/internal/minipipeline/testdata/webconnectivity/manual/noipv6/analysis.json index c510764910..53bc507507 100644 --- a/internal/minipipeline/testdata/webconnectivity/manual/noipv6/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/manual/noipv6/analysis.json @@ -1,8 +1,10 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": null, "HTTPDiffBodyProportionFactor": 0.6166324592304209, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -14,7 +16,7 @@ "permissions-policy": true, "report-to": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "8": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/testdata/webconnectivity/manual/youtube/analysis.json b/internal/minipipeline/testdata/webconnectivity/manual/youtube/analysis.json index 1ccad9a800..76512b8c23 100644 --- a/internal/minipipeline/testdata/webconnectivity/manual/youtube/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/manual/youtube/analysis.json @@ -1,8 +1,10 @@ { "DNSExperimentFailure": null, "DNSTransactionsWithBogons": {}, - "DNSTransactionsWithUnexpectedFailures": {}, + "DNSTransactionsWithUnexpectedFailures": null, "DNSPossiblyInvalidAddrs": {}, + "DNSPossiblyInvalidAddrsClassic": {}, + "DNSPossiblyNonexistingDomains": null, "HTTPDiffBodyProportionFactor": 0.6327409384828159, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": {}, @@ -14,7 +16,7 @@ "permissions-policy": true, "report-to": true }, - "HTTPFinalResponses": { + "HTTPFinalResponsesWithControl": { "8": true }, "HTTPFinalResponsesWithTLS": { diff --git a/internal/minipipeline/utils.go b/internal/minipipeline/utils.go index 99be17b155..bd372d8fb5 100644 --- a/internal/minipipeline/utils.go +++ b/internal/minipipeline/utils.go @@ -61,3 +61,12 @@ func utilsForEachIPAddress(answers []model.ArchivalDNSAnswer, fx func(ipAddr str } } } + +func utilsEngineIsGetaddrinfo(engine optional.Value[string]) bool { + switch engine.UnwrapOr("") { + case "getaddrinfo", "golang_net_resolver": + return true + default: + return false + } +}