refactor(netxlite): improve tests for http and http3 (#487)
* refactor(netxlite): improve tests for http and http3 See https://github.com/ooni/probe/issues/1591 * Update internal/netxlite/http3.go
This commit is contained in:
parent
6d39118b26
commit
493b72b170
6 changed files with 547 additions and 344 deletions
|
|
@ -1,42 +1,99 @@
|
|||
package netxlite
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"github.com/apex/log"
|
||||
"github.com/lucas-clemente/quic-go"
|
||||
"github.com/lucas-clemente/quic-go/http3"
|
||||
"github.com/ooni/probe-cli/v3/internal/netxlite/mocks"
|
||||
)
|
||||
|
||||
func TestHTTP3TransportWorks(t *testing.T) {
|
||||
d := &quicDialerResolver{
|
||||
Dialer: &quicDialerQUICGo{
|
||||
QUICListener: &quicListenerStdlib{},
|
||||
},
|
||||
Resolver: NewResolverSystem(log.Log),
|
||||
}
|
||||
txp := NewHTTP3Transport(d, &tls.Config{})
|
||||
client := &http.Client{Transport: txp}
|
||||
resp, err := client.Get("https://www.google.com/robots.txt")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
resp.Body.Close()
|
||||
txp.CloseIdleConnections()
|
||||
func TestHTTP3Dialer(t *testing.T) {
|
||||
t.Run("Dial", func(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
d := &http3Dialer{
|
||||
QUICDialer: &mocks.QUICDialer{
|
||||
MockDialContext: func(ctx context.Context, network, address string, tlsConfig *tls.Config, quicConfig *quic.Config) (quic.EarlySession, error) {
|
||||
return nil, expected
|
||||
},
|
||||
},
|
||||
}
|
||||
sess, err := d.dial("", "", &tls.Config{}, &quic.Config{})
|
||||
if !errors.Is(err, expected) {
|
||||
t.Fatal("unexpected err", err)
|
||||
}
|
||||
if sess != nil {
|
||||
t.Fatal("unexpected resp")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestHTTP3TransportClosesIdleConnections(t *testing.T) {
|
||||
var called bool
|
||||
d := &mocks.QUICDialer{
|
||||
MockCloseIdleConnections: func() {
|
||||
called = true
|
||||
},
|
||||
}
|
||||
txp := NewHTTP3Transport(d, &tls.Config{})
|
||||
client := &http.Client{Transport: txp}
|
||||
client.CloseIdleConnections()
|
||||
if !called {
|
||||
t.Fatal("not called")
|
||||
}
|
||||
t.Run("CloseIdleConnections", func(t *testing.T) {
|
||||
var (
|
||||
calledHTTP3 bool
|
||||
calledDialer bool
|
||||
)
|
||||
txp := &http3Transport{
|
||||
child: &mocks.HTTP3RoundTripper{
|
||||
MockClose: func() error {
|
||||
calledHTTP3 = true
|
||||
return nil
|
||||
},
|
||||
},
|
||||
dialer: &mocks.QUICDialer{
|
||||
MockCloseIdleConnections: func() {
|
||||
calledDialer = true
|
||||
},
|
||||
},
|
||||
}
|
||||
txp.CloseIdleConnections()
|
||||
if !calledHTTP3 || !calledDialer {
|
||||
t.Fatal("not called")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("RoundTrip", func(t *testing.T) {
|
||||
expected := errors.New("mocked error")
|
||||
txp := &http3Transport{
|
||||
child: &mocks.HTTP3RoundTripper{
|
||||
MockRoundTrip: func(req *http.Request) (*http.Response, error) {
|
||||
return nil, expected
|
||||
},
|
||||
},
|
||||
}
|
||||
resp, err := txp.RoundTrip(&http.Request{})
|
||||
if !errors.Is(err, expected) {
|
||||
t.Fatal("unexpected err", err)
|
||||
}
|
||||
if resp != nil {
|
||||
t.Fatal("unexpected resp")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestNewHTTP3Transport(t *testing.T) {
|
||||
t.Run("creates the correct type chain", func(t *testing.T) {
|
||||
qd := &mocks.QUICDialer{}
|
||||
config := &tls.Config{}
|
||||
txp := NewHTTP3Transport(qd, config)
|
||||
h3txp := txp.(*http3Transport)
|
||||
if h3txp.dialer != qd {
|
||||
t.Fatal("invalid dialer")
|
||||
}
|
||||
h3 := h3txp.child.(*http3.RoundTripper)
|
||||
if h3.Dial == nil {
|
||||
t.Fatal("invalid Dial")
|
||||
}
|
||||
if !h3.DisableCompression {
|
||||
t.Fatal("invalid DisableCompression")
|
||||
}
|
||||
if h3.TLSClientConfig != config {
|
||||
t.Fatal("invalid TLSClientConfig")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue