aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
Diffstat (limited to 'extras')
-rw-r--r--extras/hs-test/http_test.go97
-rw-r--r--extras/hs-test/infra/suite_no_topo.go37
-rw-r--r--extras/hs-test/topo-containers/single.yaml8
3 files changed, 90 insertions, 52 deletions
diff --git a/extras/hs-test/http_test.go b/extras/hs-test/http_test.go
index 68934550b69..b143e559244 100644
--- a/extras/hs-test/http_test.go
+++ b/extras/hs-test/http_test.go
@@ -7,7 +7,6 @@ import (
"math/rand"
"net"
"net/http"
- "net/http/httptest"
"net/http/httptrace"
"os"
"strconv"
@@ -36,10 +35,10 @@ func init() {
HttpClientErrRespTest, HttpClientPostFormTest, HttpClientGet128kbResponseTest, HttpClientGetResponseBodyTest,
HttpClientGetNoResponseBodyTest, HttpClientPostFileTest, HttpClientPostFilePtrTest, HttpUnitTest,
HttpRequestLineTest, HttpClientGetTimeout, HttpStaticFileHandlerWrkTest, HttpStaticUrlHandlerWrkTest, HttpConnTimeoutTest,
- HttpClientGetRepeat, HttpClientPostRepeat, HttpIgnoreH2UpgradeTest, HttpInvalidAuthorityFormUriTest, HttpHeaderErrorConnectionDropTest)
+ HttpClientGetRepeatTest, HttpClientPostRepeatTest, HttpIgnoreH2UpgradeTest, HttpInvalidAuthorityFormUriTest, HttpHeaderErrorConnectionDropTest)
RegisterNoTopoSoloTests(HttpStaticPromTest, HttpGetTpsTest, HttpGetTpsInterruptModeTest, PromConcurrentConnectionsTest,
PromMemLeakTest, HttpClientPostMemLeakTest, HttpInvalidClientRequestMemLeakTest, HttpPostTpsTest, HttpPostTpsInterruptModeTest,
- PromConsecutiveConnectionsTest, HttpGetTpsTlsTest, HttpPostTpsTlsTest)
+ PromConsecutiveConnectionsTest, HttpGetTpsTlsTest, HttpPostTpsTlsTest, HttpClientGetRepeatMTTest, HttpClientPtrGetRepeatMTTest)
}
const wwwRootPath = "/tmp/www_root"
@@ -382,35 +381,37 @@ func httpClientGet(s *NoTopoSuite, response string, size int) {
s.AssertContains(file_contents, response)
}
-func startSimpleServer(s *NoTopoSuite, replyCount *int, serverAddress string) (server *httptest.Server) {
- var err error
- server = httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- fmt.Fprintf(w, "Hello")
- *replyCount++
- }))
- server.Listener, err = net.Listen("tcp", serverAddress+":80")
- s.AssertNil(err, "Error while creating listener.")
-
- server.Start()
+func HttpClientGetRepeatMTTest(s *NoTopoSuite) {
+ httpClientRepeat(s, "", "sessions 2")
+}
- return server
+func HttpClientPtrGetRepeatMTTest(s *NoTopoSuite) {
+ httpClientRepeat(s, "", "use-ptr sessions 2")
}
-func HttpClientGetRepeat(s *NoTopoSuite) {
- httpClientRepeat(s, "")
+func HttpClientGetRepeatTest(s *NoTopoSuite) {
+ httpClientRepeat(s, "", "")
}
-func HttpClientPostRepeat(s *NoTopoSuite) {
- httpClientRepeat(s, "post")
+func HttpClientPostRepeatTest(s *NoTopoSuite) {
+ httpClientRepeat(s, "post", "")
}
-func httpClientRepeat(s *NoTopoSuite, requestMethod string) {
- replyCount := 0
+func httpClientRepeat(s *NoTopoSuite, requestMethod string, clientArgs string) {
vpp := s.Containers.Vpp.VppInstance
- serverAddress := s.HostAddr()
+ logPath := s.Containers.NginxServer.GetContainerWorkDir() + "/" + s.Containers.NginxServer.Name + "-access.log"
+ serverAddress := s.Interfaces.Tap.Ip4AddressString()
+ replyCountInt := 0
repeatAmount := 10000
- server := startSimpleServer(s, &replyCount, serverAddress)
- defer server.Close()
+ durationInSec := 10
+ var err error
+
+ // recreate interfaces with RX-queues
+ s.AssertNil(vpp.DeleteTap(s.Interfaces.Tap))
+ s.AssertNil(vpp.CreateTap(s.Interfaces.Tap, 2, 2))
+
+ s.CreateNginxServer()
+ s.AssertNil(s.Containers.NginxServer.Start())
if requestMethod == "post" {
fileName := "/tmp/test_file.txt"
@@ -419,41 +420,45 @@ func httpClientRepeat(s *NoTopoSuite, requestMethod string) {
requestMethod += " file /tmp/test_file.txt"
}
- uri := "http://" + serverAddress + "/80"
- cmd := fmt.Sprintf("http client %s use-ptr duration 10 header Hello:World uri %s target /index.html",
- requestMethod, uri)
+ uri := "http://" + serverAddress + "/" + s.GetPortFromPpid()
+ cmd := fmt.Sprintf("http client %s %s duration %d header Hello:World uri %s target /index.html",
+ requestMethod, clientArgs, durationInSec, uri)
- s.Log("Duration 10s")
+ s.Log("Duration %ds", durationInSec)
o := vpp.Vppctl(cmd)
- outputLen := len(o)
- if outputLen > 500 {
- s.Log(o[:500])
- s.Log("* HST Framework: output limited to 500 chars to avoid flooding the console. Output length: " + fmt.Sprint(outputLen))
- } else {
- s.Log(o)
+ s.Log(o)
+
+ replyCount := s.Containers.NginxServer.Exec(false, "awk 'END { print NR }' "+logPath)
+ if replyCount != "" {
+ replyCountInt, err = strconv.Atoi(replyCount[:len(replyCount)-1])
+ s.AssertNil(err)
}
- s.Log("Server response count: %d", replyCount)
+ // empty the log file
+ s.Containers.NginxServer.Exec(false, "truncate -s 0 "+logPath)
+
+ s.Log("Server response count: %d", replyCountInt)
s.AssertNotNil(o)
s.AssertNotContains(o, "error")
- s.AssertGreaterThan(replyCount, 15000)
+ s.AssertGreaterThan(replyCountInt, 15000)
- cmd = fmt.Sprintf("http client %s use-ptr repeat %d header Hello:World uri %s target /index.html",
- requestMethod, repeatAmount, uri)
+ replyCount = ""
+ cmd = fmt.Sprintf("http client %s %s repeat %d header Hello:World uri %s target /index.html",
+ requestMethod, clientArgs, repeatAmount, uri)
- replyCount = 0
+ s.AssertNil(err, fmt.Sprint(err))
s.Log("Repeat %d", repeatAmount)
o = vpp.Vppctl(cmd)
- outputLen = len(o)
- if outputLen > 500 {
- s.Log(o[:500])
- s.Log("* HST Framework: output limited to 500 chars to avoid flooding the console. Output length: " + fmt.Sprint(outputLen))
- } else {
- s.Log(o)
+ s.Log(o)
+
+ replyCount = s.Containers.NginxServer.Exec(false, "awk 'END { print NR }' "+logPath)
+ if replyCount != "" {
+ replyCountInt, err = strconv.Atoi(replyCount[:len(replyCount)-1])
+ s.AssertNil(err)
}
- s.Log("Server response count: %d", replyCount)
+ s.Log("Server response count: %d", replyCountInt)
s.AssertNotNil(o)
s.AssertNotContains(o, "error")
- s.AssertEqual(repeatAmount, replyCount)
+ s.AssertEqual(repeatAmount, replyCountInt)
}
func HttpClientGetTimeout(s *NoTopoSuite) {
diff --git a/extras/hs-test/infra/suite_no_topo.go b/extras/hs-test/infra/suite_no_topo.go
index 1c7b6fe91c3..d084413f7e6 100644
--- a/extras/hs-test/infra/suite_no_topo.go
+++ b/extras/hs-test/infra/suite_no_topo.go
@@ -18,13 +18,15 @@ type NoTopoSuite struct {
Tap *NetInterface
}
Containers struct {
- Vpp *Container
- Nginx *Container
- NginxHttp3 *Container
- Wrk *Container
- Curl *Container
- Ab *Container
+ Vpp *Container
+ Nginx *Container
+ NginxHttp3 *Container
+ NginxServer *Container
+ Wrk *Container
+ Curl *Container
+ Ab *Container
}
+ NginxServerPort string
}
func RegisterNoTopoTests(tests ...func(s *NoTopoSuite)) {
@@ -42,6 +44,7 @@ func (s *NoTopoSuite) SetupSuite() {
s.Containers.Vpp = s.GetContainerByName("vpp")
s.Containers.Nginx = s.GetContainerByName("nginx")
s.Containers.NginxHttp3 = s.GetContainerByName("nginx-http3")
+ s.Containers.NginxServer = s.GetTransientContainerByName("nginx-server")
s.Containers.Wrk = s.GetContainerByName("wrk")
s.Containers.Curl = s.GetContainerByName("curl")
s.Containers.Ab = s.GetContainerByName("ab")
@@ -101,6 +104,28 @@ func (s *NoTopoSuite) CreateNginxConfig(container *Container, multiThreadWorkers
)
}
+// Creates container and config.
+func (s *NoTopoSuite) CreateNginxServer() {
+ s.AssertNil(s.Containers.NginxServer.Create())
+ s.NginxServerPort = s.GetPortFromPpid()
+ nginxSettings := struct {
+ LogPrefix string
+ Address string
+ Port string
+ Timeout int
+ }{
+ LogPrefix: s.Containers.NginxServer.Name,
+ Address: s.Interfaces.Tap.Ip4AddressString(),
+ Port: s.NginxServerPort,
+ Timeout: 600,
+ }
+ s.Containers.NginxServer.CreateConfigFromTemplate(
+ "/nginx.conf",
+ "./resources/nginx/nginx_server.conf",
+ nginxSettings,
+ )
+}
+
func (s *NoTopoSuite) AddNginxVclConfig(multiThreadWorkers bool) {
vclFileName := s.Containers.Nginx.GetHostWorkDir() + "/vcl.conf"
appSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
diff --git a/extras/hs-test/topo-containers/single.yaml b/extras/hs-test/topo-containers/single.yaml
index b4449dc1918..2f5f31b6879 100644
--- a/extras/hs-test/topo-containers/single.yaml
+++ b/extras/hs-test/topo-containers/single.yaml
@@ -28,6 +28,14 @@ containers:
image: "hs-test/nginx-http3"
is-optional: true
+ - name: "nginx-server"
+ volumes:
+ - <<: *shared-vol
+ container-dir: "/tmp/nginx"
+ is-default-work-dir: true
+ image: "hs-test/nginx-server"
+ is-optional: true
+
- name: "ab"
image: "hs-test/ab"
is-optional: true