hs-test: add nginx perf tests
[vpp.git] / extras / hs-test / http_test.go
1 package main
2
3 import (
4         "fmt"
5         "os"
6         "os/exec"
7         "strings"
8         "time"
9 )
10
11 func (s *NsSuite) TestHttpTps() {
12         finished := make(chan error, 1)
13         server_ip := "10.0.0.2"
14         port := "8080"
15
16         container := s.getContainerByName("vpp")
17
18         s.log("starting vpp..")
19
20         // start & configure vpp in the container
21         _, err := container.execAction("ConfigureHttpTps")
22         s.assertNil(err)
23
24         go startWget(finished, server_ip, port, "test_file_10M", "client")
25         // wait for client
26         err = <-finished
27         s.assertNil(err)
28 }
29
30 func (s *VethsSuite) TestHttpCli() {
31         serverContainer := s.getContainerByName("server-vpp")
32         clientContainer := s.getContainerByName("client-vpp")
33
34         _, err := serverContainer.execAction("Configure2Veths srv")
35         s.assertNil(err)
36
37         _, err = clientContainer.execAction("Configure2Veths cln")
38         s.assertNil(err)
39
40         s.log("configured IPs...")
41
42         _, err = serverContainer.execAction("RunHttpCliSrv")
43         s.assertNil(err)
44
45         s.log("configured http server")
46
47         o, err := clientContainer.execAction("RunHttpCliCln /show/version")
48         s.assertNil(err)
49
50         s.assertContains(o, "<html>", "<html> not found in the result!")
51 }
52
53 func waitForApp(vppInst *VppInstance, appName string, timeout int) error {
54         for i := 0; i < timeout; i++ {
55                 o, err := vppInst.vppctl("show app")
56                 if err != nil {
57                         return fmt.Errorf("Error ocurred during 'show app'")
58                 }
59                 if strings.Contains(o, appName) {
60                         return nil
61                 }
62                 time.Sleep(1 * time.Second)
63         }
64         return fmt.Errorf("Timeout while waiting for app '%s'", appName)
65 }
66
67 func (s *NoTopoSuite) TestNginx() {
68         query := "return_ok"
69         finished := make(chan error, 1)
70         vppCont := s.getContainerByName("vpp")
71         vppInst := NewVppInstance(vppCont)
72         vppInst.actionFuncName = "ConfigureTap"
73         s.assertNil(vppInst.start(), "failed to start vpp")
74
75         nginxCont := s.getContainerByName("nginx")
76         s.assertNil(nginxCont.run())
77
78         err := waitForApp(vppInst, "-app", 5)
79         s.assertNil(err)
80
81         defer func() { os.Remove(query) }()
82         go startWget(finished, "10.10.10.1", "80", query, "")
83         s.assertNil(<-finished)
84 }
85
86 func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error {
87         nRequests := 1000000
88         nClients := 2000
89         var args []string
90         var exeName string
91
92         if ab_or_wrk == "ab" {
93                 args = []string{"-n", fmt.Sprintf("%d", nRequests), "-c",
94                         fmt.Sprintf("%d", nClients)}
95                 if mode == "rps" {
96                         args = append(args, "-k")
97                 } else if mode != "cps" {
98                         return fmt.Errorf("invalid mode %s; expected cps/rps", mode)
99                 }
100                 args = append(args, "http://10.10.10.1:80/64B.json")
101                 exeName = "ab"
102         } else {
103                 args = []string{"-c", fmt.Sprintf("%d", nClients), "-t", "2", "-d", "30",
104                         "http://10.10.10.1:80"}
105                 exeName = "wrk"
106         }
107
108         vppCont := s.getContainerByName("vpp")
109         vppInst := NewVppInstance(vppCont)
110         vppInst.actionFuncName = "ConfigureTap"
111         s.assertNil(vppInst.start(), "failed to start vpp")
112
113         nginxCont := s.getContainerByName("nginx")
114         s.assertNil(nginxCont.run())
115         err := waitForApp(vppInst, "-app", 5)
116         s.assertNil(err)
117
118         cmd := exec.Command(exeName, args...)
119         fmt.Println(cmd)
120         o, _ := cmd.CombinedOutput()
121         fmt.Print(string(o))
122         return nil
123 }
124
125 func (s *NoTopoSuite) TestNginxPerfCps() {
126         s.assertNil(runNginxPerf(s, "cps", "ab"))
127 }
128
129 func (s *NoTopoSuite) TestNginxPerfRps() {
130         s.assertNil(runNginxPerf(s, "rps", "ab"))
131 }
132
133 func (s *NoTopoSuite) TestNginxPerfWrk() {
134         s.assertNil(runNginxPerf(s, "", "wrk"))
135 }