From 1a9dc75fe8099fdde9b1dd248a8fca35b001f9fc Mon Sep 17 00:00:00 2001 From: Filip Tehlar Date: Tue, 22 Nov 2022 12:49:22 +0100 Subject: hs-test: auto register test actions Type: improvement Signed-off-by: Filip Tehlar Change-Id: Icb5db6f69eda93181aba69b1f8676a73c0a4561b --- extras/hs-test/actions.go | 49 ++++++++++++++++------------------------ extras/hs-test/echo_test.go | 8 +++---- extras/hs-test/framework_test.go | 1 - extras/hs-test/http_test.go | 10 ++++---- extras/hs-test/ldp_test.go | 8 +++---- extras/hs-test/main.go | 28 ++++++++++------------- extras/hs-test/proxy_test.go | 8 +++---- extras/hs-test/vcl_test.go | 28 +++++++++++------------ 8 files changed, 62 insertions(+), 78 deletions(-) diff --git a/extras/hs-test/actions.go b/extras/hs-test/actions.go index 1f35ee7df15..9885f87b87d 100755 --- a/extras/hs-test/actions.go +++ b/extras/hs-test/actions.go @@ -19,20 +19,9 @@ import ( "github.com/edwarnicke/vpphelper" ) -func RegisterActions() { - cfgTable = make(map[string]func([]string) *ActionResult) - reg("echo-srv-internal", Configure2Veths) - reg("echo-cln-internal", Configure2Veths) - reg("echo-client", RunEchoClient) - reg("echo-server", RunEchoServer) - reg("vpp-proxy", ConfigureVppProxy) - reg("vpp-envoy", ConfigureEnvoyProxy) - reg("http-tps", ConfigureHttpTps) - reg("2veths", Configure2Veths) - reg("vcl-test-server", RunVclEchoServer) - reg("vcl-test-client", RunVclEchoClient) - reg("http-cli-srv", RunHttpCliSrv) - reg("http-cli-cln", RunHttpCliCln) +type ConfFn func(context.Context, api.Connection) error + +type Actions struct { } func configureProxyTcp(ifName0, ipAddr0, ifName1, ipAddr1 string) ConfFn { @@ -53,18 +42,18 @@ func configureProxyTcp(ifName0, ipAddr0, ifName1, ipAddr1 string) ConfFn { } } -func RunHttpCliSrv(args []string) *ActionResult { +func (a *Actions) RunHttpCliSrv(args []string) *ActionResult { cmd := fmt.Sprintf("http cli server") - return ApiCliInband("/tmp/2veths", cmd) + return ApiCliInband("/tmp/Configure2Veths", cmd) } -func RunHttpCliCln(args []string) *ActionResult { +func (a *Actions) RunHttpCliCln(args []string) *ActionResult { cmd := fmt.Sprintf("http cli client uri http://10.10.10.1/80 query %s", getArgs()) fmt.Println(cmd) - return ApiCliInband("/tmp/2veths", cmd) + return ApiCliInband("/tmp/Configure2Veths", cmd) } -func ConfigureVppProxy(args []string) *ActionResult { +func (a *Actions) ConfigureVppProxy(args []string) *ActionResult { ctx, cancel := newVppContext() defer cancel() @@ -81,7 +70,7 @@ func ConfigureVppProxy(args []string) *ActionResult { return nil } -func ConfigureEnvoyProxy(args []string) *ActionResult { +func (a *Actions) ConfigureEnvoyProxy(args []string) *ActionResult { var startup Stanza startup. NewStanza("session"). @@ -127,7 +116,7 @@ func ApiCliInband(root, cmd string) *ActionResult { return NewActionResult(err, ActionResultWithStdout(cliInbandReply.Reply)) } -func RunEchoClient(args []string) *ActionResult { +func (a *Actions) RunEchoClient(args []string) *ActionResult { outBuff := bytes.NewBuffer([]byte{}) errBuff := bytes.NewBuffer([]byte{}) @@ -140,7 +129,7 @@ func RunEchoClient(args []string) *ActionResult { ActionResultWithStderr(string(errBuff.String()))) } -func RunEchoServer(args []string) *ActionResult { +func (a *Actions) RunEchoServer(args []string) *ActionResult { cmd := fmt.Sprintf("vpp_echo server TX=RX socket-name /tmp/echo-srv/var/run/app_ns_sockets/1 use-app-socket-api uri %s://10.10.10.1/12344", args[2]) errCh := exechelper.Start(cmd) select { @@ -152,17 +141,17 @@ func RunEchoServer(args []string) *ActionResult { return nil } -func RunEchoSrvInternal() *ActionResult { +func (a *Actions) RunEchoSrvInternal(args []string) *ActionResult { cmd := fmt.Sprintf("test echo server %s uri tcp://10.10.10.1/1234", getArgs()) - return ApiCliInband("/tmp/2veths", cmd) + return ApiCliInband("/tmp/Configure2Veths", cmd) } -func RunEchoClnInternal() *ActionResult { +func (a *Actions) RunEchoClnInternal(args []string) *ActionResult { cmd := fmt.Sprintf("test echo client %s uri tcp://10.10.10.1/1234", getArgs()) - return ApiCliInband("/tmp/2veths", cmd) + return ApiCliInband("/tmp/Configure2Veths", cmd) } -func RunVclEchoServer(args []string) *ActionResult { +func (a *Actions) RunVclEchoServer(args []string) *ActionResult { f, err := os.Create("vcl_1.conf") if err != nil { return NewActionResult(err, ActionResultWithStderr(("create vcl config: "))) @@ -182,7 +171,7 @@ func RunVclEchoServer(args []string) *ActionResult { return nil } -func RunVclEchoClient(args []string) *ActionResult { +func (a *Actions) RunVclEchoClient(args []string) *ActionResult { outBuff := bytes.NewBuffer([]byte{}) errBuff := bytes.NewBuffer([]byte{}) @@ -238,7 +227,7 @@ func configure2vethsTopo(ifName, interfaceAddress, namespaceId string, secret ui } } -func Configure2Veths(args []string) *ActionResult { +func (a *Actions) Configure2Veths(args []string) *ActionResult { var startup Stanza startup. NewStanza("session"). @@ -317,7 +306,7 @@ func configureAfPacket(ctx context.Context, vppCon api.Connection, return afPacketCreateRsp.SwIfIndex, nil } -func ConfigureHttpTps(args []string) *ActionResult { +func (a *Actions) ConfigureHttpTps(args []string) *ActionResult { ctx, cancel := newVppContext() defer cancel() con, vppErrCh := vpphelper.StartAndDialContext(ctx, diff --git a/extras/hs-test/echo_test.go b/extras/hs-test/echo_test.go index 55f75007590..74ff4cb0d6e 100755 --- a/extras/hs-test/echo_test.go +++ b/extras/hs-test/echo_test.go @@ -24,25 +24,25 @@ func (s *Veths2Suite) TestEchoBuiltin() { } defer func() { exechelper.Run("docker stop " + clnInstance) }() - _, err = hstExec("2veths srv", srvInstance) + _, err = hstExec("Configure2Veths srv", srvInstance) if err != nil { t.Errorf("%v", err) return } - _, err = hstExec("2veths cln", clnInstance) + _, err = hstExec("Configure2Veths cln", clnInstance) if err != nil { t.Errorf("%v", err) return } - _, err = hstExec("echo-srv-internal private-segment-size 1g fifo-size 4 no-echo", srvInstance) + _, err = hstExec("RunEchoSrvInternal private-segment-size 1g fifo-size 4 no-echo", srvInstance) if err != nil { t.Errorf("%v", err) return } - o, err := hstExec("echo-cln-internal nclients 10000 bytes 1 syn-timeout 100 test-timeout 100 no-return private-segment-size 1g fifo-size 4", clnInstance) + o, err := hstExec("RunEchoClnInternal nclients 10000 bytes 1 syn-timeout 100 test-timeout 100 no-return private-segment-size 1g fifo-size 4", clnInstance) if err != nil { t.Errorf("%v", err) return diff --git a/extras/hs-test/framework_test.go b/extras/hs-test/framework_test.go index 78a289265be..38003925f2f 100755 --- a/extras/hs-test/framework_test.go +++ b/extras/hs-test/framework_test.go @@ -78,5 +78,4 @@ func TestNs(t *testing.T) { func TestVeths2(t *testing.T) { var m Veths2Suite suite.Run(t, &m) - } diff --git a/extras/hs-test/http_test.go b/extras/hs-test/http_test.go index fbbd64aa31e..bd93736376d 100755 --- a/extras/hs-test/http_test.go +++ b/extras/hs-test/http_test.go @@ -23,7 +23,7 @@ func (s *NsSuite) TestHttpTps() { defer func() { exechelper.Run("docker stop " + dockerInstance) }() // start & configure vpp in the container - _, err = hstExec(dockerInstance, dockerInstance) + _, err = hstExec("ConfigureHttpTps", dockerInstance) if err != nil { t.Errorf("%v", err) return @@ -56,13 +56,13 @@ func (s *Veths2Suite) TestHttpCli() { } defer func() { exechelper.Run("docker stop " + clnInstance) }() - _, err = hstExec("2veths srv", srvInstance) + _, err = hstExec("Configure2Veths srv", srvInstance) if err != nil { t.Errorf("%v", err) return } - _, err = hstExec("2veths cln", clnInstance) + _, err = hstExec("Configure2Veths cln", clnInstance) if err != nil { t.Errorf("%v", err) return @@ -70,7 +70,7 @@ func (s *Veths2Suite) TestHttpCli() { t.Log("configured IPs...") - _, err = hstExec("http-cli-srv", srvInstance) + _, err = hstExec("RunHttpCliSrv", srvInstance) if err != nil { t.Errorf("%v", err) return @@ -78,7 +78,7 @@ func (s *Veths2Suite) TestHttpCli() { t.Log("configured http server") - o, err := hstExec("http-cli-cln /show/version", clnInstance) + o, err := hstExec("RunHttpCliCln /show/version", clnInstance) if err != nil { t.Errorf("%v", err) return diff --git a/extras/hs-test/ldp_test.go b/extras/hs-test/ldp_test.go index 0783b189522..13c102e0633 100755 --- a/extras/hs-test/ldp_test.go +++ b/extras/hs-test/ldp_test.go @@ -47,13 +47,13 @@ func (s *Veths2Suite) TestLDPreloadIperfVpp() { } defer func() { exechelper.Run("docker stop " + clnInstance) }() - _, err = hstExec("2veths srv", srvInstance) + _, err = hstExec("Configure2Veths srv", srvInstance) if err != nil { t.Errorf("%v", err) return } - _, err = hstExec("2veths cln", clnInstance) + _, err = hstExec("Configure2Veths cln", clnInstance) if err != nil { t.Errorf("%v", err) return @@ -66,7 +66,7 @@ func (s *Veths2Suite) TestLDPreloadIperfVpp() { Append("app-scope-local"). Append("app-scope-global"). Append("use-mq-eventfd"). - Append(fmt.Sprintf("app-socket-api /tmp/%s/2veths/var/run/app_ns_sockets/2", clnInstance)).Close(). + Append(fmt.Sprintf("app-socket-api /tmp/%s/Configure2Veths/var/run/app_ns_sockets/2", clnInstance)).Close(). SaveToFile(clnVcl) if err != nil { t.Errorf("%v", err) @@ -80,7 +80,7 @@ func (s *Veths2Suite) TestLDPreloadIperfVpp() { Append("app-scope-local"). Append("app-scope-global"). Append("use-mq-eventfd"). - Append(fmt.Sprintf("app-socket-api /tmp/%s/2veths/var/run/app_ns_sockets/1", srvInstance)).Close(). + Append(fmt.Sprintf("app-socket-api /tmp/%s/Configure2Veths/var/run/app_ns_sockets/1", srvInstance)).Close(). SaveToFile(srvVcl) if err != nil { t.Errorf("%v", err) diff --git a/extras/hs-test/main.go b/extras/hs-test/main.go index f54b6c4d910..9de0d314cb2 100755 --- a/extras/hs-test/main.go +++ b/extras/hs-test/main.go @@ -7,15 +7,10 @@ import ( "os" "os/exec" "os/signal" - - "git.fd.io/govpp.git/api" + "reflect" ) -type CfgTable map[string]func([]string) *ActionResult - -var cfgTable CfgTable - -type ConfFn func(context.Context, api.Connection) error +var actions Actions func newVppContext() (context.Context, context.CancelFunc) { ctx, cancel := signal.NotifyContext( @@ -116,15 +111,18 @@ func OkResult() *ActionResult { return NewActionResult(nil) } -func reg(key string, fn func([]string) *ActionResult) { - cfgTable[key] = fn -} - func processArgs() *ActionResult { - fn := cfgTable[os.Args[1]] - if fn == nil { - return NewActionResult(fmt.Errorf("internal: no config found for %s", os.Args[1])) + nArgs := len(os.Args) - 1 // skip program name + if nArgs < 1 { + return NewActionResult(fmt.Errorf("internal: no action specified!")) + } + action := os.Args[1] + methodValue := reflect.ValueOf(&actions).MethodByName(action) + if !methodValue.IsValid() { + return NewActionResult(fmt.Errorf("internal unknown action %s!", action)) } + methodIface := methodValue.Interface() + fn := methodIface.(func([]string) *ActionResult) return fn(os.Args) } @@ -144,8 +142,6 @@ func main() { os.Exit(0) } - RegisterActions() - var err error res := processArgs() err = writeSyncFile(res) diff --git a/extras/hs-test/proxy_test.go b/extras/hs-test/proxy_test.go index 797de5255fa..d426b61a33f 100755 --- a/extras/hs-test/proxy_test.go +++ b/extras/hs-test/proxy_test.go @@ -9,7 +9,7 @@ import ( "github.com/edwarnicke/exechelper" ) -func testProxyHttpTcp(t *testing.T, dockerInstance string, proxySetup func() error) error { +func testProxyHttpTcp(t *testing.T, dockerInstance, action string, proxySetup func() error) error { const outputFile = "test.data" const srcFile = "10M" stopServer := make(chan struct{}, 1) @@ -23,7 +23,7 @@ func testProxyHttpTcp(t *testing.T, dockerInstance string, proxySetup func() err defer func() { exechelper.Run("docker stop " + dockerInstance) }() // start & configure vpp in the container - _, err = hstExec(dockerInstance, dockerInstance) + _, err = hstExec(action, dockerInstance) if err != nil { return fmt.Errorf("error starting vpp in container: %v", err) } @@ -72,7 +72,7 @@ func testProxyHttpTcp(t *testing.T, dockerInstance string, proxySetup func() err func (s *NsSuite) TestVppProxyHttpTcp() { t := s.T() dockerInstance := "vpp-proxy" - err := testProxyHttpTcp(t, dockerInstance, configureVppProxy) + err := testProxyHttpTcp(t, dockerInstance, "ConfigureVppProxy", configureVppProxy) if err != nil { t.Errorf("%v", err) } @@ -88,7 +88,7 @@ func (s *NsSuite) TestEnvoyProxyHttpTcp() { ctx, cancel := context.WithCancel(context.Background()) dockerInstance := "vpp-envoy" - err := testProxyHttpTcp(t, dockerInstance, func() error { + err := testProxyHttpTcp(t, dockerInstance, "ConfigureEnvoyProxy", func() error { return setupEnvoy(t, ctx, dockerInstance) }) if err != nil { diff --git a/extras/hs-test/vcl_test.go b/extras/hs-test/vcl_test.go index fddd70d49d8..f699a65295c 100755 --- a/extras/hs-test/vcl_test.go +++ b/extras/hs-test/vcl_test.go @@ -32,14 +32,14 @@ func (s *Veths2Suite) testVclEcho(proto string) { echoSrv := "echo-srv" echoCln := "echo-cln" - err := dockerRun(srvInstance, "-v echo-srv-vol:/tmp/2veths") + err := dockerRun(srvInstance, "-v echo-srv-vol:/tmp/Configure2Veths") if err != nil { t.Errorf("%v", err) return } defer func() { exechelper.Run("docker stop " + srvInstance) }() - err = dockerRun(clnInstance, "-v echo-cln-vol:/tmp/2veths") + err = dockerRun(clnInstance, "-v echo-cln-vol:/tmp/Configure2Veths") if err != nil { t.Errorf("%v", err) return @@ -60,26 +60,26 @@ func (s *Veths2Suite) testVclEcho(proto string) { } defer func() { exechelper.Run("docker stop " + echoCln) }() - _, err = hstExec("2veths srv", srvInstance) + _, err = hstExec("Configure2Veths srv", srvInstance) if err != nil { t.Errorf("%v", err) return } - _, err = hstExec("2veths cln", clnInstance) + _, err = hstExec("Configure2Veths cln", clnInstance) if err != nil { t.Errorf("%v", err) return } // run server app - _, err = hstExec("echo-server "+proto, echoSrv) + _, err = hstExec("RunEchoServer "+proto, echoSrv) if err != nil { t.Errorf("echo server: %v", err) return } - o, err := hstExec("echo-client "+proto, echoCln) + o, err := hstExec("RunEchoClient "+proto, echoCln) if err != nil { t.Errorf("echo client: %v", err) } @@ -102,14 +102,14 @@ func (s *Veths2Suite) testRetryAttach(proto string) { echoSrv := "echo-srv" echoCln := "echo-cln" - err := dockerRun(srvInstance, "-v echo-srv-vol:/tmp/2veths") + err := dockerRun(srvInstance, "-v echo-srv-vol:/tmp/Configure2Veths") if err != nil { t.Errorf("%v", err) return } defer func() { exechelper.Run("docker stop " + srvInstance) }() - err = dockerRun(clnInstance, "-v echo-cln-vol:/tmp/2veths") + err = dockerRun(clnInstance, "-v echo-cln-vol:/tmp/Configure2Veths") if err != nil { t.Errorf("%v", err) return @@ -130,19 +130,19 @@ func (s *Veths2Suite) testRetryAttach(proto string) { } defer func() { exechelper.Run("docker stop " + echoCln) }() - _, err = hstExec("2veths srv-with-preset-hw-addr", srvInstance) + _, err = hstExec("Configure2Veths srv-with-preset-hw-addr", srvInstance) if err != nil { t.Errorf("%v", err) return } - _, err = hstExec("2veths cln", clnInstance) + _, err = hstExec("Configure2Veths cln", clnInstance) if err != nil { t.Errorf("%v", err) return } - _, err = hstExec("vcl-test-server "+proto, echoSrv) + _, err = hstExec("RunVclEchoServer "+proto, echoSrv) if err != nil { t.Errorf("vcl test server: %v", err) return @@ -150,7 +150,7 @@ func (s *Veths2Suite) testRetryAttach(proto string) { fmt.Println("This whole test case can take around 3 minutes to run. Please be patient.") fmt.Println("... Running first echo client test, before disconnect.") - _, err = hstExec("vcl-test-client "+proto, echoCln) + _, err = hstExec("RunVclEchoClient "+proto, echoCln) if err != nil { t.Errorf("vcl test client: %v", err) return @@ -171,7 +171,7 @@ func (s *Veths2Suite) testRetryAttach(proto string) { t.Errorf("error while stopping hs-test: %v", err) return } - _, err = hstExec("2veths srv-with-preset-hw-addr", srvInstance) + _, err = hstExec("Configure2Veths srv-with-preset-hw-addr", srvInstance) if err != nil { t.Errorf("%v", err) return @@ -181,7 +181,7 @@ func (s *Veths2Suite) testRetryAttach(proto string) { time.Sleep(30 * time.Second) // Wait a moment for the re-attachment to happen fmt.Println("... Running second echo client test, after disconnect and re-attachment.") - _, err = hstExec("vcl-test-client "+proto, echoCln) + _, err = hstExec("RunVclEchoClient "+proto, echoCln) if err != nil { t.Errorf("vcl test client: %v", err) } -- cgit 1.2.3-korg