hs-test: auto register test actions

Type: improvement

Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Change-Id: Icb5db6f69eda93181aba69b1f8676a73c0a4561b
This commit is contained in:
Filip Tehlar
2022-11-22 12:49:22 +01:00
committed by Florin Coras
parent b79d09bbfa
commit 1a9dc75fe8
8 changed files with 62 additions and 78 deletions

View File

@@ -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,

View File

@@ -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

View File

@@ -78,5 +78,4 @@ func TestNs(t *testing.T) {
func TestVeths2(t *testing.T) {
var m Veths2Suite
suite.Run(t, &m)
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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)
}