package main

import (
	"fmt"
	"os"

	"github.com/edwarnicke/exechelper"
)

func testProxyHttpTcp(s *NsSuite, proxySetup func() error) error {
	const outputFile = "test.data"
	const srcFile = "10M"
	stopServer := make(chan struct{}, 1)
	serverRunning := make(chan struct{}, 1)

	s.assertNil(proxySetup(), "failed to setup proxy")

	// create test file
	err := exechelper.Run(fmt.Sprintf("ip netns exec server truncate -s %s %s", srcFile, srcFile))
	s.assertNil(err, "failed to run truncate command")
	defer func() { os.Remove(srcFile) }()

	fmt.Println("Test file created...")

	go startHttpServer(serverRunning, stopServer, ":666", "server")
	// TODO better error handling and recovery
	<-serverRunning

	defer func(chan struct{}) {
		stopServer <- struct{}{}
	}(stopServer)

	fmt.Println("http server started...")

	c := fmt.Sprintf("ip netns exec client wget --retry-connrefused --retry-on-http-error=503 --tries=10 -O %s 10.0.0.2:555/%s", outputFile, srcFile)
	_, err = exechelper.CombinedOutput(c)
	s.assertNil(err, "failed to run wget")
	stopServer <- struct{}{}

	defer func() { os.Remove(outputFile) }()

	s.assertNil(assertFileSize(outputFile, srcFile))
	return nil
}

func configureVppProxy(s *NsSuite) error {
	container := s.getContainerByName("vpp")
	testVppProxy := NewVppInstance(container)
	testVppProxy.setVppProxy()
	err := testVppProxy.start()
	s.assertNil(err, "failed to start and configure VPP")
	fmt.Println("VPP running and configured...")

	output, err := testVppProxy.vppctl("test proxy server server-uri tcp://10.0.0.2/555 client-uri tcp://10.0.1.1/666")
	fmt.Println("Proxy configured...", string(output))
	return nil
}

func (s *NsSuite) TestVppProxyHttpTcp() {
	err := testProxyHttpTcp(s, func() error {
		return configureVppProxy(s)
	})
	s.assertNil(err)
}

func configureEnvoyProxy(s *NsSuite) error {
	vppContainer := s.getContainerByName("vpp")
	testVppForEnvoyProxy := NewVppInstance(vppContainer)
	testVppForEnvoyProxy.setEnvoyProxy()
	err := testVppForEnvoyProxy.start()
	s.assertNil(err, "failed to start and configure VPP")

	envoyContainer := s.getContainerByName("envoy")
	envoyContainer.run()

	fmt.Println("VPP running and configured...")
	return nil
}

func (s *NsSuite) TestEnvoyProxyHttpTcp() {
	err := testProxyHttpTcp(s, func() error {
		return configureEnvoyProxy(s)
	})
	s.assertNil(err)
}
