refactor(ndt7): use netxlite rather than netx (#768)
This diff required us to move some code around, but no major change actually happened, except better tests. While there, I also slightly refactored ndt7's implementation and removed the ProxyURL setting, which was actually unused. See https://github.com/ooni/probe/issues/2121
This commit is contained in:
@@ -1,10 +0,0 @@
|
||||
package ndt7
|
||||
|
||||
import "time"
|
||||
|
||||
func defaultCallbackJSON(data []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func defaultCallbackPerformance(elapsed time.Duration, count int64) {
|
||||
}
|
||||
@@ -4,10 +4,9 @@ import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/ooni/probe-cli/v3/internal/engine/netx/dialer"
|
||||
"github.com/ooni/probe-cli/v3/internal/bytecounter"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
"github.com/ooni/probe-cli/v3/internal/netxlite"
|
||||
)
|
||||
@@ -15,7 +14,6 @@ import (
|
||||
type dialManager struct {
|
||||
ndt7URL string
|
||||
logger model.Logger
|
||||
proxyURL *url.URL
|
||||
readBufferSize int
|
||||
userAgent string
|
||||
writeBufferSize int
|
||||
@@ -32,16 +30,9 @@ func newDialManager(ndt7URL string, logger model.Logger, userAgent string) dialM
|
||||
}
|
||||
|
||||
func (mgr dialManager) dialWithTestName(ctx context.Context, testName string) (*websocket.Conn, error) {
|
||||
var reso model.Resolver = &netxlite.ResolverSystem{}
|
||||
reso = &netxlite.ResolverLogger{
|
||||
Resolver: reso,
|
||||
Logger: mgr.logger,
|
||||
}
|
||||
dlr := dialer.New(&dialer.Config{
|
||||
ContextByteCounting: true,
|
||||
Logger: mgr.logger,
|
||||
ProxyURL: mgr.proxyURL,
|
||||
}, reso)
|
||||
reso := netxlite.NewResolverStdlib(mgr.logger)
|
||||
dlr := netxlite.NewDialerWithResolver(mgr.logger, reso)
|
||||
dlr = bytecounter.NewContextAwareDialer(dlr)
|
||||
// Implements shaping if the user builds using `-tags shaping`
|
||||
// See https://github.com/ooni/probe/issues/2112
|
||||
dlr = netxlite.NewMaybeShapingDialer(dlr)
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
)
|
||||
|
||||
type downloadManager struct {
|
||||
conn mockableConn
|
||||
conn wsConn
|
||||
maxMessageSize int64
|
||||
maxRuntime time.Duration
|
||||
measureInterval time.Duration
|
||||
@@ -20,7 +20,7 @@ type downloadManager struct {
|
||||
}
|
||||
|
||||
func newDownloadManager(
|
||||
conn mockableConn, onPerformance callbackPerformance,
|
||||
conn wsConn, onPerformance callbackPerformance,
|
||||
onJSON callbackJSON,
|
||||
) downloadManager {
|
||||
return downloadManager{
|
||||
|
||||
@@ -12,10 +12,17 @@ import (
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
func defaultCallbackJSON(data []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func defaultCallbackPerformance(elapsed time.Duration, count int64) {
|
||||
}
|
||||
|
||||
func TestDownloadSetReadDeadlineFailure(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
mgr := newDownloadManager(
|
||||
&mockableConnMock{
|
||||
&mockableWSConn{
|
||||
ReadDeadlineErr: expected,
|
||||
},
|
||||
defaultCallbackPerformance,
|
||||
@@ -30,7 +37,7 @@ func TestDownloadSetReadDeadlineFailure(t *testing.T) {
|
||||
func TestDownloadNextReaderFailure(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
mgr := newDownloadManager(
|
||||
&mockableConnMock{
|
||||
&mockableWSConn{
|
||||
NextReaderErr: expected,
|
||||
},
|
||||
defaultCallbackPerformance,
|
||||
@@ -45,7 +52,7 @@ func TestDownloadNextReaderFailure(t *testing.T) {
|
||||
func TestDownloadTextMessageReadAllFailure(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
mgr := newDownloadManager(
|
||||
&mockableConnMock{
|
||||
&mockableWSConn{
|
||||
NextReaderMsgType: websocket.TextMessage,
|
||||
NextReaderReader: func() io.Reader {
|
||||
return &alwaysFailingReader{
|
||||
@@ -73,7 +80,7 @@ func (r *alwaysFailingReader) Read(p []byte) (int, error) {
|
||||
func TestDownloadBinaryMessageReadAllFailure(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
mgr := newDownloadManager(
|
||||
&mockableConnMock{
|
||||
&mockableWSConn{
|
||||
NextReaderMsgType: websocket.BinaryMessage,
|
||||
NextReaderReader: func() io.Reader {
|
||||
return &alwaysFailingReader{
|
||||
@@ -92,7 +99,7 @@ func TestDownloadBinaryMessageReadAllFailure(t *testing.T) {
|
||||
|
||||
func TestDownloadOnJSONCallbackError(t *testing.T) {
|
||||
mgr := newDownloadManager(
|
||||
&mockableConnMock{
|
||||
&mockableWSConn{
|
||||
NextReaderMsgType: websocket.TextMessage,
|
||||
NextReaderReader: func() io.Reader {
|
||||
return &invalidJSONReader{}
|
||||
@@ -121,7 +128,7 @@ func TestDownloadOnJSONLoop(t *testing.T) {
|
||||
t.Skip("skip test in short mode")
|
||||
}
|
||||
mgr := newDownloadManager(
|
||||
&mockableConnMock{
|
||||
&mockableWSConn{
|
||||
NextReaderMsgType: websocket.TextMessage,
|
||||
NextReaderReader: func() io.Reader {
|
||||
return &goodJSONReader{}
|
||||
|
||||
@@ -12,7 +12,7 @@ func newMessage(n int) (*websocket.PreparedMessage, error) {
|
||||
}
|
||||
|
||||
type uploadManager struct {
|
||||
conn mockableConn
|
||||
conn wsConn
|
||||
fractionForScaling int64
|
||||
maxRuntime time.Duration
|
||||
maxMessageSize int
|
||||
@@ -24,7 +24,7 @@ type uploadManager struct {
|
||||
}
|
||||
|
||||
func newUploadManager(
|
||||
conn mockableConn, onPerformance callbackPerformance,
|
||||
conn wsConn, onPerformance callbackPerformance,
|
||||
) uploadManager {
|
||||
return uploadManager{
|
||||
conn: conn,
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
func TestUploadSetWriteDeadlineFailure(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
mgr := newUploadManager(
|
||||
&mockableConnMock{
|
||||
&mockableWSConn{
|
||||
WriteDeadlineErr: expected,
|
||||
},
|
||||
defaultCallbackPerformance,
|
||||
@@ -26,7 +26,7 @@ func TestUploadSetWriteDeadlineFailure(t *testing.T) {
|
||||
func TestUploadNewMessageFailure(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
mgr := newUploadManager(
|
||||
&mockableConnMock{},
|
||||
&mockableWSConn{},
|
||||
defaultCallbackPerformance,
|
||||
)
|
||||
mgr.newMessage = func(int) (*websocket.PreparedMessage, error) {
|
||||
@@ -41,7 +41,7 @@ func TestUploadNewMessageFailure(t *testing.T) {
|
||||
func TestUploadWritePreparedMessageFailure(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
mgr := newUploadManager(
|
||||
&mockableConnMock{
|
||||
&mockableWSConn{
|
||||
WritePreparedMessageErr: expected,
|
||||
},
|
||||
defaultCallbackPerformance,
|
||||
@@ -55,7 +55,7 @@ func TestUploadWritePreparedMessageFailure(t *testing.T) {
|
||||
func TestUploadWritePreparedMessageSubsequentFailure(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
mgr := newUploadManager(
|
||||
&mockableConnMock{},
|
||||
&mockableWSConn{},
|
||||
defaultCallbackPerformance,
|
||||
)
|
||||
var already bool
|
||||
@@ -77,7 +77,7 @@ func TestUploadLoop(t *testing.T) {
|
||||
t.Skip("skip test in short mode")
|
||||
}
|
||||
mgr := newUploadManager(
|
||||
&mockableConnMock{},
|
||||
&mockableWSConn{},
|
||||
defaultCallbackPerformance,
|
||||
)
|
||||
mgr.newMessage = func(int) (*websocket.PreparedMessage, error) {
|
||||
|
||||
+2
-1
@@ -7,7 +7,8 @@ import (
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
type mockableConn interface {
|
||||
// weConn is the interface of gorilla/websocket.Conn
|
||||
type wsConn interface {
|
||||
NextReader() (int, io.Reader, error)
|
||||
SetReadDeadline(time.Time) error
|
||||
SetReadLimit(int64)
|
||||
+6
-6
@@ -7,7 +7,7 @@ import (
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
type mockableConnMock struct {
|
||||
type mockableWSConn struct {
|
||||
NextReaderMsgType int
|
||||
NextReaderErr error
|
||||
NextReaderReader func() io.Reader
|
||||
@@ -16,7 +16,7 @@ type mockableConnMock struct {
|
||||
WritePreparedMessageErr error
|
||||
}
|
||||
|
||||
func (c *mockableConnMock) NextReader() (int, io.Reader, error) {
|
||||
func (c *mockableWSConn) NextReader() (int, io.Reader, error) {
|
||||
var reader io.Reader
|
||||
if c.NextReaderReader != nil {
|
||||
reader = c.NextReaderReader()
|
||||
@@ -24,16 +24,16 @@ func (c *mockableConnMock) NextReader() (int, io.Reader, error) {
|
||||
return c.NextReaderMsgType, reader, c.NextReaderErr
|
||||
}
|
||||
|
||||
func (c *mockableConnMock) SetReadDeadline(time.Time) error {
|
||||
func (c *mockableWSConn) SetReadDeadline(time.Time) error {
|
||||
return c.ReadDeadlineErr
|
||||
}
|
||||
|
||||
func (c *mockableConnMock) SetReadLimit(int64) {}
|
||||
func (c *mockableWSConn) SetReadLimit(int64) {}
|
||||
|
||||
func (c *mockableConnMock) SetWriteDeadline(time.Time) error {
|
||||
func (c *mockableWSConn) SetWriteDeadline(time.Time) error {
|
||||
return c.WriteDeadlineErr
|
||||
}
|
||||
|
||||
func (c *mockableConnMock) WritePreparedMessage(*websocket.PreparedMessage) error {
|
||||
func (c *mockableWSConn) WritePreparedMessage(*websocket.PreparedMessage) error {
|
||||
return c.WritePreparedMessageErr
|
||||
}
|
||||
Reference in New Issue
Block a user