Files
trojan-go/proxy/proxy_test.go
T
2020-03-22 00:45:34 -04:00

308 lines
6.3 KiB
Go

package proxy
import (
"crypto/x509"
"io/ioutil"
"net"
"sync"
"testing"
"time"
"github.com/p4gefau1t/trojan-go/common"
"github.com/p4gefau1t/trojan-go/conf"
"github.com/p4gefau1t/trojan-go/test"
"golang.org/x/net/proxy"
)
func TestClientToServer(t *testing.T) {
go TestServer(t)
TestClient(t)
}
func TestClientToDatabaseServer(t *testing.T) {
go TestServerWithDatabase(t)
TestClient(t)
}
func TestClientToServerWithJSON(t *testing.T) {
go TestServerWithJSON(t)
TestClientWithJSON(t)
}
func TestMuxClientToServer(t *testing.T) {
go TestMuxClient(t)
TestServer(t)
}
func TestClientToPortReusingServer(t *testing.T) {
go TestClient(t)
TestPortReusingServer(t)
}
func TestSNIConfig(t *testing.T) {
go ClientWithWrongSNI(t)
TestServer(t)
}
func TestSQLite(t *testing.T) {
go TestClient(t)
TestServerWithSQLite(t)
}
func ClientWithWrongSNI(t *testing.T) {
serverCertBytes, err := ioutil.ReadFile("./server.crt")
common.Must(err)
pool := x509.NewCertPool()
pool.AppendCertsFromPEM(serverCertBytes)
ip := net.IPv4(127, 0, 0, 1)
port := 4444
password := "pass123123"
config := &conf.GlobalConfig{
LocalAddr: &net.TCPAddr{
IP: ip,
Port: port,
},
LocalIP: ip,
LocalPort: uint16(port),
RemoteAddr: &net.TCPAddr{
IP: ip,
Port: 4445,
},
Hash: map[string]string{common.SHA224String(password): password},
}
config.TLS.Verify = true
config.TLS.CertPool = pool
config.TLS.SNI = "localhost123"
config.TLS.VerifyHostname = true
c := Client{
config: config,
}
c.Run()
time.Sleep(time.Hour)
}
func BenchmarkClientToServerHugePayload(b *testing.B) {
b.StopTimer()
data, err := ioutil.ReadFile("client.json")
common.Must(err)
clientConfig, err := conf.ParseJSON(data)
common.Must(err)
client := Client{
config: clientConfig,
}
go client.Run()
data, err = ioutil.ReadFile("server.json")
common.Must(err)
serverConfig, err := conf.ParseJSON(data)
common.Must(err)
server := Server{
config: serverConfig,
}
go server.Run()
tcpServer := test.RunBlackHoleTCPServer()
mbytes := 512
payload := test.GeneratePayload(1024 * 1024 * mbytes)
dialer, err := proxy.SOCKS5("tcp", clientConfig.LocalAddr.String(), nil, nil)
common.Must(err)
conn, err := dialer.Dial("tcp", tcpServer.String())
common.Must(err)
b.StartTimer()
t1 := time.Now()
conn.Write(payload)
t2 := time.Now()
speed := float64(mbytes) / t2.Sub(t1).Seconds()
logger.Info("Speed: ", speed, "MBytes/s")
b.StopTimer()
}
func BenchmarkClientToServerHugeConn(b *testing.B) {
b.StopTimer()
data, err := ioutil.ReadFile("client.json")
common.Must(err)
clientConfig, err := conf.ParseJSON(data)
common.Must(err)
client := Client{
config: clientConfig,
}
go client.Run()
data, err = ioutil.ReadFile("server.json")
common.Must(err)
serverConfig, err := conf.ParseJSON(data)
common.Must(err)
server := Server{
config: serverConfig,
}
go server.Run()
tcpServer := test.RunBlackHoleTCPServer()
connNum := 1024
mbytes := 1
payload := test.GeneratePayload(1024 * 1024 * mbytes)
dialer, err := proxy.SOCKS5("tcp", clientConfig.LocalAddr.String(), nil, nil)
common.Must(err)
wg := sync.WaitGroup{}
sender := func(wg *sync.WaitGroup) {
conn, err := dialer.Dial("tcp", tcpServer.String())
common.Must(err)
conn.Write(payload)
conn.Close()
wg.Done()
}
b.StartTimer()
wg.Add(connNum)
t1 := time.Now()
for i := 0; i < connNum; i++ {
go sender(&wg)
}
wg.Wait()
t2 := time.Now()
speed := float64(mbytes) * float64(connNum) / t2.Sub(t1).Seconds()
logger.Info("Speed: ", speed, "MBytes/s")
b.StopTimer()
}
func BenchmarkClientToContinuesHugeConn(b *testing.B) {
b.StopTimer()
data, err := ioutil.ReadFile("client.json")
common.Must(err)
clientConfig, err := conf.ParseJSON(data)
common.Must(err)
client := Client{
config: clientConfig,
}
go client.Run()
data, err = ioutil.ReadFile("server.json")
common.Must(err)
serverConfig, err := conf.ParseJSON(data)
common.Must(err)
server := Server{
config: serverConfig,
}
go server.Run()
tcpServer := test.RunBlackHoleTCPServer()
connNum := 1024
mbytes := 32
payload := test.GeneratePayload(1024 * 1024 * mbytes)
dialer, err := proxy.SOCKS5("tcp", clientConfig.LocalAddr.String(), nil, nil)
common.Must(err)
sender := func() {
conn, err := dialer.Dial("tcp", tcpServer.String())
common.Must(err)
conn.Write(payload)
conn.Close()
}
b.StartTimer()
for i := 0; i < 100; i++ {
for i := 0; i < connNum; i++ {
go sender()
}
time.Sleep(time.Second / 10)
}
b.StopTimer()
}
func BenchmarkMuxClientToServerHugePayload(b *testing.B) {
b.StopTimer()
data, err := ioutil.ReadFile("client.json")
common.Must(err)
clientConfig, err := conf.ParseJSON(data)
common.Must(err)
clientConfig.TCP.Mux = true
client := Client{
config: clientConfig,
}
go client.Run()
data, err = ioutil.ReadFile("server.json")
common.Must(err)
serverConfig, err := conf.ParseJSON(data)
common.Must(err)
server := Server{
config: serverConfig,
}
go server.Run()
tcpServer := test.RunBlackHoleTCPServer()
mbytes := 128
payload := test.GeneratePayload(1024 * 1024 * mbytes)
dialer, err := proxy.SOCKS5("tcp", clientConfig.LocalAddr.String(), nil, nil)
common.Must(err)
conn, err := dialer.Dial("tcp", tcpServer.String())
common.Must(err)
b.StartTimer()
t1 := time.Now()
conn.Write(payload)
t2 := time.Now()
speed := float64(mbytes) / t2.Sub(t1).Seconds()
logger.Info("Speed: ", speed, "MBytes/s")
b.StopTimer()
}
func BenchmarkMuxClientToContinuesHugeConn(b *testing.B) {
b.StopTimer()
data, err := ioutil.ReadFile("client.json")
common.Must(err)
clientConfig, err := conf.ParseJSON(data)
common.Must(err)
clientConfig.TCP.Mux = true
client := Client{
config: clientConfig,
}
go client.Run()
data, err = ioutil.ReadFile("server.json")
common.Must(err)
serverConfig, err := conf.ParseJSON(data)
common.Must(err)
server := Server{
config: serverConfig,
}
go server.Run()
tcpServer := test.RunBlackHoleTCPServer()
connNum := 256
mbytes := 16
payload := test.GeneratePayload(1024 * 1024 * mbytes)
dialer, err := proxy.SOCKS5("tcp", clientConfig.LocalAddr.String(), nil, nil)
common.Must(err)
wg := sync.WaitGroup{}
wg.Add(connNum)
sender := func() {
conn, err := dialer.Dial("tcp", tcpServer.String())
common.Must(err)
conn.Write(payload)
conn.Close()
wg.Done()
}
b.StartTimer()
for i := 0; i < connNum; i++ {
go sender()
}
wg.Wait()
b.StopTimer()
}