summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/hs-test/http_test.go50
1 files changed, 45 insertions, 5 deletions
diff --git a/extras/hs-test/http_test.go b/extras/hs-test/http_test.go
index 2983ba38fa0..dcfe56199ed 100644
--- a/extras/hs-test/http_test.go
+++ b/extras/hs-test/http_test.go
@@ -26,7 +26,8 @@ func init() {
HttpStaticMacTimeTest, HttpStaticBuildInUrlGetVersionVerboseTest, HttpVersionNotSupportedTest,
HttpInvalidContentLengthTest, HttpInvalidTargetSyntaxTest, HttpStaticPathTraversalTest, HttpUriDecodeTest,
HttpHeadersTest, HttpStaticFileHandler)
- RegisterNoTopoSoloTests(HttpStaticPromTest, HttpTpsTest, HttpTpsInterruptModeTest, PromConcurrentConnections)
+ RegisterNoTopoSoloTests(HttpStaticPromTest, HttpTpsTest, HttpTpsInterruptModeTest, PromConcurrentConnections,
+ PromMemLeakTest)
}
const wwwRootPath = "/tmp/www_root"
@@ -205,9 +206,7 @@ func HttpStaticPromTest(s *NoTopoSuite) {
_, err = io.ReadAll(resp.Body)
}
-func promReq(s *NoTopoSuite, url string, wg *sync.WaitGroup) {
- defer GinkgoRecover()
- defer wg.Done()
+func promReq(s *NoTopoSuite, url string) {
client := NewHttpClient()
req, err := http.NewRequest("GET", url, nil)
s.AssertNil(err, fmt.Sprint(err))
@@ -218,6 +217,12 @@ func promReq(s *NoTopoSuite, url string, wg *sync.WaitGroup) {
_, err = io.ReadAll(resp.Body)
}
+func promReqWg(s *NoTopoSuite, url string, wg *sync.WaitGroup) {
+ defer GinkgoRecover()
+ defer wg.Done()
+ promReq(s, url)
+}
+
func PromConcurrentConnections(s *NoTopoSuite) {
vpp := s.GetContainerByName("vpp").VppInstance
serverAddress := s.GetInterfaceByName(TapInterfaceName).Peer.Ip4AddressString()
@@ -230,12 +235,47 @@ func PromConcurrentConnections(s *NoTopoSuite) {
var wg sync.WaitGroup
for i := 0; i < 20; i++ {
wg.Add(1)
- go promReq(s, url, &wg)
+ go promReqWg(s, url, &wg)
}
wg.Wait()
s.Log(vpp.Vppctl("show session verbose proto http"))
}
+func PromMemLeakTest(s *NoTopoSuite) {
+ s.SkipUnlessLeakCheck()
+
+ vpp := s.GetContainerByName("vpp").VppInstance
+ serverAddress := s.GetInterfaceByName(TapInterfaceName).Peer.Ip4AddressString()
+ url := "http://" + serverAddress + ":80/stats.prom"
+
+ /* no goVPP less noise */
+ vpp.Disconnect()
+
+ s.Log(vpp.Vppctl("http static server uri tcp://" + serverAddress + "/80 url-handlers"))
+ s.Log(vpp.Vppctl("prom enable"))
+ time.Sleep(time.Second * 3)
+
+ /* warmup request (FIB) */
+ promReq(s, url)
+
+ vpp.EnableMemoryTrace()
+ traces1, err := vpp.GetMemoryTrace()
+ s.AssertNil(err, fmt.Sprint(err))
+
+ /* collect stats couple of times */
+ for i := 0; i < 5; i++ {
+ time.Sleep(time.Second * 1)
+ promReq(s, url)
+ }
+
+ /* let's give it some time to clean up sessions */
+ time.Sleep(time.Second * 5)
+
+ traces2, err := vpp.GetMemoryTrace()
+ s.AssertNil(err, fmt.Sprint(err))
+ vpp.MemLeakCheck(traces1, traces2)
+}
+
func HttpStaticFileHandler(s *NoTopoSuite) {
content := "<http><body><p>Hello</p></body></http>"
content2 := "<http><body><p>Page</p></body></http>"