@@ -90,9 +90,42 @@ func generateCertificate(cn string) (*tls.Config, error) {
90
90
return tlsConfig , nil
91
91
}
92
92
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)
93
126
func TestE2E (t * testing.T ) {
94
127
r := require .New (t )
95
- logger := zaptest .NewLogger (t )
128
+ logger := zaptest .NewLogger (t , zaptest . Level ( zap . InfoLevel ) )
96
129
97
130
server := server .New ("localtest.me" , logger )
98
131
@@ -105,15 +138,35 @@ func TestE2E(t *testing.T) {
105
138
}()
106
139
time .Sleep (time .Millisecond * 50 )
107
140
141
+ // echo backend will just send back whatever it gets
142
+ backend , err := startTCPEchoServer ()
143
+ r .NoError (err )
144
+
108
145
_ , port , _ := net .SplitHostPort (server .Addr ().String ())
109
146
controlAddr := fmt .Sprintf ("control.localtest.me:%s" , port )
110
147
client := client .New (
111
148
controlAddr ,
112
- "localhost:1234" ,
149
+ backend ,
113
150
client .WithControlTLSConfig (tlsConfig ),
114
151
)
115
152
err = client .Start ()
116
153
r .NoError (err , "client start" )
117
154
118
155
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 )
119
172
}
0 commit comments