package main

import (
	"fmt"
	"os"
)

func (s *VethsSuite) TestLDPreloadIperfVpp() {
	var clnVclConf, srvVclConf Stanza

	serverContainer := s.getContainerByName("server-vpp")
	serverVclFileName := serverContainer.getHostWorkDir() + "/vcl_srv.conf"

	clientContainer := s.getContainerByName("client-vpp")
	clientVclFileName := clientContainer.getHostWorkDir() + "/vcl_cln.conf"

	ldpreload := os.Getenv("HST_LDPRELOAD")
	s.assertNotEqual("", ldpreload)

	ldpreload = "LD_PRELOAD=" + ldpreload

	stopServerCh := make(chan struct{}, 1)
	srvCh := make(chan error, 1)
	clnCh := make(chan error)

	s.log("starting VPPs")

	clientAppSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
		clientContainer.getHostWorkDir())
	err := clnVclConf.
		newStanza("vcl").
		append("rx-fifo-size 4000000").
		append("tx-fifo-size 4000000").
		append("app-scope-local").
		append("app-scope-global").
		append("use-mq-eventfd").
		append(clientAppSocketApi).close().
		saveToFile(clientVclFileName)
	s.assertNil(err, err)

	serverAppSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
		serverContainer.getHostWorkDir())
	err = srvVclConf.
		newStanza("vcl").
		append("rx-fifo-size 4000000").
		append("tx-fifo-size 4000000").
		append("app-scope-local").
		append("app-scope-global").
		append("use-mq-eventfd").
		append(serverAppSocketApi).close().
		saveToFile(serverVclFileName)
	s.assertNil(err, err)

	s.log("attaching server to vpp")

	srvEnv := append(os.Environ(), ldpreload, "VCL_CONFIG="+serverVclFileName)
	go s.startServerApp(srvCh, stopServerCh, srvEnv)

	err = <-srvCh
	s.assertNil(err, err)

	s.log("attaching client to vpp")
	var clnRes = make(chan string, 1)
	clnEnv := append(os.Environ(), ldpreload, "VCL_CONFIG="+clientVclFileName)
	serverVethAddress := s.netInterfaces[serverInterfaceName].ip4AddressString()
	go s.startClientApp(serverVethAddress, clnEnv, clnCh, clnRes)
	s.log(<-clnRes)

	// wait for client's result
	err = <-clnCh
	s.assertNil(err, err)

	// stop server
	stopServerCh <- struct{}{}
}
