diff --git a/pkg/testutils/echo/client/client b/pkg/testutils/echo/client/client new file mode 100755 index 00000000..3a9353a7 Binary files /dev/null and b/pkg/testutils/echo/client/client differ diff --git a/pkg/testutils/echo/client/client.go b/pkg/testutils/echo/client/client.go new file mode 100644 index 00000000..97a8adec --- /dev/null +++ b/pkg/testutils/echo/client/client.go @@ -0,0 +1,45 @@ +package main + +import ( + "flag" + "fmt" + "io" + "net" +) + +func main() { + target := flag.String("target", "", "the server address") + payload := flag.String("message", "", "the message to send to the server") + flag.Parse() + + if *target == "" || *payload == "" { + flag.Usage() + panic("invalid arguments") + } + conn, err := net.Dial("tcp", *target) + if err != nil { + panic(fmt.Sprintf("Failed to open connection to [%s] %v", *target, err)) + } + defer conn.Close() + + _, err = conn.Write([]byte(*payload)) + if err != nil { + panic("Failed to send payload") + } + _, err = conn.Write([]byte("\n")) + if err != nil { + panic("Failed to send payload") + } + + buf := make([]byte, 4) + for { + n, err := conn.Read(buf) + fmt.Print(string(buf[:n])) + if err == io.EOF { + break + } + if err != nil { + panic("Failed to read from socket") + } + } +} diff --git a/pkg/testutils/echo/echo_test.go b/pkg/testutils/echo/echo_test.go new file mode 100644 index 00000000..a0045fee --- /dev/null +++ b/pkg/testutils/echo/echo_test.go @@ -0,0 +1,98 @@ +package main_test + +import ( + "fmt" + "io/ioutil" + "net" + "os/exec" + "strings" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/onsi/gomega/gbytes" + "github.com/onsi/gomega/gexec" +) + +var serverBinaryPath, clientBinaryPath string + +var _ = SynchronizedBeforeSuite(func() []byte { + serverBinaryPath, err := gexec.Build("github.com/containernetworking/plugins/pkg/testutils/echo/server") + Expect(err).NotTo(HaveOccurred()) + clientBinaryPath, err := gexec.Build("github.com/containernetworking/plugins/pkg/testutils/echo/client") + Expect(err).NotTo(HaveOccurred()) + return []byte(fmt.Sprintf("%s,%s", serverBinaryPath, clientBinaryPath)) +}, func(data []byte) { + binaries := strings.Split(string(data), ",") + serverBinaryPath = binaries[0] + clientBinaryPath = binaries[1] +}) + +var _ = SynchronizedAfterSuite(func() {}, func() { + gexec.CleanupBuildArtifacts() +}) + +var _ = Describe("Echosvr", func() { + var session *gexec.Session + BeforeEach(func() { + var err error + cmd := exec.Command(serverBinaryPath) + session, err = gexec.Start(cmd, GinkgoWriter, GinkgoWriter) + Expect(err).NotTo(HaveOccurred()) + }) + + AfterEach(func() { + session.Kill().Wait() + }) + + Context("Server test", func() { + It("starts and doesn't terminate immediately", func() { + Consistently(session).ShouldNot(gexec.Exit()) + }) + + tryConnect := func() (net.Conn, error) { + programOutput := session.Out.Contents() + addr := strings.TrimSpace(string(programOutput)) + + conn, err := net.Dial("tcp", addr) + if err != nil { + return nil, err + } + return conn, err + } + + It("prints its listening address to stdout", func() { + Eventually(session.Out).Should(gbytes.Say("\n")) + conn, err := tryConnect() + Expect(err).NotTo(HaveOccurred()) + conn.Close() + }) + + It("will echo data back to us", func() { + Eventually(session.Out).Should(gbytes.Say("\n")) + conn, err := tryConnect() + Expect(err).NotTo(HaveOccurred()) + defer conn.Close() + + fmt.Fprintf(conn, "hello\n") + Expect(ioutil.ReadAll(conn)).To(Equal([]byte("hello"))) + }) + }) + + Context("Client Server Test", func() { + It("starts and doesn't terminate immediately", func() { + Consistently(session).ShouldNot(gexec.Exit()) + }) + + It("connects successfully using echo client", func() { + Eventually(session.Out).Should(gbytes.Say("\n")) + serverAddress := strings.TrimSpace(string(session.Out.Contents())) + fmt.Println("Server address", string(serverAddress)) + + cmd := exec.Command(clientBinaryPath, "-target", serverAddress, "-message", "hello") + clientSession, err := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) + Expect(err).NotTo(HaveOccurred()) + Eventually(clientSession.Out).Should(gbytes.Say("hello")) + Eventually(clientSession).Should(gexec.Exit()) + }) + }) +}) diff --git a/pkg/testutils/echosvr/init_test.go b/pkg/testutils/echo/init_test.go similarity index 100% rename from pkg/testutils/echosvr/init_test.go rename to pkg/testutils/echo/init_test.go diff --git a/pkg/testutils/echosvr/main.go b/pkg/testutils/echo/server/main.go similarity index 100% rename from pkg/testutils/echosvr/main.go rename to pkg/testutils/echo/server/main.go diff --git a/pkg/testutils/echosvr/echosvr_test.go b/pkg/testutils/echosvr/echosvr_test.go deleted file mode 100644 index cca1fffb..00000000 --- a/pkg/testutils/echosvr/echosvr_test.go +++ /dev/null @@ -1,74 +0,0 @@ -package main_test - -import ( - "fmt" - "io/ioutil" - "net" - "os/exec" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/gexec" -) - -var binaryPath string - -var _ = SynchronizedBeforeSuite(func() []byte { - binaryPath, err := gexec.Build("github.com/containernetworking/plugins/pkg/testutils/echosvr") - Expect(err).NotTo(HaveOccurred()) - return []byte(binaryPath) -}, func(data []byte) { - binaryPath = string(data) -}) - -var _ = SynchronizedAfterSuite(func() {}, func() { - gexec.CleanupBuildArtifacts() -}) - -var _ = Describe("Echosvr", func() { - var session *gexec.Session - BeforeEach(func() { - var err error - cmd := exec.Command(binaryPath) - session, err = gexec.Start(cmd, GinkgoWriter, GinkgoWriter) - Expect(err).NotTo(HaveOccurred()) - }) - - AfterEach(func() { - session.Kill().Wait() - }) - - It("starts and doesn't terminate immediately", func() { - Consistently(session).ShouldNot(gexec.Exit()) - }) - - tryConnect := func() (net.Conn, error) { - programOutput := session.Out.Contents() - addr := strings.TrimSpace(string(programOutput)) - - conn, err := net.Dial("tcp", addr) - if err != nil { - return nil, err - } - return conn, err - } - - It("prints its listening address to stdout", func() { - Eventually(session.Out).Should(gbytes.Say("\n")) - conn, err := tryConnect() - Expect(err).NotTo(HaveOccurred()) - conn.Close() - }) - - It("will echo data back to us", func() { - Eventually(session.Out).Should(gbytes.Say("\n")) - conn, err := tryConnect() - Expect(err).NotTo(HaveOccurred()) - defer conn.Close() - - fmt.Fprintf(conn, "hello\n") - Expect(ioutil.ReadAll(conn)).To(Equal([]byte("hello"))) - }) -})