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