hs-test: added a redis-benchmark test

- basically a copy of LdpIperf test
- small update of LdpIperf test
- new LDP suite

Type: test

Change-Id: I3f8653288c6fc6dfd6a061315e983c000974d3ff
Signed-off-by: Adrian Villin <avillin@cisco.com>
diff --git a/extras/hs-test/infra/utils.go b/extras/hs-test/infra/utils.go
index 9dd2dbd..25d8519 100644
--- a/extras/hs-test/infra/utils.go
+++ b/extras/hs-test/infra/utils.go
@@ -1,6 +1,7 @@
 package hst
 
 import (
+	"errors"
 	"fmt"
 	"io"
 	"net"
@@ -183,3 +184,133 @@
 		s.Log(fmt.Sprint(err))
 	}
 }
+
+func (s *HstSuite) StartIperfServerApp(running chan error, done chan struct{}, env []string) {
+	cmd := exec.Command("iperf3", "-4", "-s", "-p", s.GetPortFromPpid())
+	if env != nil {
+		cmd.Env = env
+	}
+	s.Log(cmd)
+	err := cmd.Start()
+	if err != nil {
+		msg := fmt.Errorf("failed to start iperf server: %v", err)
+		running <- msg
+		return
+	}
+	running <- nil
+	<-done
+	cmd.Process.Kill()
+}
+
+func (s *HstSuite) StartIperfClientApp(ipAddress string, env []string, clnCh chan error, clnRes chan string) {
+	defer func() {
+		clnCh <- nil
+	}()
+
+	nTries := 0
+
+	for {
+		cmd := exec.Command("iperf3", "-c", ipAddress, "-u", "-l", "1460", "-b", "10g", "-p", s.GetPortFromPpid())
+		if env != nil {
+			cmd.Env = env
+		}
+		s.Log(cmd)
+		o, err := cmd.CombinedOutput()
+		if err != nil {
+			if nTries > 5 {
+				clnRes <- ""
+				clnCh <- fmt.Errorf("failed to start client app '%s'.\n%s", err, o)
+				return
+			}
+			time.Sleep(1 * time.Second)
+			nTries++
+			continue
+		} else {
+			clnRes <- fmt.Sprintf("Client output: %s", o)
+		}
+		break
+	}
+}
+
+func (s *HstSuite) StartHttpServer(running chan struct{}, done chan struct{}, addressPort, netNs string) {
+	cmd := newCommand([]string{"./http_server", addressPort, s.Ppid, s.ProcessIndex}, netNs)
+	err := cmd.Start()
+	s.Log(cmd)
+	if err != nil {
+		s.Log("Failed to start http server: " + fmt.Sprint(err))
+		return
+	}
+	running <- struct{}{}
+	<-done
+	cmd.Process.Kill()
+}
+
+func (s *HstSuite) StartWget(finished chan error, server_ip, port, query, netNs string) {
+	defer func() {
+		finished <- errors.New("wget error")
+	}()
+
+	cmd := newCommand([]string{"wget", "--timeout=10", "--no-proxy", "--tries=5", "-O", "/dev/null", server_ip + ":" + port + "/" + query},
+		netNs)
+	s.Log(cmd)
+	o, err := cmd.CombinedOutput()
+	if err != nil {
+		finished <- fmt.Errorf("wget error: '%v\n\n%s'", err, o)
+		return
+	} else if !strings.Contains(string(o), "200 OK") {
+		finished <- fmt.Errorf("wget error: response not 200 OK")
+		return
+	}
+	finished <- nil
+}
+
+// Start a server app. 'processName' is used to check whether the app started correctly.
+func (s *HstSuite) StartServerApp(c *Container, processName string, cmd string,
+	running chan error, done chan struct{}) {
+
+	s.Log("starting server")
+	c.ExecServer(cmd)
+	cmd2 := exec.Command("docker", "exec", c.Name, "pidof", processName)
+	err := cmd2.Run()
+	if err != nil {
+		msg := fmt.Errorf("failed to start server app: %v", err)
+		running <- msg
+		<-done
+		return
+	}
+	running <- nil
+	<-done
+}
+
+func (s *HstSuite) StartClientApp(c *Container, cmd string,
+	clnCh chan error, clnRes chan string) {
+	defer func() {
+		close(clnCh)
+		close(clnRes)
+	}()
+
+	s.Log("starting client app, please wait")
+
+	nTries := 0
+	for {
+		// exec.Cmd can only be used once, which is why it's in the loop
+		cmd2 := exec.Command("/bin/sh", "-c", "docker exec "+c.getEnvVarsAsCliOption()+" "+
+			c.Name+" "+cmd)
+		s.Log(cmd2)
+		o, err := cmd2.CombinedOutput()
+		if err != nil {
+			s.Log(err)
+			if nTries > 5 {
+				clnRes <- ""
+				clnCh <- fmt.Errorf("failed to start client app '%s'", err)
+				s.AssertNil(err, fmt.Sprint(err))
+				break
+			}
+			time.Sleep(1 * time.Second)
+			nTries++
+		} else {
+			clnRes <- fmt.Sprintf("Client output: %s", o)
+			break
+		}
+	}
+}