diff options
author | Matus Fabian <matfabia@cisco.com> | 2024-06-24 19:05:38 +0200 |
---|---|---|
committer | Matus Fabian <matfabia@cisco.com> | 2024-06-24 19:05:38 +0200 |
commit | ed9843826ab653717989709cb70de2f97331c459 (patch) | |
tree | 3161782254346dc7a9ee2fceb8869affc01e1709 /extras/hs-test/nginx_test.go | |
parent | 1fde999eec2e0f6f8997c1bf41b638f085a14b07 (diff) |
hs-test: move nginx tests into one file
Type: test
Change-Id: Ie525636c6299a8306cba45e72f8ee6c9da6d6e4f
Signed-off-by: Matus Fabian <matfabia@cisco.com>
Diffstat (limited to 'extras/hs-test/nginx_test.go')
-rw-r--r-- | extras/hs-test/nginx_test.go | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/extras/hs-test/nginx_test.go b/extras/hs-test/nginx_test.go new file mode 100644 index 00000000000..00869b0c9b4 --- /dev/null +++ b/extras/hs-test/nginx_test.go @@ -0,0 +1,152 @@ +package main + +import ( + . "fd.io/hs-test/infra" + "fmt" + "github.com/edwarnicke/exechelper" + . "github.com/onsi/ginkgo/v2" + "os" + "strings" +) + +func init() { + RegisterNginxTests(MirroringTest) + RegisterNoTopoTests(NginxHttp3Test, NginxAsServerTest, NginxPerfCpsTest, NginxPerfRpsTest, NginxPerfWrkTest, + NginxPerfCpsInterruptModeTest, NginxPerfRpsInterruptModeTest, NginxPerfWrkInterruptModeTest) +} + +// broken when CPUS > 1 +func MirroringTest(s *NginxSuite) { + s.SkipIfMultiWorker() + proxyAddress := s.GetInterfaceByName(MirroringClientInterfaceName).Peer.Ip4AddressString() + + path := "/64B.json" + + testCommand := "wrk -c 20 -t 10 -d 10 http://" + proxyAddress + ":80" + path + s.Log(testCommand) + o, _ := exechelper.Output(testCommand) + s.Log(string(o)) + s.AssertNotEmpty(o) + + vppProxyContainer := s.GetContainerByName(VppProxyContainerName) + s.AssertEqual(0, vppProxyContainer.VppInstance.GetSessionStat("no lcl port")) +} + +func NginxHttp3Test(s *NoTopoSuite) { + s.SkipUnlessExtendedTestsBuilt() + + query := "index.html" + nginxCont := s.GetContainerByName("nginx-http3") + s.AssertNil(nginxCont.Run()) + + vpp := s.GetContainerByName("vpp").VppInstance + vpp.WaitForApp("nginx-", 5) + serverAddress := s.GetInterfaceByName(TapInterfaceName).Peer.Ip4AddressString() + + defer func() { os.Remove(query) }() + curlCont := s.GetContainerByName("curl") + args := fmt.Sprintf("curl --noproxy '*' --local-port 55444 --http3-only -k https://%s:8443/%s", serverAddress, query) + curlCont.ExtraRunningArgs = args + o, err := curlCont.CombinedOutput() + s.Log(o) + s.AssertNil(err, fmt.Sprint(err)) + s.AssertContains(o, "<http>", "<http> not found in the result!") +} +func NginxAsServerTest(s *NoTopoSuite) { + query := "return_ok" + finished := make(chan error, 1) + + nginxCont := s.GetContainerByName("nginx") + s.AssertNil(nginxCont.Run()) + + vpp := s.GetContainerByName("vpp").VppInstance + vpp.WaitForApp("nginx-", 5) + + serverAddress := s.GetInterfaceByName(TapInterfaceName).Peer.Ip4AddressString() + + defer func() { os.Remove(query) }() + go func() { + defer GinkgoRecover() + s.StartWget(finished, serverAddress, "80", query, "") + }() + s.AssertNil(<-finished) +} + +func parseString(s, pattern string) string { + temp := strings.Split(s, "\n") + for _, item := range temp { + if strings.Contains(item, pattern) { + return item + } + } + return "" +} + +func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error { + nRequests := 1000000 + nClients := 1000 + + serverAddress := s.GetInterfaceByName(TapInterfaceName).Peer.Ip4AddressString() + + vpp := s.GetContainerByName("vpp").VppInstance + + nginxCont := s.GetContainerByName(SingleTopoContainerNginx) + s.AssertNil(nginxCont.Run()) + vpp.WaitForApp("nginx-", 5) + + if ab_or_wrk == "ab" { + abCont := s.GetContainerByName("ab") + args := fmt.Sprintf("-n %d -c %d", nRequests, nClients) + if mode == "rps" { + args += " -k" + } else if mode != "cps" { + return fmt.Errorf("invalid mode %s; expected cps/rps", mode) + } + // don't exit on socket receive errors + args += " -r" + args += " http://" + serverAddress + ":80/64B.json" + abCont.ExtraRunningArgs = args + o, err := abCont.CombinedOutput() + rps := parseString(o, "Requests per second:") + s.Log(rps) + s.Log(err) + s.AssertNil(err, "err: '%s', output: '%s'", err, o) + } else { + wrkCont := s.GetContainerByName("wrk") + args := fmt.Sprintf("-c %d -t 2 -d 30 http://%s:80/64B.json", nClients, + serverAddress) + wrkCont.ExtraRunningArgs = args + o, err := wrkCont.CombinedOutput() + rps := parseString(o, "requests") + s.Log(rps) + s.Log(err) + s.AssertNil(err, "err: '%s', output: '%s'", err, o) + } + return nil +} + +func NginxPerfCpsInterruptModeTest(s *NoTopoSuite) { + NginxPerfCpsTest(s) +} + +// unstable with multiple workers +func NginxPerfCpsTest(s *NoTopoSuite) { + s.SkipIfMultiWorker() + s.AssertNil(runNginxPerf(s, "cps", "ab")) +} + +func NginxPerfRpsInterruptModeTest(s *NoTopoSuite) { + NginxPerfRpsTest(s) +} + +func NginxPerfRpsTest(s *NoTopoSuite) { + s.AssertNil(runNginxPerf(s, "rps", "ab")) +} + +func NginxPerfWrkInterruptModeTest(s *NoTopoSuite) { + NginxPerfWrkTest(s) +} + +func NginxPerfWrkTest(s *NoTopoSuite) { + s.AssertNil(runNginxPerf(s, "", "wrk")) +} |