Skip to content

Commit 4b84efc

Browse files
Fix e2e tests (ligato#1895)
Fixes the followig tests that were failing randomly: * TestInitFromFileAndEtcd * TestSourceNAT and TestNATStaticMappings * TestL3ACLs Signed-off-by: Matus Halaj <[email protected]> Signed-off-by: Matus Halaj <[email protected]> Co-authored-by: Ondrej Fabry <[email protected]>
1 parent 581a09b commit 4b84efc

File tree

3 files changed

+97
-39
lines changed

3 files changed

+97
-39
lines changed

tests/e2e/001_init_config_test.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -197,17 +197,19 @@ endpoints:
197197
)
198198

199199
// check whether initial configuration is correctly loaded from Etcd and file in running VPP-Agent
200-
initInterfaceConfigState := func(interfaceName string, ipAddress string) kvscheduler.ValueState {
201-
return ctx.GetValueStateByKey(
202-
fmt.Sprintf("vpp/interface/%v/address/static/%v/32", interfaceName, ipAddress))
200+
initInterfaceConfigStateClb := func(interfaceName string, ipAddress string) func() kvscheduler.ValueState {
201+
return func() kvscheduler.ValueState {
202+
return ctx.GetValueStateByKey(
203+
fmt.Sprintf("vpp/interface/%v/address/static/%v/32", interfaceName, ipAddress))
204+
}
203205
}
204-
ctx.Eventually(initInterfaceConfigState("memif-from-etcd", "10.10.1.1")).
206+
ctx.Eventually(initInterfaceConfigStateClb("memif-from-etcd", "10.10.1.1")).
205207
Should(Equal(kvscheduler.ValueState_CONFIGURED),
206208
"unique memif from etcd was not properly created")
207-
ctx.Eventually(initInterfaceConfigState("memif-from-init-file", "10.10.1.2")).
209+
ctx.Eventually(initInterfaceConfigStateClb("memif-from-init-file", "10.10.1.2")).
208210
Should(Equal(kvscheduler.ValueState_CONFIGURED),
209211
"unique memif from init file was not properly created")
210-
ctx.Eventually(initInterfaceConfigState("memif-from-both-sources", "10.10.1.3")).
212+
ctx.Eventually(initInterfaceConfigStateClb("memif-from-both-sources", "10.10.1.3")).
211213
Should(Equal(kvscheduler.ValueState_CONFIGURED),
212214
"conflicting memif (defined in init file and etcd) was either not correctly "+
213215
"merged (etcd data should have priority) or other things prevented its proper creation")

tests/e2e/connection.go

+73-25
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"bufio"
1919
"context"
2020
"fmt"
21+
"log"
2122
"net"
2223
"strings"
2324
"time"
@@ -29,7 +30,10 @@ type connectionRequest struct {
2930
err error
3031
}
3132

32-
func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqMsg, respMsg string, done chan<- error) {
33+
func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqMsg, respMsg string, done chan<- error, logger *log.Logger) {
34+
defer func() {
35+
done <- nil
36+
}()
3337
// move to the network namespace where server should listen
3438
exitNetNs := ms.enterNetNs()
3539
defer exitNetNs()
@@ -45,6 +49,10 @@ func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqM
4549
newConn := make(chan connectionRequest, 1)
4650
go func() {
4751
conn, err := listener.Accept()
52+
if err != nil {
53+
err = fmt.Errorf("accept failed with: %v", err)
54+
logger.Println(err)
55+
}
4856
newConn <- connectionRequest{conn: conn, err: err}
4957
close(newConn)
5058
}()
@@ -57,7 +65,7 @@ func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqM
5765
return
5866
case cr = <-newConn:
5967
if cr.err != nil {
60-
done <- fmt.Errorf("accept failed with: %v", cr.err)
68+
done <- cr.err
6169
return
6270
}
6371
defer cr.conn.Close()
@@ -70,20 +78,26 @@ func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqM
7078
// receive message from the client
7179
message, err := bufio.NewReader(cr.conn).ReadString('\n')
7280
if err != nil {
73-
commRv <- fmt.Errorf("failed to read data from client: %v", err)
81+
err = fmt.Errorf("failed to read data from client: %v", err)
82+
logger.Println(err)
83+
commRv <- err
7484
return
7585
}
7686
// send response to the client
7787
_, err = cr.conn.Write([]byte(respMsg + "\n"))
7888
if err != nil {
79-
commRv <- fmt.Errorf("failed to send data to client: %v", err)
89+
err = fmt.Errorf("failed to send data to client: %v", err)
90+
logger.Println(err)
91+
commRv <- err
8092
return
8193
}
8294
// check if the exchanged data are as expected
8395
message = strings.TrimRight(message, "\n")
8496
if message != expReqMsg {
85-
commRv <- fmt.Errorf("unexpected message received from client ('%s' vs. '%s')",
97+
err = fmt.Errorf("unexpected message received from client ('%s' vs. '%s')",
8698
message, expReqMsg)
99+
logger.Println(err)
100+
commRv <- err
87101
return
88102
}
89103
commRv <- nil
@@ -102,13 +116,18 @@ func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqM
102116
<-ctx.Done()
103117
}
104118

105-
func simpleUDPServer(ctx context.Context, ms *Microservice, addr string, expReqMsg, respMsg string, done chan<- error) {
119+
func simpleUDPServer(ctx context.Context, ms *Microservice, addr string, expReqMsg, respMsg string, done chan<- error, ready chan<- error, logger *log.Logger) {
120+
defer func() {
121+
done <- nil
122+
}()
123+
106124
const maxBufferSize = 1024
107125
// move to the network namespace where server should listen
108126
exitNetNs := ms.enterNetNs()
109127
defer exitNetNs()
110128

111129
conn, err := net.ListenPacket("udp", addr)
130+
ready <- err
112131
if err != nil {
113132
done <- err
114133
return
@@ -123,21 +142,27 @@ func simpleUDPServer(ctx context.Context, ms *Microservice, addr string, expReqM
123142
buffer := make([]byte, maxBufferSize)
124143
n, addr, err := conn.ReadFrom(buffer)
125144
if err != nil {
126-
commRv <- fmt.Errorf("failed to read data from client: %v", err)
145+
err = fmt.Errorf("failed to read data from client: %v", err)
146+
logger.Println(err)
147+
commRv <- err
127148
return
128149
}
129150
message := string(buffer[:n])
130151
// send response to the client
131152
_, err = conn.WriteTo([]byte(respMsg+"\n"), addr)
132153
if err != nil {
133-
commRv <- fmt.Errorf("failed to send data to client: %v", err)
154+
err = fmt.Errorf("failed to send data to client: %v", err)
155+
logger.Println(err)
156+
commRv <- err
134157
return
135158
}
136159
// check if the exchanged data are as expected
137160
message = strings.TrimRight(message, "\n")
138161
if message != expReqMsg {
139-
commRv <- fmt.Errorf("unexpected message received from client ('%s' vs. '%s')",
162+
err = fmt.Errorf("unexpected message received from client ('%s' vs. '%s')",
140163
message, expReqMsg)
164+
logger.Println(err)
165+
commRv <- err
141166
return
142167
}
143168
commRv <- nil
@@ -156,7 +181,7 @@ func simpleUDPServer(ctx context.Context, ms *Microservice, addr string, expReqM
156181
<-ctx.Done()
157182
}
158183

159-
func simpleTCPClient(ms *Microservice, addr string, reqMsg, expRespMsg string, timeout time.Duration, done chan<- error) {
184+
func simpleTCPClient(ms *Microservice, addr string, reqMsg, expRespMsg string, timeout time.Duration, done chan<- error, logger *log.Logger) {
160185
// try to connect with the server
161186
newConn := make(chan connectionRequest, 1)
162187

@@ -171,16 +196,20 @@ func simpleTCPClient(ms *Microservice, addr string, reqMsg, expRespMsg string, t
171196
time.Sleep(checkPollingInterval)
172197
continue
173198
}
199+
if err != nil {
200+
err = fmt.Errorf("dial failed with: %v", err)
201+
logger.Println(err)
202+
}
174203
newConn <- connectionRequest{conn: conn, err: err}
175204
break
176205
}
177206
close(newConn)
178207
}()
179208

180-
simpleTCPOrUDPClient(newConn, addr, reqMsg, expRespMsg, timeout, done)
209+
simpleTCPOrUDPClient(newConn, addr, reqMsg, expRespMsg, timeout, done, logger)
181210
}
182211

183-
func simpleUDPClient(ms *Microservice, addr string, reqMsg, expRespMsg string, timeout time.Duration, done chan<- error) {
212+
func simpleUDPClient(ms *Microservice, addr string, reqMsg, expRespMsg string, timeout time.Duration, done chan<- error, srvReady chan error, logger *log.Logger) {
184213
// try to connect with the server
185214
newConn := make(chan connectionRequest, 1)
186215

@@ -190,27 +219,40 @@ func simpleUDPClient(ms *Microservice, addr string, reqMsg, expRespMsg string, t
190219
defer exitNetNs()
191220
udpAddr, err := net.ResolveUDPAddr("udp", addr)
192221
if err != nil {
222+
err = fmt.Errorf("dial failed with: %v", err)
223+
logger.Println(err)
193224
newConn <- connectionRequest{conn: nil, err: err}
194225
} else {
195226
start := time.Now()
196-
for {
197-
conn, err := net.DialUDP("udp", nil, udpAddr)
198-
if err != nil && time.Since(start) < timeout {
199-
time.Sleep(checkPollingInterval)
200-
continue
227+
err = <-srvReady
228+
if err != nil {
229+
err = fmt.Errorf("dial failed with: %v", "server not ready")
230+
logger.Println(err)
231+
newConn <- connectionRequest{conn: nil, err: err}
232+
} else {
233+
for {
234+
conn, err := net.DialUDP("udp", nil, udpAddr)
235+
if err != nil && time.Since(start) < timeout {
236+
time.Sleep(checkPollingInterval)
237+
continue
238+
}
239+
if err != nil {
240+
err = fmt.Errorf("dial failed with: %v", err)
241+
logger.Println(err)
242+
}
243+
newConn <- connectionRequest{conn: conn, err: err}
244+
break
201245
}
202-
newConn <- connectionRequest{conn: conn, err: err}
203-
break
204246
}
205247
}
206248
close(newConn)
207249
}()
208250

209-
simpleTCPOrUDPClient(newConn, addr, reqMsg, expRespMsg, timeout, done)
251+
simpleTCPOrUDPClient(newConn, addr, reqMsg, expRespMsg, timeout, done, logger)
210252
}
211253

212254
func simpleTCPOrUDPClient(newConn chan connectionRequest, addr, reqMsg, expRespMsg string,
213-
timeout time.Duration, done chan<- error) {
255+
timeout time.Duration, done chan<- error, logger *log.Logger) {
214256

215257
// wait for connection
216258
var cr connectionRequest
@@ -220,7 +262,7 @@ func simpleTCPOrUDPClient(newConn chan connectionRequest, addr, reqMsg, expRespM
220262
return
221263
case cr = <-newConn:
222264
if cr.err != nil {
223-
done <- fmt.Errorf("dial failed with: %v", cr.err)
265+
done <- cr.err
224266
return
225267
}
226268
defer cr.conn.Close()
@@ -234,7 +276,9 @@ func simpleTCPOrUDPClient(newConn chan connectionRequest, addr, reqMsg, expRespM
234276
// send message to the server
235277
_, err := cr.conn.Write([]byte(reqMsg + "\n"))
236278
if err != nil {
237-
commRv <- fmt.Errorf("failed to send data to the server: %v", err)
279+
err = fmt.Errorf("failed to send data to the server: %v", err)
280+
logger.Println(err)
281+
commRv <- err
238282
return
239283
}
240284
// listen for reply
@@ -247,16 +291,20 @@ func simpleTCPOrUDPClient(newConn chan connectionRequest, addr, reqMsg, expRespM
247291
continue
248292
}
249293
if err != nil {
250-
commRv <- fmt.Errorf("failed to read data from server: %v", err)
294+
err = fmt.Errorf("failed to read data from server: %v", err)
295+
logger.Println(err)
296+
commRv <- err
251297
return
252298
}
253299
break
254300
}
255301
// check if the exchanged data are as expected
256302
message = strings.TrimRight(message, "\n")
257303
if message != expRespMsg {
258-
commRv <- fmt.Errorf("unexpected message received from server ('%s' vs. '%s')",
304+
err = fmt.Errorf("unexpected message received from server ('%s' vs. '%s')",
259305
message, expRespMsg)
306+
logger.Println(err)
307+
commRv <- err
260308
return
261309
}
262310

tests/e2e/e2e.go

+16-8
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,11 @@ func (test *TestCtx) PingFromVPPClb(destAddress string) func() error {
493493
return test.Agent.PingFromVPPAsCallback(destAddress)
494494
}
495495

496+
// TestConnection starts a simple TCP or UPD server and client, sends some data
497+
// and stops the client and server.
498+
//
499+
// If upd is true and there was no prior traffic (TPC/UDP/ICMP) between the
500+
// endpoints, ARP glean may happen and TestConnection may fail.
496501
func (test *TestCtx) TestConnection(
497502
fromMs, toMs, toAddr, listenAddr string,
498503
toPort, listenPort uint16, udp bool,
@@ -529,12 +534,14 @@ func (test *TestCtx) TestConnection(
529534

530535
srvRet := make(chan error, 1)
531536
srvCtx, cancelSrv := context.WithCancel(context.Background())
537+
udpSrvReady := make(chan error, 1)
538+
defer close(udpSrvReady)
532539
runServer := func() {
533540
defer close(srvRet)
534541
if udp {
535-
simpleUDPServer(srvCtx, serverMs, serverAddr, reqData, respData, srvRet)
542+
simpleUDPServer(srvCtx, serverMs, serverAddr, reqData, respData, srvRet, udpSrvReady, test.Logger)
536543
} else {
537-
simpleTCPServer(srvCtx, serverMs, serverAddr, reqData, respData, srvRet)
544+
simpleTCPServer(srvCtx, serverMs, serverAddr, reqData, respData, srvRet, test.Logger)
538545
}
539546
}
540547

@@ -543,10 +550,10 @@ func (test *TestCtx) TestConnection(
543550
defer close(clientRet)
544551
if udp {
545552
simpleUDPClient(clientMs, clientAddr,
546-
reqData, respData, connTimeout, clientRet)
553+
reqData, respData, connTimeout, clientRet, udpSrvReady, test.Logger)
547554
} else {
548555
simpleTCPClient(clientMs, clientAddr,
549-
reqData, respData, connTimeout, clientRet)
556+
reqData, respData, connTimeout, clientRet, test.Logger)
550557
}
551558
}
552559

@@ -572,12 +579,13 @@ func (test *TestCtx) TestConnection(
572579
cancelSrv()
573580
srvErr = <-srvRet
574581
}
575-
if err == nil {
576-
err = srvErr
577-
}
582+
// wait until server actually stops
583+
<-srvRet
578584

579585
outcome := "OK"
580-
if err != nil {
586+
if err != nil || srvErr != nil {
587+
time.Sleep(50 * time.Millisecond) // give other goroutines time to print logs
588+
err = fmt.Errorf("server: <%v>, client: <%v>", srvErr, err)
581589
outcome = err.Error()
582590
}
583591

0 commit comments

Comments
 (0)