diff --git a/.gitignore b/.gitignore index 947e296..56a043c 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ _testmain.go # Self bin/ packages/ +test/bin/ # Cache *.swp diff --git a/.travis.yml b/.travis.yml index b5b6a21..795ffd4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,4 +9,4 @@ install: - make script: - - make test + - make alltest diff --git a/Makefile b/Makefile index 033a044..05ffb0e 100644 --- a/Makefile +++ b/Makefile @@ -4,13 +4,18 @@ export GOPATH := $(shell pwd):$(GOPATH) all: build -build: godep fmt frps frpc +build: godep fmt frps frpc build_test + +build_test: echo_server http_server godep: GOPATH=$(OLDGOPATH) go get github.com/tools/godep fmt: - godep go fmt ./... + go fmt ./src/... + @go fmt ./test/echo_server.go + @go fmt ./test/http_server.go + @go fmt ./test/func_test.go frps: godep go build -o bin/frps ./src/frp/cmd/frps @@ -18,5 +23,26 @@ frps: frpc: godep go build -o bin/frpc ./src/frp/cmd/frpc -test: - godep go test -v ./... +echo_server: + godep go build -o test/bin/echo_server ./test/echo_server.go + +http_server: + godep go build -o test/bin/http_server ./test/http_server.go + +test: gotest + +gotest: + godep go test -v ./src/... + +alltest: + cd ./test && sh ./run_test.sh && cd - + godep go test -v ./src/... + godep go test -v ./test/func_test.go + cd ./test && sh ./clean_test.sh && cd - + +clean: + rm -f ./bin/frpc + rm -f ./bin/frps + rm -f ./test/bin/echo_server + rm -f ./test/bin/http_server + cd ./test && sh ./clean_test.sh && cd - diff --git a/test/clean_test.sh b/test/clean_test.sh new file mode 100755 index 0000000..637c488 --- /dev/null +++ b/test/clean_test.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +pid=`ps aux|grep './bin/echo_server'|grep -v grep|awk {'print $2'}` +if [ -n "${pid}" ]; then + kill ${pid} +fi + +pid=`ps aux|grep './bin/http_server'|grep -v grep|awk {'print $2'}` +if [ -n "${pid}" ]; then + kill ${pid} +fi + +pid=`ps aux|grep './../bin/frps -c ./conf/auto_test_frps.ini'|grep -v grep|awk {'print $2'}` +if [ -n "${pid}" ]; then + kill ${pid} +fi + +pid=`ps aux|grep './../bin/frpc -c ./conf/auto_test_frpc.ini'|grep -v grep|awk {'print $2'}` +if [ -n "${pid}" ]; then + kill ${pid} +fi + +rm -f ./frps.log +rm -f ./frpc.log diff --git a/test/conf/auto_test_frpc.ini b/test/conf/auto_test_frpc.ini new file mode 100644 index 0000000..eb3fdc6 --- /dev/null +++ b/test/conf/auto_test_frpc.ini @@ -0,0 +1,18 @@ +[common] +server_addr = 0.0.0.0 +server_port = 10700 +log_file = ./frpc.log +# debug, info, warn, error +log_level = debug +auth_token = 123 + +[echo] +type = tcp +local_ip = 127.0.0.1 +local_port = 10701 +use_encryption = true + +[web] +type = http +local_ip = 127.0.0.1 +local_port = 10702 diff --git a/test/conf/auto_test_frps.ini b/test/conf/auto_test_frps.ini new file mode 100644 index 0000000..43462e8 --- /dev/null +++ b/test/conf/auto_test_frps.ini @@ -0,0 +1,17 @@ +[common] +bind_addr = 0.0.0.0 +bind_port = 10700 +vhost_http_port = 10710 +log_file = ./frps.log +log_level = debug + +[echo] +type = tcp +auth_token = 123 +bind_addr = 0.0.0.0 +listen_port = 10711 + +[web] +type = http +auth_token = 123 +custom_domains = 127.0.0.1 diff --git a/test/echo_server.go b/test/echo_server.go new file mode 100644 index 0000000..4f50445 --- /dev/null +++ b/test/echo_server.go @@ -0,0 +1,41 @@ +package main + +import ( + "fmt" + + "frp/utils/conn" +) + +var ( + PORT int64 = 10701 +) + +func main() { + l, err := conn.Listen("0.0.0.0", PORT) + if err != nil { + fmt.Printf("echo server listen error: %v\n", err) + return + } + + for { + c, err := l.Accept() + if err != nil { + fmt.Printf("echo server accept error: %v\n", err) + return + } + + go echoWorker(c) + } +} + +func echoWorker(c *conn.Conn) { + for { + buff, err := c.ReadLine() + if err != nil { + fmt.Printf("echo server read error: %v\n", err) + return + } + + c.Write(buff) + } +} diff --git a/test/func_test.go b/test/func_test.go new file mode 100644 index 0000000..f162c86 --- /dev/null +++ b/test/func_test.go @@ -0,0 +1,60 @@ +package test + +import ( + "fmt" + "io/ioutil" + "net/http" + "strings" + "testing" + "time" + + "frp/utils/conn" +) + +var ( + ECHO_PORT int64 = 10711 + HTTP_PORT int64 = 10710 + ECHO_TEST_STR string = "Hello World\n" + HTTP_RES_STR string = "Hello World" +) + +func TestEchoServer(t *testing.T) { + c, err := conn.ConnectServer("0.0.0.0", ECHO_PORT) + if err != nil { + t.Fatalf("connect to echo server error: %v", err) + } + timer := time.Now().Add(time.Duration(5) * time.Second) + c.SetDeadline(timer) + + c.Write(ECHO_TEST_STR) + + buff, err := c.ReadLine() + if err != nil { + t.Fatalf("read from echo server error: %v", err) + } + + if ECHO_TEST_STR != buff { + t.Fatalf("content error, send [%s], get [%s]", strings.Trim(ECHO_TEST_STR, "\n"), strings.Trim(buff, "\n")) + } +} + +func TestHttpServer(t *testing.T) { + client := &http.Client{} + req, _ := http.NewRequest("GET", fmt.Sprintf("http://127.0.0.1:%d", HTTP_PORT), nil) + res, err := client.Do(req) + if err != nil { + t.Fatalf("do http request error: %v", err) + } + if res.StatusCode == 200 { + body, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatalf("read from http server error: %v", err) + } + bodystr := string(body) + if bodystr != HTTP_RES_STR { + t.Fatalf("content from http server error [%s], correct string is [%s]", bodystr, HTTP_RES_STR) + } + } else { + t.Fatalf("http code from http server error [%d]", res.StatusCode) + } +} diff --git a/test/http_server.go b/test/http_server.go new file mode 100644 index 0000000..cce5c14 --- /dev/null +++ b/test/http_server.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" + "net/http" +) + +var ( + PORT int64 = 10702 + HTTP_RES_STR string = "Hello World" +) + +func main() { + http.HandleFunc("/", request) + http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", PORT), nil) +} + +func request(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(HTTP_RES_STR)) +} diff --git a/test/run_test.sh b/test/run_test.sh new file mode 100755 index 0000000..82289a2 --- /dev/null +++ b/test/run_test.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +./bin/echo_server & +./bin/http_server & +./../bin/frps -c ./conf/auto_test_frps.ini & +sleep 1 +./../bin/frpc -c ./conf/auto_test_frpc.ini & + +# wait until proxies are connected +for((i=1; i<15; i++)) +do + sleep 1 + str=`ss -ant|grep 10700|grep LISTEN` + if [ -z "${str}" ]; then + echo "kong" + continue + fi + + str=`ss -ant|grep 10710|grep LISTEN` + if [ -z "${str}" ]; then + echo "kong" + continue + fi + + str=`ss -ant|grep 10711|grep LISTEN` + if [ -z "${str}" ]; then + echo "kong" + continue + fi + + break +done + +sleep 1