package basic

import (
	"fmt"
	"time"

	"github.com/onsi/ginkgo/v2"

	"github.com/fatedier/frp/test/e2e/framework"
	"github.com/fatedier/frp/test/e2e/framework/consts"
	"github.com/fatedier/frp/test/e2e/pkg/port"
	"github.com/fatedier/frp/test/e2e/pkg/request"
)

var _ = ginkgo.Describe("[Feature: XTCP]", func() {
	f := framework.NewDefaultFramework()

	ginkgo.It("Fallback To STCP", func() {
		serverConf := consts.DefaultServerConfig
		clientConf := consts.DefaultClientConfig

		bindPortName := port.GenName("XTCP")
		clientConf += fmt.Sprintf(`
			[[proxies]]
			name = "foo"
			type = "stcp"
			localPort = {{ .%s }}

			[[visitors]]
			name = "foo-visitor"
			type = "stcp"
			serverName = "foo"
			bindPort = -1

			[[visitors]]
			name = "bar-visitor"
			type = "xtcp"
			serverName = "bar"
			bindPort = {{ .%s }}
			keepTunnelOpen = true
			fallbackTo = "foo-visitor"
			fallbackTimeoutMs = 200
			`, framework.TCPEchoServerPort, bindPortName)

		f.RunProcesses([]string{serverConf}, []string{clientConf})
		framework.NewRequestExpect(f).
			RequestModify(func(r *request.Request) {
				r.Timeout(time.Second)
			}).
			PortName(bindPortName).
			Ensure()
	})
})