-
Notifications
You must be signed in to change notification settings - Fork 45
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(netxlite): http factory that propagates close-idle-connections (#465
) While there reorganize mocks' tls implementation to use a single file called tls.go (and tls_test.go) just like netxlite does. While there write tests ensuring we always add timeouts when we are making TCP connections (be them TLS or cleartext). See ooni/probe#1591
- Loading branch information
1 parent
2572376
commit 6df27d9
Showing
8 changed files
with
235 additions
and
136 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
package mocks | ||
|
||
import ( | ||
"context" | ||
"crypto/tls" | ||
"net" | ||
) | ||
|
||
// TLSHandshaker is a mockable TLS handshaker. | ||
type TLSHandshaker struct { | ||
MockHandshake func(ctx context.Context, conn net.Conn, config *tls.Config) ( | ||
net.Conn, tls.ConnectionState, error) | ||
} | ||
|
||
// Handshake calls MockHandshake. | ||
func (th *TLSHandshaker) Handshake(ctx context.Context, conn net.Conn, config *tls.Config) ( | ||
net.Conn, tls.ConnectionState, error) { | ||
return th.MockHandshake(ctx, conn, config) | ||
} | ||
|
||
// TLSConn allows to mock netxlite.TLSConn. | ||
type TLSConn struct { | ||
// Conn is the embedded mockable Conn. | ||
Conn | ||
|
||
// MockConnectionState allows to mock the ConnectionState method. | ||
MockConnectionState func() tls.ConnectionState | ||
|
||
// MockHandshakeContext allows to mock the HandshakeContext method. | ||
MockHandshakeContext func(ctx context.Context) error | ||
} | ||
|
||
// ConnectionState calls MockConnectionState. | ||
func (c *TLSConn) ConnectionState() tls.ConnectionState { | ||
return c.MockConnectionState() | ||
} | ||
|
||
// HandshakeContext calls MockHandshakeContext. | ||
func (c *TLSConn) HandshakeContext(ctx context.Context) error { | ||
return c.MockHandshakeContext(ctx) | ||
} | ||
|
||
// TLSDialer allows to mock netxlite.TLSDialer. | ||
type TLSDialer struct { | ||
// MockCloseIdleConnections allows to mock the CloseIdleConnections method. | ||
MockCloseIdleConnections func() | ||
|
||
// MockDialTLSContext allows to mock the DialTLSContext method. | ||
MockDialTLSContext func(ctx context.Context, network, address string) (net.Conn, error) | ||
} | ||
|
||
// CloseIdleConnections calls MockCloseIdleConnections. | ||
func (d *TLSDialer) CloseIdleConnections() { | ||
d.MockCloseIdleConnections() | ||
} | ||
|
||
// DialTLSContext calls MockDialTLSContext. | ||
func (d *TLSDialer) DialTLSContext(ctx context.Context, network, address string) (net.Conn, error) { | ||
return d.MockDialTLSContext(ctx, network, address) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
package mocks | ||
|
||
import ( | ||
"context" | ||
"crypto/tls" | ||
"errors" | ||
"net" | ||
"reflect" | ||
"testing" | ||
) | ||
|
||
func TestTLSHandshakerHandshake(t *testing.T) { | ||
expected := errors.New("mocked error") | ||
conn := &Conn{} | ||
ctx := context.Background() | ||
config := &tls.Config{} | ||
th := &TLSHandshaker{ | ||
MockHandshake: func(ctx context.Context, conn net.Conn, | ||
config *tls.Config) (net.Conn, tls.ConnectionState, error) { | ||
return nil, tls.ConnectionState{}, expected | ||
}, | ||
} | ||
tlsConn, connState, err := th.Handshake(ctx, conn, config) | ||
if !errors.Is(err, expected) { | ||
t.Fatal("not the error we expected", err) | ||
} | ||
if !reflect.ValueOf(connState).IsZero() { | ||
t.Fatal("expected zero ConnectionState here") | ||
} | ||
if tlsConn != nil { | ||
t.Fatal("expected nil conn here") | ||
} | ||
} | ||
|
||
func TestTLSConnConnectionState(t *testing.T) { | ||
state := tls.ConnectionState{Version: tls.VersionTLS12} | ||
c := &TLSConn{ | ||
MockConnectionState: func() tls.ConnectionState { | ||
return state | ||
}, | ||
} | ||
out := c.ConnectionState() | ||
if !reflect.DeepEqual(out, state) { | ||
t.Fatal("not the result we expected") | ||
} | ||
} | ||
|
||
func TestTLSConnHandshakeContext(t *testing.T) { | ||
expected := errors.New("mocked error") | ||
c := &TLSConn{ | ||
MockHandshakeContext: func(ctx context.Context) error { | ||
return expected | ||
}, | ||
} | ||
err := c.HandshakeContext(context.Background()) | ||
if !errors.Is(err, expected) { | ||
t.Fatal("not the error we expected", err) | ||
} | ||
} | ||
|
||
func TestTLSDialerCloseIdleConnections(t *testing.T) { | ||
var called bool | ||
td := &TLSDialer{ | ||
MockCloseIdleConnections: func() { | ||
called = true | ||
}, | ||
} | ||
td.CloseIdleConnections() | ||
if !called { | ||
t.Fatal("not called") | ||
} | ||
} | ||
|
||
func TestTLSDialerDialTLSContext(t *testing.T) { | ||
expected := errors.New("mocked error") | ||
td := &TLSDialer{ | ||
MockDialTLSContext: func(ctx context.Context, network, address string) (net.Conn, error) { | ||
return nil, expected | ||
}, | ||
} | ||
ctx := context.Background() | ||
conn, err := td.DialTLSContext(ctx, "", "") | ||
if !errors.Is(err, expected) { | ||
t.Fatal("not the error we expected", err) | ||
} | ||
if conn != nil { | ||
t.Fatal("expected nil conn here") | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.