aboutsummaryrefslogtreecommitdiffstats
path: root/extras/hs-test/nginx_test.go
diff options
context:
space:
mode:
authorMatus Fabian <matfabia@cisco.com>2024-06-24 19:05:38 +0200
committerMatus Fabian <matfabia@cisco.com>2024-06-24 19:05:38 +0200
commited9843826ab653717989709cb70de2f97331c459 (patch)
tree3161782254346dc7a9ee2fceb8869affc01e1709 /extras/hs-test/nginx_test.go
parent1fde999eec2e0f6f8997c1bf41b638f085a14b07 (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.go152
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"))
+}