Skip to content

Commit aa47229

Browse files
authored
test: complete basic e2e test with echo frontend/backend (#3)
1 parent a44414b commit aa47229

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed

client/client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type ClientOpt func(c *Client)
2222
// to the control server
2323
func WithControlTLSConfig(tlsConfig *tls.Config) ClientOpt {
2424
return func(c *Client) {
25-
c.controlTTLSconfig = tlsConfig
25+
c.controlTTLSconfig = tlsConfig.Clone()
2626
}
2727
}
2828

server/server.go

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func New(basename string, logger *zap.Logger) *Server {
3737

3838
func (s *Server) Start(laddr string, tlsConfig *tls.Config) error {
3939
var serverName string
40+
tlsConfig = tlsConfig.Clone()
4041
tlsConfig.GetConfigForClient = func(info *tls.ClientHelloInfo) (*tls.Config, error) {
4142
serverName = info.ServerName
4243
return nil, nil

test/e2e_test.go

+55-2
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,42 @@ func generateCertificate(cn string) (*tls.Config, error) {
9090
return tlsConfig, nil
9191
}
9292

93+
// startTCPEchoServer starts a server which echos back any content recieved
94+
func startTCPEchoServer() (string, error) {
95+
ln, err := net.Listen("tcp", ":0")
96+
if err != nil {
97+
return "", fmt.Errorf("listen: %w", err)
98+
}
99+
100+
go func() {
101+
for {
102+
conn, err := ln.Accept()
103+
if err != nil {
104+
continue
105+
}
106+
107+
go func(c net.Conn) {
108+
buf := make([]byte, 1024)
109+
for {
110+
n, err := c.Read(buf)
111+
if err != nil {
112+
c.Close()
113+
return
114+
}
115+
c.Write(buf[:n])
116+
}
117+
}(conn)
118+
}
119+
}()
120+
121+
return ln.Addr().String(), nil
122+
}
123+
124+
// TestE2E tests the default options end to end.
125+
// Reminder: frontend (browser) <-> server <-> client <-> backend (target service)
93126
func TestE2E(t *testing.T) {
94127
r := require.New(t)
95-
logger := zaptest.NewLogger(t)
128+
logger := zaptest.NewLogger(t, zaptest.Level(zap.InfoLevel))
96129

97130
server := server.New("localtest.me", logger)
98131

@@ -105,15 +138,35 @@ func TestE2E(t *testing.T) {
105138
}()
106139
time.Sleep(time.Millisecond * 50)
107140

141+
// echo backend will just send back whatever it gets
142+
backend, err := startTCPEchoServer()
143+
r.NoError(err)
144+
108145
_, port, _ := net.SplitHostPort(server.Addr().String())
109146
controlAddr := fmt.Sprintf("control.localtest.me:%s", port)
110147
client := client.New(
111148
controlAddr,
112-
"localhost:1234",
149+
backend,
113150
client.WithControlTLSConfig(tlsConfig),
114151
)
115152
err = client.Start()
116153
r.NoError(err, "client start")
117154

118155
r.Contains(client.IssuedAddr(), "localtest.me")
156+
157+
// connect a client and ensure it get the same data back
158+
frontend, err := tls.Dial("tcp", client.IssuedAddr(), tlsConfig)
159+
r.NoError(err)
160+
161+
sentData := make([]byte, 1000)
162+
_, err = rand.Read(sentData)
163+
r.NoError(err)
164+
_, err = frontend.Write(sentData)
165+
r.NoError(err)
166+
167+
receivedData := make([]byte, 2000)
168+
recievedCount, err := frontend.Read(receivedData)
169+
r.Equal(len(sentData), recievedCount)
170+
receivedData = receivedData[:recievedCount]
171+
r.Equal(sentData, receivedData)
119172
}

0 commit comments

Comments
 (0)