mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-09-27 05:05:53 +08:00
188 lines
4.4 KiB
Go
188 lines
4.4 KiB
Go
package v2ray_simple_test
|
||
|
||
import (
|
||
"crypto/tls"
|
||
"fmt"
|
||
"io"
|
||
"net/http"
|
||
"net/url"
|
||
"testing"
|
||
|
||
"github.com/e1732a364fed/v2ray_simple"
|
||
"github.com/e1732a364fed/v2ray_simple/netLayer"
|
||
"github.com/e1732a364fed/v2ray_simple/proxy"
|
||
"github.com/e1732a364fed/v2ray_simple/utils"
|
||
|
||
_ "github.com/e1732a364fed/v2ray_simple/advLayer/grpcSimple"
|
||
_ "github.com/e1732a364fed/v2ray_simple/advLayer/ws"
|
||
|
||
_ "github.com/e1732a364fed/v2ray_simple/proxy/dokodemo"
|
||
_ "github.com/e1732a364fed/v2ray_simple/proxy/shadowsocks"
|
||
_ "github.com/e1732a364fed/v2ray_simple/proxy/simplesocks"
|
||
_ "github.com/e1732a364fed/v2ray_simple/proxy/socks5http"
|
||
_ "github.com/e1732a364fed/v2ray_simple/proxy/trojan"
|
||
_ "github.com/e1732a364fed/v2ray_simple/proxy/vless"
|
||
_ "github.com/e1732a364fed/v2ray_simple/proxy/vmess"
|
||
)
|
||
|
||
func TestTCP_vless(t *testing.T) {
|
||
testTCP(t, "vless", 0, "tcp", false)
|
||
}
|
||
|
||
func TestTCP_trojan(t *testing.T) {
|
||
testTCP(t, "trojan", 0, "tcp", false)
|
||
}
|
||
|
||
func TestTCP_trojan_mux(t *testing.T) {
|
||
testTCP(t, "trojan", 0, "tcp", true)
|
||
}
|
||
|
||
// tcp测试我们直接使用http请求来测试
|
||
func testTCP(t *testing.T, protocol string, version int, network string, innermux bool) {
|
||
utils.LogLevel = utils.Log_debug
|
||
utils.InitLog("")
|
||
|
||
var testClientConfFormatStr = `
|
||
[[listen]]
|
||
protocol = "http"
|
||
host = "127.0.0.1"
|
||
port = %s
|
||
|
||
[[dial]]
|
||
protocol = "%s"
|
||
uuid = "a684455c-b14f-11ea-bf0d-42010aaa0003"
|
||
host = "127.0.0.1"
|
||
port = %s
|
||
version = %d
|
||
insecure = true
|
||
network = "%s"
|
||
|
||
`
|
||
|
||
if innermux {
|
||
testClientConfFormatStr += "use_mux = true"
|
||
}
|
||
|
||
const testServerConfFormatStr = `
|
||
[[listen]]
|
||
protocol = "%s"
|
||
uuid = "a684455c-b14f-11ea-bf0d-42010aaa0003"
|
||
host = "127.0.0.1"
|
||
port = %s
|
||
version = %d
|
||
insecure = true
|
||
cert = "cert.pem"
|
||
key = "cert.key"
|
||
network = "%s"
|
||
|
||
[[dial]]
|
||
protocol = "direct"
|
||
|
||
`
|
||
|
||
clientListenPort := netLayer.RandPortStr(true, false)
|
||
clientDialPort := netLayer.RandPortStr(true, false)
|
||
|
||
testClientConfStr := fmt.Sprintf(testClientConfFormatStr, clientListenPort, protocol, clientDialPort, version, network)
|
||
|
||
testServerConfStr := fmt.Sprintf(testServerConfFormatStr, protocol, clientDialPort, version, network)
|
||
|
||
clientConf, err := proxy.LoadStandardConfFromTomlStr(testClientConfStr)
|
||
if err != nil {
|
||
t.Log(err)
|
||
t.FailNow()
|
||
}
|
||
serverConf, err := proxy.LoadStandardConfFromTomlStr(testServerConfStr)
|
||
if err != nil {
|
||
t.Log(err)
|
||
t.FailNow()
|
||
}
|
||
|
||
//先建立服务端监听和客户端监听,最后自定义dns查询 并导向 客户端的 dokodemo监听端口
|
||
|
||
//http in
|
||
clientEndInServer, err := proxy.NewServer(clientConf.Listen[0])
|
||
if err != nil {
|
||
t.Log("can not create clientEndInServer: ", err)
|
||
t.FailNow()
|
||
}
|
||
|
||
// vless out
|
||
clientEndOutClient, err := proxy.NewClient(clientConf.Dial[0])
|
||
if err != nil {
|
||
t.Log("can not create clientEndOutClient: ", err)
|
||
t.FailNow()
|
||
}
|
||
|
||
//vless in
|
||
serverEndInServer, err := proxy.NewServer(serverConf.Listen[0])
|
||
if err != nil {
|
||
t.Log("can not create serverEndInServer: ", err)
|
||
t.FailNow()
|
||
}
|
||
// direct out
|
||
serverEndOutClient, err := proxy.NewClient(serverConf.Dial[0])
|
||
if err != nil {
|
||
t.Log("can not create serverEndOutClient: ", err)
|
||
t.FailNow()
|
||
}
|
||
|
||
c1 := v2ray_simple.ListenSer(clientEndInServer, clientEndOutClient, nil, nil)
|
||
c2 := v2ray_simple.ListenSer(serverEndInServer, serverEndOutClient, nil, nil)
|
||
if c1 != nil {
|
||
defer c1.Close()
|
||
}
|
||
if c2 != nil {
|
||
defer c2.Close()
|
||
}
|
||
|
||
proxyurl := "http://127.0.0.1:" + clientListenPort
|
||
|
||
url_proxy, e2 := url.Parse(proxyurl)
|
||
if e2 != nil {
|
||
fmt.Println("proxyurl given was wrong,", proxyurl, e2)
|
||
return
|
||
}
|
||
|
||
client := &http.Client{
|
||
Transport: &http.Transport{
|
||
Proxy: http.ProxyURL(url_proxy),
|
||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||
},
|
||
}
|
||
|
||
tryGetHttp(t, client, "http://captive.apple.com")
|
||
tryGetHttp(t, client, "http://www.msftconnecttest.com/connecttest.txt")
|
||
|
||
//联通性测试 可参考 https://imldy.cn/posts/99d42f85/
|
||
// 用这种 captive 测试 不容易遇到 网站无法在 某些地区 如 github action 所在的地区 访问 or卡顿等情况.
|
||
}
|
||
|
||
func tryGetHttp(t *testing.T, client *http.Client, path string) {
|
||
t.Log("start dial", path)
|
||
resp, err := client.Get(path)
|
||
if err != nil {
|
||
t.Log("get http failed", err)
|
||
t.FailNow()
|
||
}
|
||
|
||
t.Log("Got response, start read")
|
||
|
||
bs, err := io.ReadAll(resp.Body)
|
||
if err != nil {
|
||
t.Log("get http failed read", err)
|
||
t.FailNow()
|
||
}
|
||
resp.Body.Close()
|
||
|
||
t.Log("got len", len(bs))
|
||
if len(bs) > 5 {
|
||
t.Log("first 5:", string(bs[:5]))
|
||
|
||
} else {
|
||
t.Log("all:", bs)
|
||
|
||
}
|
||
|
||
}
|