package main

import (
	"time"
)

func (s *VethsSuite) TestVclEchoQuic() {
	s.skip("quic test skipping..")
	s.testVclEcho("quic")
}

func (s *VethsSuite) TestVclEchoUdp() {
	s.skip("udp echo currently broken in vpp, skipping..")
	s.testVclEcho("udp")
}

func (s *VethsSuite) TestVclEchoTcp() {
	s.testVclEcho("tcp")
}

func (s *VethsSuite) testVclEcho(proto string) {
	srvVppContainer := s.getContainerByName("server-vpp")

	_, err := srvVppContainer.execAction("Configure2Veths srv")
	s.assertNil(err)

	clnVppContainer := s.getContainerByName("client-vpp")

	_, err = clnVppContainer.execAction("Configure2Veths cln")
	s.assertNil(err)

	echoSrvContainer := s.getContainerByName("server-application")

	// run server app
	_, err = echoSrvContainer.execAction("RunEchoServer " + proto)
	s.assertNil(err)

	echoClnContainer := s.getContainerByName("client-application")

	o, err := echoClnContainer.execAction("RunEchoClient " + proto)
	s.assertNil(err)

	s.log(o)
}

func (s *VethsSuite) TestVclRetryAttach() {
	s.skip()
	s.testRetryAttach("tcp")
}

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

	_, err := srvVppContainer.execAction("Configure2Veths srv-with-preset-hw-addr")
	s.assertNil(err)

	clnVppContainer := s.getContainerByName("client-vpp")

	_, err = clnVppContainer.execAction("Configure2Veths cln")
	s.assertNil(err)

	echoSrvContainer := s.getContainerByName("server-application")
	_, err = echoSrvContainer.execAction("RunVclEchoServer " + proto)
	s.assertNil(err)

	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.")
	echoClnContainer := s.getContainerByName("client-application")
	_, err = echoClnContainer.execAction("RunVclEchoClient " + proto)
	s.assertNil(err)
	s.log("... First test ended. Stopping VPP server now.")

	// Stop server-vpp-instance, start it again and then run vcl-test-client once more
	stopVppCommand := "/bin/bash -c 'ps -C vpp_main -o pid= | xargs kill -9'"
	_, err = srvVppContainer.exec(stopVppCommand)
	s.assertNil(err)
	time.Sleep(5 * time.Second) // Give parent process time to reap the killed child process
	stopVppCommand = "/bin/bash -c 'ps -C hs-test -o pid= | xargs kill -9'"
	_, err = srvVppContainer.exec(stopVppCommand)
	s.assertNil(err)
	_, err = srvVppContainer.execAction("Configure2Veths srv-with-preset-hw-addr")
	s.assertNil(err)

	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.")
	_, err = echoClnContainer.execAction("RunVclEchoClient " + proto)
	s.assertNil(err)
	s.log("Done.")
}

func (s *VethsSuite) TestTcpWithLoss() {
	serverContainer := s.getContainerByName("server-vpp")

	serverVpp := NewVppInstance(serverContainer)
	s.assertNotNil(serverVpp)
	serverVpp.set2VethsServer()
	err := serverVpp.start()
	s.assertNil(err, "starting VPP failed")

	_, err = serverVpp.vppctl("test echo server uri tcp://10.10.10.1/20022")
	s.assertNil(err, "starting echo server failed")

	clientContainer := s.getContainerByName("client-vpp")

	clientVpp := NewVppInstance(clientContainer)
	s.assertNotNil(clientVpp)
	clientVpp.set2VethsClient()
	err = clientVpp.start()
	s.assertNil(err, "starting VPP failed")

	// Ensure that VPP doesn't abort itself with NSIM enabled
	// Warning: Removing this ping will make the test fail!
	_, err = serverVpp.vppctl("ping 10.10.10.2")
	s.assertNil(err, "ping failed")

	// Add loss of packets with Network Delay Simulator
	_, err = clientVpp.vppctl("set nsim poll-main-thread delay 0.01 ms bandwidth 40 gbit packet-size 1400 packets-per-drop 1000")
	s.assertNil(err, "configuring NSIM failed")
	_, err = clientVpp.vppctl("nsim output-feature enable-disable host-vppcln")
	s.assertNil(err, "enabling NSIM failed")

	// Do echo test from client-vpp container
	output, err := clientVpp.vppctl("test echo client uri tcp://10.10.10.1/20022 mbytes 50")
	s.assertNil(err)
	s.assertEqual(true, len(output) != 0)
	s.assertNotContains(output, "failed: timeout")
	s.log(output)
}
