hs-test: use assert-like approach in test cases
[vpp.git] / extras / hs-test / vcl_test.go
1 package main
2
3 import (
4         "fmt"
5         "time"
6
7 )
8
9 func (s *VethsSuite) TestVclEchoQuic() {
10         s.T().Skip("quic test skipping..")
11         s.testVclEcho("quic")
12 }
13
14 func (s *VethsSuite) TestVclEchoUdp() {
15         s.T().Skip("udp echo currently broken in vpp, skipping..")
16         s.testVclEcho("udp")
17 }
18
19 func (s *VethsSuite) TestVclEchoTcp() {
20         s.testVclEcho("tcp")
21 }
22
23 func (s *VethsSuite) testVclEcho(proto string) {
24         serverVolume := "echo-srv-vol"
25         s.NewVolume(serverVolume)
26
27         clientVolume := "echo-cln-vol"
28         s.NewVolume(clientVolume)
29
30         srvInstance := "vpp-vcl-test-srv"
31         serverVppContainer, err := s.NewContainer(srvInstance)
32         s.assertNil(err)
33         serverVppContainer.addVolume(serverVolume, "/tmp/Configure2Veths")
34         s.assertNil(serverVppContainer.run())
35
36         clnInstance := "vpp-vcl-test-cln"
37         clientVppContainer, err := s.NewContainer(clnInstance)
38         s.assertNil(err)
39         clientVppContainer.addVolume(clientVolume, "/tmp/Configure2Veths")
40         s.assertNil(clientVppContainer.run())
41
42         echoSrv := "echo-srv"
43         serverEchoContainer, err := s.NewContainer(echoSrv)
44         s.assertNil(err)
45         serverEchoContainer.addVolume(serverVolume, "/tmp/" + echoSrv)
46         s.assertNil(serverEchoContainer.run())
47
48         echoCln := "echo-cln"
49         clientEchoContainer, err := s.NewContainer(echoCln)
50         s.assertNil(err)
51         clientEchoContainer.addVolume(clientVolume, "/tmp/" + echoCln)
52         s.assertNil(clientEchoContainer.run())
53
54         _, err = hstExec("Configure2Veths srv", srvInstance)
55         s.assertNil(err)
56
57         _, err = hstExec("Configure2Veths cln", clnInstance)
58         s.assertNil(err)
59
60         // run server app
61         _, err = hstExec("RunEchoServer "+proto, echoSrv)
62         s.assertNil(err)
63
64         o, err := hstExec("RunEchoClient "+proto, echoCln)
65         s.assertNil(err)
66
67         fmt.Println(o)
68 }
69
70 func (s *VethsSuite) TestVclRetryAttach() {
71         s.T().Skip()
72         s.testRetryAttach("tcp")
73 }
74
75 func (s *VethsSuite) testRetryAttach(proto string) {
76         serverVolume := "echo-srv-vol"
77         s.NewVolume(serverVolume)
78
79         clientVolume := "echo-cln-vol"
80         s.NewVolume(clientVolume)
81
82         srvInstance := "vpp-vcl-test-srv"
83         serverVppContainer, err := s.NewContainer(srvInstance)
84         s.assertNil(err)
85         serverVppContainer.addVolume(serverVolume, "/tmp/Configure2Veths")
86         s.assertNil(serverVppContainer.run())
87
88         clnInstance := "vpp-vcl-test-cln"
89         clientVppContainer, err := s.NewContainer(clnInstance)
90         s.assertNil(err)
91         clientVppContainer.addVolume(clientVolume, "/tmp/Configure2Veths")
92         s.assertNil(clientVppContainer.run())
93
94         echoSrv := "echo-srv"
95         serverEchoContainer, err := s.NewContainer(echoSrv)
96         s.assertNil(err)
97         serverEchoContainer.addVolume(serverVolume, "/tmp/" + echoSrv)
98         s.assertNil(serverEchoContainer.run())
99
100         echoCln := "echo-cln"
101         clientEchoContainer, err := s.NewContainer(echoCln)
102         s.assertNil(err)
103         clientEchoContainer.addVolume(clientVolume, "/tmp/" + echoCln)
104         s.assertNil(clientEchoContainer.run())
105
106         _, err = hstExec("Configure2Veths srv-with-preset-hw-addr", srvInstance)
107         s.assertNil(err)
108
109         _, err = hstExec("Configure2Veths cln", clnInstance)
110         s.assertNil(err)
111
112         _, err = hstExec("RunVclEchoServer "+proto, echoSrv)
113         s.assertNil(err)
114
115         fmt.Println("This whole test case can take around 3 minutes to run. Please be patient.")
116         fmt.Println("... Running first echo client test, before disconnect.")
117         _, err = hstExec("RunVclEchoClient "+proto, echoCln)
118         s.assertNil(err)
119         fmt.Println("... First test ended. Stopping VPP server now.")
120
121         // Stop server-vpp-instance, start it again and then run vcl-test-client once more
122         stopVppCommand := "/bin/bash -c 'ps -C vpp_main -o pid= | xargs kill -9'"
123         _, err = dockerExec(stopVppCommand, srvInstance)
124         s.assertNil(err)
125         time.Sleep(5 * time.Second) // Give parent process time to reap the killed child process
126         stopVppCommand = "/bin/bash -c 'ps -C hs-test -o pid= | xargs kill -9'"
127         _, err = dockerExec(stopVppCommand, srvInstance)
128         s.assertNil(err)
129         _, err = hstExec("Configure2Veths srv-with-preset-hw-addr", srvInstance)
130         s.assertNil(err)
131
132         fmt.Println("... VPP server is starting again, so waiting for a bit.")
133         time.Sleep(30 * time.Second) // Wait a moment for the re-attachment to happen
134
135         fmt.Println("... Running second echo client test, after disconnect and re-attachment.")
136         _, err = hstExec("RunVclEchoClient "+proto, echoCln)
137         s.assertNil(err)
138         fmt.Println("Done.")
139 }
140
141 func (s *VethsSuite) TestTcpWithLoss() {
142         serverContainer, err := s.NewContainer("server")
143         s.assertNil(err, "creating container failed")
144         err = serverContainer.run()
145         s.assertNil(err)
146
147         serverVpp := NewVppInstance(serverContainer)
148         s.assertNotNil(serverVpp)
149         serverVpp.setCliSocket("/var/run/vpp/cli.sock")
150         serverVpp.set2VethsServer()
151         err = serverVpp.start()
152         s.assertNil(err, "starting VPP failed")
153
154         _, err = serverVpp.vppctl("test echo server uri tcp://10.10.10.1/20022")
155         s.assertNil(err, "starting echo server failed")
156
157         clientContainer, err := s.NewContainer("client")
158         s.assertNil(err, "creating container failed")
159         err = clientContainer.run()
160         s.assertNil(err, "starting container failed")
161
162         clientVpp := NewVppInstance(clientContainer)
163         s.assertNotNil(clientVpp)
164         clientVpp.setCliSocket("/var/run/vpp/cli.sock")
165         clientVpp.set2VethsClient()
166         err = clientVpp.start()
167         s.assertNil(err, "starting VPP failed")
168
169         // Ensure that VPP doesn't abort itself with NSIM enabled
170         // Warning: Removing this ping will make the test fail!
171         _, err = serverVpp.vppctl("ping 10.10.10.2")
172         s.assertNil(err, "ping failed")
173
174         // Add loss of packets with Network Delay Simulator
175         _, err = clientVpp.vppctl("set nsim poll-main-thread delay 0.01 ms bandwidth 40 gbit packet-size 1400 packets-per-drop 1000")
176         s.assertNil(err, "configuring NSIM failed")
177         _, err = clientVpp.vppctl("nsim output-feature enable-disable host-vppcln")
178         s.assertNil(err, "enabling NSIM failed")
179
180         // Do echo test from client-vpp container
181         output, err := clientVpp.vppctl("test echo client uri tcp://10.10.10.1/20022 mbytes 50")
182         s.assertNil(err)
183         s.assertEqual(true, len(output) != 0)
184         s.assertNotContains(output, "failed: timeout")
185         fmt.Println(output)
186 }