feat: dnsping using step-by-step (#831)

Reference issue for this pull request: https://github.com/ooni/probe/issues/2159

This diff refactors the `dnsping` experiment to use the [step-by-step measurement style](https://github.com/ooni/probe-cli/blob/master/docs/design/dd-003-step-by-step.md).

Co-authored-by: decfox <decfox@github.com>
Co-authored-by: Simone Basso <bassosimone@gmail.com>
This commit is contained in:
DecFox
2022-07-08 23:12:24 +05:30
committed by GitHub
parent 8aad36a257
commit 5501b2201a
16 changed files with 747 additions and 77 deletions
+4 -4
View File
@@ -104,7 +104,7 @@ func TestMeasureWithUDPResolver(t *testing.T) {
t.Run("on success", func(t *testing.T) {
dlr := netxlite.NewDialerWithoutResolver(log.Log)
r := netxlite.NewParallelResolverUDP(log.Log, dlr, "8.8.4.4:53")
r := netxlite.NewParallelUDPResolver(log.Log, dlr, "8.8.4.4:53")
defer r.CloseIdleConnections()
ctx := context.Background()
addrs, err := r.LookupHost(ctx, "dns.google.com")
@@ -128,7 +128,7 @@ func TestMeasureWithUDPResolver(t *testing.T) {
}
defer listener.Close()
dlr := netxlite.NewDialerWithoutResolver(log.Log)
r := netxlite.NewParallelResolverUDP(log.Log, dlr, listener.LocalAddr().String())
r := netxlite.NewParallelUDPResolver(log.Log, dlr, listener.LocalAddr().String())
defer r.CloseIdleConnections()
ctx := context.Background()
addrs, err := r.LookupHost(ctx, "ooni.org")
@@ -152,7 +152,7 @@ func TestMeasureWithUDPResolver(t *testing.T) {
}
defer listener.Close()
dlr := netxlite.NewDialerWithoutResolver(log.Log)
r := netxlite.NewParallelResolverUDP(log.Log, dlr, listener.LocalAddr().String())
r := netxlite.NewParallelUDPResolver(log.Log, dlr, listener.LocalAddr().String())
defer r.CloseIdleConnections()
ctx := context.Background()
addrs, err := r.LookupHost(ctx, "ooni.org")
@@ -176,7 +176,7 @@ func TestMeasureWithUDPResolver(t *testing.T) {
}
defer listener.Close()
dlr := netxlite.NewDialerWithoutResolver(log.Log)
r := netxlite.NewParallelResolverUDP(log.Log, dlr, listener.LocalAddr().String())
r := netxlite.NewParallelUDPResolver(log.Log, dlr, listener.LocalAddr().String())
defer r.CloseIdleConnections()
ctx := context.Background()
addrs, err := r.LookupHost(ctx, "ooni.org")
+4 -4
View File
@@ -49,7 +49,7 @@ func NewUnwrappedStdlibResolver(wrappers ...model.DNSTransportWrapper) model.Res
}
}
// NewSerialResolverUDP creates a new Resolver using DNS-over-UDP
// NewSerialUDPResolver creates a new Resolver using DNS-over-UDP
// that performs serial A/AAAA lookups during LookupHost.
//
// Deprecated: use NewParallelResolverUDP.
@@ -64,14 +64,14 @@ func NewUnwrappedStdlibResolver(wrappers ...model.DNSTransportWrapper) model.Res
//
// - wrappers is the optional list of wrappers to wrap the underlying
// transport. Any nil wrapper will be silently ignored.
func NewSerialResolverUDP(logger model.DebugLogger, dialer model.Dialer,
func NewSerialUDPResolver(logger model.DebugLogger, dialer model.Dialer,
address string, wrappers ...model.DNSTransportWrapper) model.Resolver {
return WrapResolver(logger, NewUnwrappedSerialResolver(
WrapDNSTransport(NewUnwrappedDNSOverUDPTransport(dialer, address), wrappers...),
))
}
// NewParallelResolverUDP creates a new Resolver using DNS-over-UDP
// NewParallelUDPResolver creates a new Resolver using DNS-over-UDP
// that performs parallel A/AAAA lookups during LookupHost.
//
// Arguments:
@@ -84,7 +84,7 @@ func NewSerialResolverUDP(logger model.DebugLogger, dialer model.Dialer,
//
// - wrappers is the optional list of wrappers to wrap the underlying
// transport. Any nil wrapper will be silently ignored.
func NewParallelResolverUDP(logger model.DebugLogger, dialer model.Dialer,
func NewParallelUDPResolver(logger model.DebugLogger, dialer model.Dialer,
address string, wrappers ...model.DNSTransportWrapper) model.Resolver {
return WrapResolver(logger, NewUnwrappedParallelResolver(
WrapDNSTransport(NewUnwrappedDNSOverUDPTransport(dialer, address), wrappers...),
+4 -4
View File
@@ -33,9 +33,9 @@ func TestNewResolverSystem(t *testing.T) {
typecheckForSystemResolver(t, resolver, model.DiscardLogger)
}
func TestNewSerialResolverUDP(t *testing.T) {
func TestNewSerialUDPResolver(t *testing.T) {
d := NewDialerWithoutResolver(log.Log)
resolver := NewSerialResolverUDP(log.Log, d, "1.1.1.1:53")
resolver := NewSerialUDPResolver(log.Log, d, "1.1.1.1:53")
idna := resolver.(*resolverIDNA)
logger := idna.Resolver.(*resolverLogger)
if logger.Logger != log.Log {
@@ -51,9 +51,9 @@ func TestNewSerialResolverUDP(t *testing.T) {
}
}
func TestNewParallelResolverUDP(t *testing.T) {
func TestNewParallelUDPResolver(t *testing.T) {
d := NewDialerWithoutResolver(log.Log)
resolver := NewParallelResolverUDP(log.Log, d, "1.1.1.1:53")
resolver := NewParallelUDPResolver(log.Log, d, "1.1.1.1:53")
idna := resolver.(*resolverIDNA)
logger := idna.Resolver.(*resolverLogger)
if logger.Logger != log.Log {
+5
View File
@@ -98,9 +98,13 @@ type parallelResolverResult struct {
func (r *ParallelResolver) lookupHost(ctx context.Context, hostname string,
qtype uint16, out chan<- *parallelResolverResult) {
encoder := &DNSEncoderMiekg{}
trace := ContextTraceOrDefault(ctx)
query := encoder.Encode(hostname, qtype, r.Txp.RequiresPadding())
started := trace.TimeNow()
response, err := r.Txp.RoundTrip(ctx, query)
finished := trace.TimeNow()
if err != nil {
trace.OnDNSRoundTripForLookupHost(started, r, query, response, []string{}, err, finished)
out <- &parallelResolverResult{
addrs: []string{},
err: err,
@@ -108,6 +112,7 @@ func (r *ParallelResolver) lookupHost(ctx context.Context, hostname string,
return
}
addrs, err := response.DecodeLookupHost()
trace.OnDNSRoundTripForLookupHost(started, r, query, response, addrs, err, finished)
out <- &parallelResolverResult{
addrs: addrs,
err: err,
+6
View File
@@ -49,6 +49,12 @@ func (*traceDefault) TimeNow() time.Time {
return time.Now()
}
// OnDNSRoundTripForLookupHost implements model.Trace.OnDNSRoundTripForLookupHost.
func (*traceDefault) OnDNSRoundTripForLookupHost(started time.Time, reso model.Resolver, query model.DNSQuery,
response model.DNSResponse, addrs []string, err error, finished time.Time) {
// nothing
}
// OnConnectDone implements model.Trace.OnConnectDone.
func (*traceDefault) OnConnectDone(
started time.Time, network, domain, remoteAddr string, err error, finished time.Time) {