"errors"
"flag"
"fmt"
+ "github.com/onsi/gomega/gmeasure"
"io"
"log"
"os"
}
finished <- nil
}
+
+/*
+runBenchmark creates Gomega's experiment with the passed-in name and samples the passed-in callback repeatedly (samplesNum times),
+passing in suite context, experiment and your data.
+
+You can also instruct runBenchmark to run with multiple concurrent workers.
+You can record multiple named measurements (float64 or duration) within passed-in callback.
+runBenchmark then produces report to show statistical distribution of measurements.
+*/
+func (s *HstSuite) runBenchmark(name string, samplesNum, parallelNum int, callback func(s *HstSuite, e *gmeasure.Experiment, data interface{}), data interface{}) {
+ experiment := gmeasure.NewExperiment(name)
+
+ experiment.Sample(func(idx int) {
+ defer GinkgoRecover()
+ callback(s, experiment, data)
+ }, gmeasure.SamplingConfig{N: samplesNum, NumParallel: parallelNum})
+ AddReportEntry(experiment.Name, experiment)
+}
import (
"fmt"
+ "github.com/onsi/gomega/gmeasure"
+ "io"
"net/http"
"os"
"strings"
)
func init() {
- registerNsTests(HttpTpsTest)
registerVethTests(HttpCliTest, HttpCliConnectErrorTest)
registerNoTopoTests(NginxHttp3Test, NginxAsServerTest,
NginxPerfCpsTest, NginxPerfRpsTest, NginxPerfWrkTest, HeaderServerTest,
HttpStaticMovedTest, HttpStaticNotFoundTest, HttpCliMethodNotAllowedTest,
HttpCliBadRequestTest, HttpStaticPathTraversalTest)
- registerNoTopoSoloTests(HttpStaticPromTest)
+ registerNoTopoSoloTests(HttpStaticPromTest, HttpTpsTest)
}
const wwwRootPath = "/tmp/www_root"
-func HttpTpsTest(s *NsSuite) {
- iface := s.getInterfaceByName(clientInterface)
- client_ip := iface.ip4AddressString()
- port := "8080"
- finished := make(chan error, 1)
- clientNetns := s.getNetNamespaceByName("cln")
+func httpDownloadBenchmark(s *HstSuite, experiment *gmeasure.Experiment, data interface{}) {
+ url, isValid := data.(string)
+ s.assertEqual(true, isValid)
+ client := newHttpClient()
+ req, err := http.NewRequest("GET", url, nil)
+ s.assertNil(err, fmt.Sprint(err))
+ t := time.Now()
+ resp, err := client.Do(req)
+ s.assertNil(err, fmt.Sprint(err))
+ defer resp.Body.Close()
+ s.assertEqual(200, resp.StatusCode)
+ _, err = io.ReadAll(resp.Body)
+ duration := time.Since(t)
+ experiment.RecordValue("Download Speed", (float64(resp.ContentLength)/1024/1024)/duration.Seconds(), gmeasure.Units("MB/s"), gmeasure.Precision(2))
- container := s.getContainerByName("vpp")
+}
- // configure vpp in the container
- container.vppInstance.vppctl("http tps uri tcp://0.0.0.0/8080")
+func HttpTpsTest(s *NoTopoSuite) {
+ vpp := s.getContainerByName("vpp").vppInstance
+ serverAddress := s.getInterfaceByName(tapInterfaceName).peer.ip4AddressString()
+ url := "http://" + serverAddress + ":8080/test_file_10M"
- go func() {
- defer GinkgoRecover()
- s.startWget(finished, client_ip, port, "test_file_10M", clientNetns)
- }()
- // wait for client
- err := <-finished
- s.assertNil(err, fmt.Sprint(err))
+ vpp.vppctl("http tps uri tcp://0.0.0.0/8080")
+
+ s.runBenchmark("HTTP tps 10M", 10, 0, httpDownloadBenchmark, url)
}
func HttpCliTest(s *VethsSuite) {