package basic import ( "fmt" "strconv" "strings" "time" "github.com/onsi/ginkgo/v2" clientsdk "github.com/fatedier/frp/pkg/sdk/client" "github.com/fatedier/frp/test/e2e/framework" "github.com/fatedier/frp/test/e2e/framework/consts" "github.com/fatedier/frp/test/e2e/pkg/request" ) var _ = ginkgo.Describe("[Feature: ClientManage]", func() { f := framework.NewDefaultFramework() ginkgo.It("Update && Reload API", func() { serverConf := consts.DefaultServerConfig adminPort := f.AllocPort() p1Port := f.AllocPort() p2Port := f.AllocPort() p3Port := f.AllocPort() clientConf := consts.DefaultClientConfig + fmt.Sprintf(` webServer.port = %d [[proxies]] name = "p1" type = "tcp" localPort = {{ .%s }} remotePort = %d [[proxies]] name = "p2" type = "tcp" localPort = {{ .%s }} remotePort = %d [[proxies]] name = "p3" type = "tcp" localPort = {{ .%s }} remotePort = %d `, adminPort, framework.TCPEchoServerPort, p1Port, framework.TCPEchoServerPort, p2Port, framework.TCPEchoServerPort, p3Port) f.RunProcesses([]string{serverConf}, []string{clientConf}) framework.NewRequestExpect(f).Port(p1Port).Ensure() framework.NewRequestExpect(f).Port(p2Port).Ensure() framework.NewRequestExpect(f).Port(p3Port).Ensure() client := clientsdk.New("127.0.0.1", adminPort) conf, err := client.GetConfig() framework.ExpectNoError(err) newP2Port := f.AllocPort() // change p2 port and remove p3 proxy newClientConf := strings.ReplaceAll(conf, strconv.Itoa(p2Port), strconv.Itoa(newP2Port)) p3Index := strings.LastIndex(newClientConf, "[[proxies]]") if p3Index >= 0 { newClientConf = newClientConf[:p3Index] } err = client.UpdateConfig(newClientConf) framework.ExpectNoError(err) err = client.Reload() framework.ExpectNoError(err) time.Sleep(time.Second) framework.NewRequestExpect(f).Port(p1Port).Explain("p1 port").Ensure() framework.NewRequestExpect(f).Port(p2Port).Explain("original p2 port").ExpectError(true).Ensure() framework.NewRequestExpect(f).Port(newP2Port).Explain("new p2 port").Ensure() framework.NewRequestExpect(f).Port(p3Port).Explain("p3 port").ExpectError(true).Ensure() }) ginkgo.It("healthz", func() { serverConf := consts.DefaultServerConfig dashboardPort := f.AllocPort() clientConf := consts.DefaultClientConfig + fmt.Sprintf(` webServer.addr = "0.0.0.0" webServer.port = %d webServer.user = "admin" webServer.password = "admin" `, dashboardPort) f.RunProcesses([]string{serverConf}, []string{clientConf}) framework.NewRequestExpect(f).RequestModify(func(r *request.Request) { r.HTTP().HTTPPath("/healthz") }).Port(dashboardPort).ExpectResp([]byte("")).Ensure() framework.NewRequestExpect(f).RequestModify(func(r *request.Request) { r.HTTP().HTTPPath("/") }).Port(dashboardPort). Ensure(framework.ExpectResponseCode(401)) }) ginkgo.It("stop", func() { serverConf := consts.DefaultServerConfig adminPort := f.AllocPort() testPort := f.AllocPort() clientConf := consts.DefaultClientConfig + fmt.Sprintf(` webServer.port = %d [[proxies]] name = "test" type = "tcp" localPort = {{ .%s }} remotePort = %d `, adminPort, framework.TCPEchoServerPort, testPort) f.RunProcesses([]string{serverConf}, []string{clientConf}) framework.NewRequestExpect(f).Port(testPort).Ensure() client := clientsdk.New("127.0.0.1", adminPort) err := client.Stop() framework.ExpectNoError(err) time.Sleep(3 * time.Second) // frpc stopped so the port is not listened, expect error framework.NewRequestExpect(f).Port(testPort).ExpectError(true).Ensure() }) })