96ca7f64823f022e27c04d9844eca82afb2a5533
[vpp.git] / extras / hs-test / vcl_test.go
1 package main
2
3 import (
4         "fmt"
5         "time"
6
7         "github.com/edwarnicke/exechelper"
8 )
9
10 func (s *Veths2Suite) TestVclEchoQuic() {
11         s.T().Skip("quic test skipping..")
12         s.testVclEcho("quic")
13 }
14
15 func (s *Veths2Suite) TestVclEchoUdp() {
16         s.T().Skip("udp echo currently broken in vpp, skipping..")
17         s.testVclEcho("udp")
18 }
19
20 func (s *Veths2Suite) TestVclEchoTcp() {
21         s.testVclEcho("tcp")
22 }
23
24 func (s *Veths2Suite) testVclEcho(proto string) {
25         t := s.T()
26
27         exechelper.Run("docker volume create --name=echo-srv-vol")
28         exechelper.Run("docker volume create --name=echo-cln-vol")
29
30         srvInstance := "vpp-echo-srv"
31         clnInstance := "vpp-echo-cln"
32         echoSrv := "echo-srv"
33         echoCln := "echo-cln"
34
35         err := dockerRun(srvInstance, "-v echo-srv-vol:/tmp/2veths")
36         if err != nil {
37                 t.Errorf("%v", err)
38                 return
39         }
40         defer func() { exechelper.Run("docker stop " + srvInstance) }()
41
42         err = dockerRun(clnInstance, "-v echo-cln-vol:/tmp/2veths")
43         if err != nil {
44                 t.Errorf("%v", err)
45                 return
46         }
47         defer func() { exechelper.Run("docker stop " + clnInstance) }()
48
49         err = dockerRun(echoSrv, fmt.Sprintf("-v echo-srv-vol:/tmp/%s", echoSrv))
50         if err != nil {
51                 t.Errorf("%v", err)
52                 return
53         }
54         defer func() { exechelper.Run("docker stop " + echoSrv) }()
55
56         err = dockerRun(echoCln, fmt.Sprintf("-v echo-cln-vol:/tmp/%s", echoCln))
57         if err != nil {
58                 t.Errorf("%v", err)
59                 return
60         }
61         defer func() { exechelper.Run("docker stop " + echoCln) }()
62
63         _, err = hstExec("2veths srv", srvInstance)
64         if err != nil {
65                 t.Errorf("%v", err)
66                 return
67         }
68
69         _, err = hstExec("2veths cln", clnInstance)
70         if err != nil {
71                 t.Errorf("%v", err)
72                 return
73         }
74
75         // run server app
76         _, err = hstExec("echo-server "+proto, echoSrv)
77         if err != nil {
78                 t.Errorf("echo server: %v", err)
79                 return
80         }
81
82         o, err := hstExec("echo-client "+proto, echoCln)
83         if err != nil {
84                 t.Errorf("echo client: %v", err)
85         }
86         fmt.Println(o)
87 }
88
89 func (s *Veths2Suite) TestVclRetryAttach() {
90         s.testRetryAttach("tcp")
91 }
92
93 func (s *Veths2Suite) testRetryAttach(proto string) {
94         t := s.T()
95
96         exechelper.Run("docker volume create --name=echo-srv-vol")
97         exechelper.Run("docker volume create --name=echo-cln-vol")
98
99         srvInstance := "vpp-vcl-test-srv"
100         clnInstance := "vpp-vcl-test-cln"
101         echoSrv := "echo-srv"
102         echoCln := "echo-cln"
103
104         err := dockerRun(srvInstance, "-v echo-srv-vol:/tmp/2veths")
105         if err != nil {
106                 t.Errorf("%v", err)
107                 return
108         }
109         defer func() { exechelper.Run("docker stop " + srvInstance) }()
110
111         err = dockerRun(clnInstance, "-v echo-cln-vol:/tmp/2veths")
112         if err != nil {
113                 t.Errorf("%v", err)
114                 return
115         }
116         defer func() { exechelper.Run("docker stop " + clnInstance) }()
117
118         err = dockerRun(echoSrv, fmt.Sprintf("-v echo-srv-vol:/tmp/%s", echoSrv))
119         if err != nil {
120                 t.Errorf("%v", err)
121                 return
122         }
123         defer func() { exechelper.Run("docker stop " + echoSrv) }()
124
125         err = dockerRun(echoCln, fmt.Sprintf("-v echo-cln-vol:/tmp/%s", echoCln))
126         if err != nil {
127                 t.Errorf("%v", err)
128                 return
129         }
130         defer func() { exechelper.Run("docker stop " + echoCln) }()
131
132         _, err = hstExec("2veths srv-with-preset-hw-addr", srvInstance)
133         if err != nil {
134                 t.Errorf("%v", err)
135                 return
136         }
137
138         _, err = hstExec("2veths cln", clnInstance)
139         if err != nil {
140                 t.Errorf("%v", err)
141                 return
142         }
143
144         _, err = hstExec("vcl-test-server "+proto, echoSrv)
145         if err != nil {
146                 t.Errorf("vcl test server: %v", err)
147                 return
148         }
149
150         fmt.Println("This whole test case can take around 3 minutes to run. Please be patient.")
151         fmt.Println("... Running first echo client test, before disconnect.")
152         _, err = hstExec("vcl-test-client "+proto, echoCln)
153         if err != nil {
154                 t.Errorf("vcl test client: %v", err)
155                 return
156         }
157         fmt.Println("... First test ended. Stopping VPP server now.")
158
159         // Stop server-vpp-instance, start it again and then run vcl-test-client once more
160         stopVppCommand := "/bin/bash -c 'ps -C vpp_main -o pid= | xargs kill -9'"
161         _, err = dockerExec(stopVppCommand, srvInstance)
162         if err != nil {
163                 t.Errorf("error while stopping vpp: %v", err)
164                 return
165         }
166         time.Sleep(5 * time.Second) // Give parent process time to reap the killed child process
167         stopVppCommand = "/bin/bash -c 'ps -C hs-test -o pid= | xargs kill -9'"
168         _, err = dockerExec(stopVppCommand, srvInstance)
169         if err != nil {
170                 t.Errorf("error while stopping hs-test: %v", err)
171                 return
172         }
173         _, err = hstExec("2veths srv-with-preset-hw-addr", srvInstance)
174         if err != nil {
175                 t.Errorf("%v", err)
176                 return
177         }
178
179         fmt.Println("... VPP server is starting again, so waiting for a bit.")
180         time.Sleep(30 * time.Second) // Wait a moment for the re-attachment to happen
181
182         fmt.Println("... Running second echo client test, after disconnect and re-attachment.")
183         _, err = hstExec("vcl-test-client "+proto, echoCln)
184         if err != nil {
185                 t.Errorf("vcl test client: %v", err)
186         }
187         fmt.Println("Done.")
188 }