refactor: only use shaping dialer for ndt7 and dash (#754)
See https://github.com/ooni/probe/issues/2112 for context. While there, run `go fix -fix buildtag ./...`
This commit is contained in:
parent
b68b8e1e8f
commit
6924d1ad81
|
@ -1,5 +1,4 @@
|
||||||
//go:build linux
|
//go:build linux
|
||||||
// +build linux
|
|
||||||
|
|
||||||
package iptables
|
package iptables
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build !linux
|
//go:build !linux
|
||||||
// +build !linux
|
|
||||||
|
|
||||||
package iptables
|
package iptables
|
||||||
|
|
||||||
|
|
|
@ -259,8 +259,14 @@ func (m Measurer) Run(
|
||||||
httpClient := &http.Client{
|
httpClient := &http.Client{
|
||||||
Transport: netx.NewHTTPTransport(netx.Config{
|
Transport: netx.NewHTTPTransport(netx.Config{
|
||||||
ContextByteCounting: true,
|
ContextByteCounting: true,
|
||||||
DialSaver: saver,
|
// Implements shaping if the user builds using `-tags shaping`
|
||||||
Logger: sess.Logger(),
|
// See https://github.com/ooni/probe/issues/2112
|
||||||
|
Dialer: netxlite.NewMaybeShapingDialer(netx.NewDialer(netx.Config{
|
||||||
|
ContextByteCounting: true,
|
||||||
|
DialSaver: saver,
|
||||||
|
Logger: sess.Logger(),
|
||||||
|
})),
|
||||||
|
Logger: sess.Logger(),
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
defer httpClient.CloseIdleConnections()
|
defer httpClient.CloseIdleConnections()
|
||||||
|
|
|
@ -42,6 +42,9 @@ func (mgr dialManager) dialWithTestName(ctx context.Context, testName string) (*
|
||||||
Logger: mgr.logger,
|
Logger: mgr.logger,
|
||||||
ProxyURL: mgr.proxyURL,
|
ProxyURL: mgr.proxyURL,
|
||||||
}, reso)
|
}, reso)
|
||||||
|
// Implements shaping if the user builds using `-tags shaping`
|
||||||
|
// See https://github.com/ooni/probe/issues/2112
|
||||||
|
dlr = netxlite.NewMaybeShapingDialer(dlr)
|
||||||
// We force using our bundled CA pool, which should fix
|
// We force using our bundled CA pool, which should fix
|
||||||
// https://github.com/ooni/probe/issues/2031
|
// https://github.com/ooni/probe/issues/2031
|
||||||
tlsConfig := &tls.Config{
|
tlsConfig := &tls.Config{
|
||||||
|
|
|
@ -67,6 +67,5 @@ func New(config *Config, resolver model.Resolver) model.Dialer {
|
||||||
if config.ContextByteCounting {
|
if config.ContextByteCounting {
|
||||||
d = &byteCounterDialer{Dialer: d}
|
d = &byteCounterDialer{Dialer: d}
|
||||||
}
|
}
|
||||||
d = &shapingDialer{Dialer: d}
|
|
||||||
return d
|
return d
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,11 +18,7 @@ func TestNewCreatesTheExpectedChain(t *testing.T) {
|
||||||
ProxyURL: &url.URL{},
|
ProxyURL: &url.URL{},
|
||||||
ReadWriteSaver: saver,
|
ReadWriteSaver: saver,
|
||||||
}, netxlite.DefaultResolver)
|
}, netxlite.DefaultResolver)
|
||||||
shd, ok := dlr.(*shapingDialer)
|
bcd, ok := dlr.(*byteCounterDialer)
|
||||||
if !ok {
|
|
||||||
t.Fatal("not a shapingDialer")
|
|
||||||
}
|
|
||||||
bcd, ok := shd.Dialer.(*byteCounterDialer)
|
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Fatal("not a byteCounterDialer")
|
t.Fatal("not a byteCounterDialer")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
//go:build !shaping
|
|
||||||
// +build !shaping
|
|
||||||
|
|
||||||
package dialer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net"
|
|
||||||
|
|
||||||
"github.com/ooni/probe-cli/v3/internal/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
// shapingDialer ensures we don't use too much bandwidth
|
|
||||||
// when using integration tests at GitHub. To select
|
|
||||||
// the implementation with shaping use `-tags shaping`.
|
|
||||||
type shapingDialer struct {
|
|
||||||
model.Dialer
|
|
||||||
}
|
|
||||||
|
|
||||||
// DialContext implements Dialer.DialContext
|
|
||||||
func (d *shapingDialer) DialContext(
|
|
||||||
ctx context.Context, network, address string) (net.Conn, error) {
|
|
||||||
return d.Dialer.DialContext(ctx, network, address)
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
package dialer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/ooni/probe-cli/v3/internal/netxlite"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestShapingDialerGood(t *testing.T) {
|
|
||||||
d := &shapingDialer{Dialer: netxlite.DefaultDialer}
|
|
||||||
txp := &http.Transport{DialContext: d.DialContext}
|
|
||||||
client := &http.Client{Transport: txp}
|
|
||||||
resp, err := client.Get("https://www.google.com/")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if resp == nil {
|
|
||||||
t.Fatal("expected nil response here")
|
|
||||||
}
|
|
||||||
resp.Body.Close()
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build !ooni_psiphon_config
|
//go:build !ooni_psiphon_config
|
||||||
// +build !ooni_psiphon_config
|
|
||||||
|
|
||||||
package engine
|
package engine
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build !ooni_psiphon_config
|
//go:build !ooni_psiphon_config
|
||||||
// +build !ooni_psiphon_config
|
|
||||||
|
|
||||||
package engine
|
package engine
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build ooni_psiphon_config
|
//go:build ooni_psiphon_config
|
||||||
// +build ooni_psiphon_config
|
|
||||||
|
|
||||||
package engine
|
package engine
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build ooni_psiphon_config
|
//go:build ooni_psiphon_config
|
||||||
// +build ooni_psiphon_config
|
|
||||||
|
|
||||||
package engine
|
package engine
|
||||||
|
|
||||||
|
|
15
internal/netxlite/shaping.go
Normal file
15
internal/netxlite/shaping.go
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
package netxlite
|
||||||
|
|
||||||
|
import "github.com/ooni/probe-cli/v3/internal/model"
|
||||||
|
|
||||||
|
// NewMaybeShapingDialer takes in input a model.Dialer and returns in output another
|
||||||
|
// model.Dialer that MAY dial connections with I/O shaping, depending on whether
|
||||||
|
// the user builds with or without the `-tags shaping` CLI flag.
|
||||||
|
//
|
||||||
|
// We typically use `-tags shaping` when running integration tests for dash and ndt7 to
|
||||||
|
// avoiod hammering m-lab servers from the very-fast GitHub CI servers.
|
||||||
|
//
|
||||||
|
// See https://github.com/ooni/probe/issues/2112 for extra context.
|
||||||
|
func NewMaybeShapingDialer(dialer model.Dialer) model.Dialer {
|
||||||
|
return newMaybeShapingDialer(dialer)
|
||||||
|
}
|
11
internal/netxlite/shaping_otherwise.go
Normal file
11
internal/netxlite/shaping_otherwise.go
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
//go:build !shaping
|
||||||
|
|
||||||
|
package netxlite
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/ooni/probe-cli/v3/internal/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newMaybeShapingDialer(dialer model.Dialer) model.Dialer {
|
||||||
|
return dialer
|
||||||
|
}
|
17
internal/netxlite/shaping_otherwise_test.go
Normal file
17
internal/netxlite/shaping_otherwise_test.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
//go:build !shaping
|
||||||
|
|
||||||
|
package netxlite
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ooni/probe-cli/v3/internal/model/mocks"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewShapingDialer(t *testing.T) {
|
||||||
|
in := &mocks.Dialer{}
|
||||||
|
out := NewMaybeShapingDialer(in)
|
||||||
|
if in != out {
|
||||||
|
t.Fatal("expected to see the same pointer")
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
//go:build shaping
|
//go:build shaping
|
||||||
// +build shaping
|
|
||||||
|
|
||||||
package dialer
|
package netxlite
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -11,9 +10,10 @@ import (
|
||||||
"github.com/ooni/probe-cli/v3/internal/model"
|
"github.com/ooni/probe-cli/v3/internal/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// shapingDialer ensures we don't use too much bandwidth
|
func newMaybeShapingDialer(dialer model.Dialer) model.Dialer {
|
||||||
// when using integration tests at GitHub. To select
|
return &shapingDialer{dialer}
|
||||||
// the implementation with shaping use `-tags shaping`.
|
}
|
||||||
|
|
||||||
type shapingDialer struct {
|
type shapingDialer struct {
|
||||||
model.Dialer
|
model.Dialer
|
||||||
}
|
}
|
66
internal/netxlite/shaping_shaping_test.go
Normal file
66
internal/netxlite/shaping_shaping_test.go
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
//go:build shaping
|
||||||
|
|
||||||
|
package netxlite
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"net"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ooni/probe-cli/v3/internal/model/mocks"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewShapingDialerx(t *testing.T) {
|
||||||
|
t.Run("failure", func(t *testing.T) {
|
||||||
|
expected := errors.New("mocked error")
|
||||||
|
d := &mocks.Dialer{
|
||||||
|
MockDialContext: func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
|
return nil, expected
|
||||||
|
},
|
||||||
|
}
|
||||||
|
shd := NewMaybeShapingDialer(d)
|
||||||
|
conn, err := shd.DialContext(context.Background(), "tcp", "8.8.8.8:443")
|
||||||
|
if !errors.Is(err, expected) {
|
||||||
|
t.Fatal("unexpected err", err)
|
||||||
|
}
|
||||||
|
if conn != nil {
|
||||||
|
t.Fatal("expected nil conn")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("success", func(t *testing.T) {
|
||||||
|
expected := errors.New("mocked error")
|
||||||
|
uc := &mocks.Conn{
|
||||||
|
MockRead: func(b []byte) (int, error) {
|
||||||
|
return 0, expected
|
||||||
|
},
|
||||||
|
MockWrite: func(b []byte) (int, error) {
|
||||||
|
return 0, expected
|
||||||
|
},
|
||||||
|
}
|
||||||
|
d := &mocks.Dialer{
|
||||||
|
MockDialContext: func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
|
return uc, nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
shd := NewMaybeShapingDialer(d)
|
||||||
|
conn, err := shd.DialContext(context.Background(), "tcp", "8.8.8.8:443")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if _, ok := conn.(*shapingConn); !ok {
|
||||||
|
t.Fatal("not shapingConn")
|
||||||
|
}
|
||||||
|
validateCountAndErr := func(count int, err error) {
|
||||||
|
if !errors.Is(err, expected) {
|
||||||
|
t.Fatal("unexpected err", err)
|
||||||
|
}
|
||||||
|
if count != 0 {
|
||||||
|
t.Fatal("expected zero")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
validateCountAndErr(conn.Read(make([]byte, 16)))
|
||||||
|
validateCountAndErr(conn.Write(make([]byte, 16)))
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user