hs-test: refactor test cases from ns suite
[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         iface := s.netInterfaces[clientInterface]
13         client_ip := iface.Ip4AddressString()
14         port := "8080"
15         finished := make(chan error, 1)
16
17         container := s.getContainerByName("vpp")
18
19         // configure vpp in the container
20         container.vppInstance.vppctl("http tps uri tcp://0.0.0.0/8080")
21
22         go startWget(finished, client_ip, port, "test_file_10M", "client")
23         // wait for client
24         err := <-finished
25         s.assertNil(err)
26 }
27
28 func (s *VethsSuite) TestHttpCli() {
29         serverContainer := s.getContainerByName("server-vpp")
30         clientContainer := s.getContainerByName("client-vpp")
31
32         serverVeth := s.netInterfaces[serverInterfaceName]
33
34         serverContainer.vppInstance.vppctl("http cli server")
35
36         uri := "http://" + serverVeth.Ip4AddressString() + "/80"
37
38         o := clientContainer.vppInstance.vppctl("http cli client" +
39                 " uri " + uri + " query /show/version")
40
41         s.log(o)
42         s.assertContains(o, "<html>", "<html> not found in the result!")
43 }
44
45 func waitForApp(vppInst *VppInstance, appName string, timeout int) error {
46         for i := 0; i < timeout; i++ {
47                 o := vppInst.vppctl("show app")
48                 if strings.Contains(o, appName) {
49                         return nil
50                 }
51                 time.Sleep(1 * time.Second)
52         }
53         return fmt.Errorf("Timeout while waiting for app '%s'", appName)
54 }
55
56 func (s *NoTopoSuite) TestNginx() {
57         query := "return_ok"
58         finished := make(chan error, 1)
59         vppCont := s.getContainerByName("vpp")
60         vppInst := NewVppInstance(vppCont)
61         vppInst.actionFuncName = "ConfigureTap"
62         s.assertNil(vppInst.start(), "failed to start vpp")
63
64         nginxCont := s.getContainerByName("nginx")
65         s.assertNil(nginxCont.run())
66
67         err := waitForApp(vppInst, "-app", 5)
68         s.assertNil(err)
69
70         defer func() { os.Remove(query) }()
71         go startWget(finished, "10.10.10.1", "80", query, "")
72         s.assertNil(<-finished)
73 }
74
75 func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error {
76         nRequests := 1000000
77         nClients := 2000
78         var args []string
79         var exeName string
80
81         if ab_or_wrk == "ab" {
82                 args = []string{"-n", fmt.Sprintf("%d", nRequests), "-c",
83                         fmt.Sprintf("%d", nClients)}
84                 if mode == "rps" {
85                         args = append(args, "-k")
86                 } else if mode != "cps" {
87                         return fmt.Errorf("invalid mode %s; expected cps/rps", mode)
88                 }
89                 args = append(args, "http://10.10.10.1:80/64B.json")
90                 exeName = "ab"
91         } else {
92                 args = []string{"-c", fmt.Sprintf("%d", nClients), "-t", "2", "-d", "30",
93                         "http://10.10.10.1:80"}
94                 exeName = "wrk"
95         }
96
97         vppCont := s.getContainerByName("vpp")
98         vppInst := NewVppInstance(vppCont)
99         vppInst.actionFuncName = "ConfigureTap"
100         s.assertNil(vppInst.start(), "failed to start vpp")
101
102         nginxCont := s.getContainerByName("nginx")
103         s.assertNil(nginxCont.run())
104         err := waitForApp(vppInst, "-app", 5)
105         s.assertNil(err)
106
107         cmd := exec.Command(exeName, args...)
108         fmt.Println(cmd)
109         o, _ := cmd.CombinedOutput()
110         fmt.Print(string(o))
111         return nil
112 }
113
114 func (s *NoTopoSuite) TestNginxPerfCps() {
115         s.assertNil(runNginxPerf(s, "cps", "ab"))
116 }
117
118 func (s *NoTopoSuite) TestNginxPerfRps() {
119         s.assertNil(runNginxPerf(s, "rps", "ab"))
120 }
121
122 func (s *NoTopoSuite) TestNginxPerfWrk() {
123         s.assertNil(runNginxPerf(s, "", "wrk"))
124 }