package main

import (
	. "fd.io/hs-test/infra"
	"fmt"
	"time"
)

func init() {
	RegisterVethTests(XEchoVclClientUdpTest, XEchoVclClientTcpTest, XEchoVclServerUdpTest,
		XEchoVclServerTcpTest, VclEchoTcpTest, VclEchoUdpTest, VclRetryAttachTest)
}

func getVclConfig(c *Container, ns_id_optional ...string) string {
	var s Stanza
	ns_id := "default"
	if len(ns_id_optional) > 0 {
		ns_id = ns_id_optional[0]
	}
	s.NewStanza("vcl").
		Append(fmt.Sprintf("app-socket-api %[1]s/var/run/app_ns_sockets/%[2]s", c.GetContainerWorkDir(), ns_id)).
		Append("app-scope-global").
		Append("app-scope-local").
		Append("use-mq-eventfd")
	if len(ns_id_optional) > 0 {
		s.Append(fmt.Sprintf("namespace-id %[1]s", ns_id)).
			Append(fmt.Sprintf("namespace-secret %[1]s", ns_id))
	}
	return s.Close().ToString()
}

func XEchoVclClientUdpTest(s *VethsSuite) {
	testXEchoVclClient(s, "udp")
}

func XEchoVclClientTcpTest(s *VethsSuite) {
	testXEchoVclClient(s, "tcp")
}

func testXEchoVclClient(s *VethsSuite, proto string) {
	port := "12345"
	serverVpp := s.GetContainerByName("server-vpp").VppInstance

	serverVeth := s.GetInterfaceByName(ServerInterfaceName)
	serverVpp.Vppctl("test echo server uri %s://%s/%s fifo-size 64k", proto, serverVeth.Ip4AddressString(), port)

	echoClnContainer := s.GetTransientContainerByName("client-app")
	echoClnContainer.CreateFile("/vcl.conf", getVclConfig(echoClnContainer))

	testClientCommand := "vcl_test_client -N 100 -p " + proto + " " + serverVeth.Ip4AddressString() + " " + port
	s.Log(testClientCommand)
	echoClnContainer.AddEnvVar("VCL_CONFIG", "/vcl.conf")
	o := echoClnContainer.Exec(testClientCommand)
	s.Log(o)
	s.AssertContains(o, "CLIENT RESULTS")
}

func XEchoVclServerUdpTest(s *VethsSuite) {
	testXEchoVclServer(s, "udp")
}

func XEchoVclServerTcpTest(s *VethsSuite) {
	testXEchoVclServer(s, "tcp")
}

func testXEchoVclServer(s *VethsSuite, proto string) {
	port := "12345"
	srvVppCont := s.GetContainerByName("server-vpp")
	srvAppCont := s.GetContainerByName("server-app")

	srvAppCont.CreateFile("/vcl.conf", getVclConfig(srvVppCont))
	srvAppCont.AddEnvVar("VCL_CONFIG", "/vcl.conf")
	vclSrvCmd := fmt.Sprintf("vcl_test_server -p %s %s", proto, port)
	srvAppCont.ExecServer(vclSrvCmd)

	serverVeth := s.GetInterfaceByName(ServerInterfaceName)
	serverVethAddress := serverVeth.Ip4AddressString()

	clientVpp := s.GetContainerByName("client-vpp").VppInstance
	o := clientVpp.Vppctl("test echo client uri %s://%s/%s fifo-size 64k verbose mbytes 2", proto, serverVethAddress, port)
	s.Log(o)
	s.AssertContains(o, "Test finished at")
}

func testVclEcho(s *VethsSuite, proto string) {
	port := "12345"
	srvVppCont := s.GetContainerByName("server-vpp")
	srvAppCont := s.GetContainerByName("server-app")

	srvAppCont.CreateFile("/vcl.conf", getVclConfig(srvVppCont))
	srvAppCont.AddEnvVar("VCL_CONFIG", "/vcl.conf")
	srvAppCont.ExecServer("vcl_test_server " + port)

	serverVeth := s.GetInterfaceByName(ServerInterfaceName)
	serverVethAddress := serverVeth.Ip4AddressString()

	echoClnContainer := s.GetTransientContainerByName("client-app")
	echoClnContainer.CreateFile("/vcl.conf", getVclConfig(echoClnContainer))

	testClientCommand := "vcl_test_client -p " + proto + " " + serverVethAddress + " " + port
	echoClnContainer.AddEnvVar("VCL_CONFIG", "/vcl.conf")
	o := echoClnContainer.Exec(testClientCommand)
	s.Log(o)
}

func VclEchoTcpTest(s *VethsSuite) {
	testVclEcho(s, "tcp")
}

func VclEchoUdpTest(s *VethsSuite) {
	testVclEcho(s, "udp")
}

func VclRetryAttachTest(s *VethsSuite) {
	testRetryAttach(s, "tcp")
}

func testRetryAttach(s *VethsSuite, proto string) {
	srvVppContainer := s.GetTransientContainerByName("server-vpp")

	echoSrvContainer := s.GetContainerByName("server-app")

	echoSrvContainer.CreateFile("/vcl.conf", getVclConfig(echoSrvContainer))

	echoSrvContainer.AddEnvVar("VCL_CONFIG", "/vcl.conf")
	echoSrvContainer.ExecServer("vcl_test_server -p " + proto + " 12346")

	s.Log("This whole test case can take around 3 minutes to run. Please be patient.")
	s.Log("... Running first echo client test, before disconnect.")

	serverVeth := s.GetInterfaceByName(ServerInterfaceName)
	serverVethAddress := serverVeth.Ip4AddressString()

	echoClnContainer := s.GetTransientContainerByName("client-app")
	echoClnContainer.CreateFile("/vcl.conf", getVclConfig(echoClnContainer))

	testClientCommand := "vcl_test_client -U -p " + proto + " " + serverVethAddress + " 12346"
	echoClnContainer.AddEnvVar("VCL_CONFIG", "/vcl.conf")
	o := echoClnContainer.Exec(testClientCommand)
	s.Log(o)
	s.Log("... First test ended. Stopping VPP server now.")

	// Stop server-vpp-instance, start it again and then run vcl-test-client once more
	srvVppContainer.VppInstance.Disconnect()
	stopVppCommand := "/bin/bash -c 'ps -C vpp_main -o pid= | xargs kill -9'"
	srvVppContainer.Exec(stopVppCommand)

	s.SetupServerVpp()

	s.Log("... VPP server is starting again, so waiting for a bit.")
	time.Sleep(30 * time.Second) // Wait a moment for the re-attachment to happen

	s.Log("... Running second echo client test, after disconnect and re-attachment.")
	o = echoClnContainer.Exec(testClientCommand)
	s.Log(o)
	s.Log("Done.")
}
