From ed9843826ab653717989709cb70de2f97331c459 Mon Sep 17 00:00:00 2001 From: Matus Fabian Date: Mon, 24 Jun 2024 19:05:38 +0200 Subject: hs-test: move nginx tests into one file Type: test Change-Id: Ie525636c6299a8306cba45e72f8ee6c9da6d6e4f Signed-off-by: Matus Fabian --- extras/hs-test/http_test.go | 126 +------------------------------- extras/hs-test/mirroring_test.go | 27 ------- extras/hs-test/nginx_test.go | 152 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 152 deletions(-) delete mode 100644 extras/hs-test/mirroring_test.go create mode 100644 extras/hs-test/nginx_test.go diff --git a/extras/hs-test/http_test.go b/extras/hs-test/http_test.go index 68e2e656b35..a5694bfb54b 100644 --- a/extras/hs-test/http_test.go +++ b/extras/hs-test/http_test.go @@ -6,8 +6,6 @@ import ( "github.com/onsi/gomega/gmeasure" "io" "net/http" - "os" - "strings" "time" . "fd.io/hs-test/infra" @@ -16,9 +14,7 @@ import ( func init() { RegisterVethTests(HttpCliTest, HttpCliConnectErrorTest) - RegisterNoTopoTests(NginxHttp3Test, NginxAsServerTest, - NginxPerfCpsTest, NginxPerfRpsTest, NginxPerfWrkTest, NginxPerfCpsInterruptModeTest, - NginxPerfRpsInterruptModeTest, NginxPerfWrkInterruptModeTest, HeaderServerTest, + RegisterNoTopoTests(HeaderServerTest, HttpStaticMovedTest, HttpStaticNotFoundTest, HttpCliMethodNotAllowedTest, HttpCliBadRequestTest, HttpStaticBuildInUrlGetIfStatsTest, HttpStaticBuildInUrlPostIfStatsTest, HttpInvalidRequestLineTest, HttpMethodNotImplementedTest, HttpInvalidHeadersTest, @@ -92,27 +88,6 @@ func HttpCliConnectErrorTest(s *VethsSuite) { s.AssertContains(o, "failed to connect") } -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, "", " not found in the result!") -} - func HttpStaticPromTest(s *NoTopoSuite) { finished := make(chan error, 1) query := "stats.prom" @@ -566,102 +541,3 @@ func HeaderServerTest(s *NoTopoSuite) { defer resp.Body.Close() s.AssertEqual("http_cli_server", resp.Header.Get("Server")) } - -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")) -} diff --git a/extras/hs-test/mirroring_test.go b/extras/hs-test/mirroring_test.go deleted file mode 100644 index 57099b73d98..00000000000 --- a/extras/hs-test/mirroring_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -import ( - . "fd.io/hs-test/infra" - "github.com/edwarnicke/exechelper" -) - -func init() { - RegisterNginxTests(MirroringTest) -} - -// 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")) -} 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, "", " 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")) +} -- cgit 1.2.3-korg