2021-05-17 12:33:00 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2021-12-04 06:34:01 +00:00
|
|
|
"github.com/Dreamacro/Clash.Meta/adapter/outbound"
|
|
|
|
C "github.com/Dreamacro/Clash.Meta/constant"
|
2021-05-17 12:33:00 +00:00
|
|
|
|
|
|
|
"github.com/docker/docker/api/types/container"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestClash_SnellObfsHTTP(t *testing.T) {
|
|
|
|
cfg := &container.Config{
|
|
|
|
Image: ImageSnell,
|
|
|
|
ExposedPorts: defaultExposedPorts,
|
|
|
|
Cmd: []string{"-c", "/config.conf"},
|
|
|
|
}
|
|
|
|
hostCfg := &container.HostConfig{
|
|
|
|
PortBindings: defaultPortBindings,
|
|
|
|
Binds: []string{fmt.Sprintf("%s:/config.conf", C.Path.Resolve("snell-http.conf"))},
|
|
|
|
}
|
|
|
|
|
|
|
|
id, err := startContainer(cfg, hostCfg, "snell-http")
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(t, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Cleanup(func() {
|
|
|
|
cleanContainer(id)
|
|
|
|
})
|
|
|
|
|
|
|
|
proxy, err := outbound.NewSnell(outbound.SnellOption{
|
|
|
|
Name: "snell",
|
|
|
|
Server: localIP.String(),
|
|
|
|
Port: 10002,
|
|
|
|
Psk: "password",
|
2022-03-16 04:10:13 +00:00
|
|
|
ObfsOpts: map[string]any{
|
2021-05-17 12:33:00 +00:00
|
|
|
"mode": "http",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(t, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(waitTime)
|
|
|
|
testSuit(t, proxy)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestClash_SnellObfsTLS(t *testing.T) {
|
|
|
|
cfg := &container.Config{
|
|
|
|
Image: ImageSnell,
|
|
|
|
ExposedPorts: defaultExposedPorts,
|
|
|
|
Cmd: []string{"-c", "/config.conf"},
|
|
|
|
}
|
|
|
|
hostCfg := &container.HostConfig{
|
|
|
|
PortBindings: defaultPortBindings,
|
|
|
|
Binds: []string{fmt.Sprintf("%s:/config.conf", C.Path.Resolve("snell-tls.conf"))},
|
|
|
|
}
|
|
|
|
|
|
|
|
id, err := startContainer(cfg, hostCfg, "snell-tls")
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(t, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Cleanup(func() {
|
|
|
|
cleanContainer(id)
|
|
|
|
})
|
|
|
|
|
|
|
|
proxy, err := outbound.NewSnell(outbound.SnellOption{
|
|
|
|
Name: "snell",
|
|
|
|
Server: localIP.String(),
|
|
|
|
Port: 10002,
|
|
|
|
Psk: "password",
|
2022-03-16 04:10:13 +00:00
|
|
|
ObfsOpts: map[string]any{
|
2021-05-17 12:33:00 +00:00
|
|
|
"mode": "tls",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(t, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(waitTime)
|
|
|
|
testSuit(t, proxy)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestClash_Snell(t *testing.T) {
|
|
|
|
cfg := &container.Config{
|
|
|
|
Image: ImageSnell,
|
|
|
|
ExposedPorts: defaultExposedPorts,
|
|
|
|
Cmd: []string{"-c", "/config.conf"},
|
|
|
|
}
|
|
|
|
hostCfg := &container.HostConfig{
|
|
|
|
PortBindings: defaultPortBindings,
|
|
|
|
Binds: []string{fmt.Sprintf("%s:/config.conf", C.Path.Resolve("snell.conf"))},
|
|
|
|
}
|
|
|
|
|
|
|
|
id, err := startContainer(cfg, hostCfg, "snell")
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(t, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Cleanup(func() {
|
|
|
|
cleanContainer(id)
|
|
|
|
})
|
|
|
|
|
|
|
|
proxy, err := outbound.NewSnell(outbound.SnellOption{
|
|
|
|
Name: "snell",
|
|
|
|
Server: localIP.String(),
|
|
|
|
Port: 10002,
|
|
|
|
Psk: "password",
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(t, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(waitTime)
|
|
|
|
testSuit(t, proxy)
|
|
|
|
}
|
2021-07-18 09:23:22 +00:00
|
|
|
|
2022-01-10 12:24:20 +00:00
|
|
|
func TestClash_Snellv3(t *testing.T) {
|
|
|
|
cfg := &container.Config{
|
|
|
|
Image: ImageSnell,
|
|
|
|
ExposedPorts: defaultExposedPorts,
|
|
|
|
Cmd: []string{"-c", "/config.conf"},
|
|
|
|
}
|
|
|
|
hostCfg := &container.HostConfig{
|
|
|
|
PortBindings: defaultPortBindings,
|
|
|
|
Binds: []string{fmt.Sprintf("%s:/config.conf", C.Path.Resolve("snell.conf"))},
|
|
|
|
}
|
|
|
|
|
|
|
|
id, err := startContainer(cfg, hostCfg, "snell")
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(t, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Cleanup(func() {
|
|
|
|
cleanContainer(id)
|
|
|
|
})
|
|
|
|
|
|
|
|
proxy, err := outbound.NewSnell(outbound.SnellOption{
|
|
|
|
Name: "snell",
|
|
|
|
Server: localIP.String(),
|
|
|
|
Port: 10002,
|
|
|
|
Psk: "password",
|
|
|
|
UDP: true,
|
|
|
|
Version: 3,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(t, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(waitTime)
|
|
|
|
testSuit(t, proxy)
|
|
|
|
}
|
|
|
|
|
2021-07-18 09:23:22 +00:00
|
|
|
func Benchmark_Snell(b *testing.B) {
|
|
|
|
cfg := &container.Config{
|
|
|
|
Image: ImageSnell,
|
|
|
|
ExposedPorts: defaultExposedPorts,
|
|
|
|
Cmd: []string{"-c", "/config.conf"},
|
|
|
|
}
|
|
|
|
hostCfg := &container.HostConfig{
|
|
|
|
PortBindings: defaultPortBindings,
|
|
|
|
Binds: []string{fmt.Sprintf("%s:/config.conf", C.Path.Resolve("snell-http.conf"))},
|
|
|
|
}
|
|
|
|
|
|
|
|
id, err := startContainer(cfg, hostCfg, "snell-http")
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(b, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
b.Cleanup(func() {
|
|
|
|
cleanContainer(id)
|
|
|
|
})
|
|
|
|
|
|
|
|
proxy, err := outbound.NewSnell(outbound.SnellOption{
|
|
|
|
Name: "snell",
|
|
|
|
Server: localIP.String(),
|
|
|
|
Port: 10002,
|
|
|
|
Psk: "password",
|
2022-03-16 04:10:13 +00:00
|
|
|
ObfsOpts: map[string]any{
|
2021-07-18 09:23:22 +00:00
|
|
|
"mode": "http",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
assert.FailNow(b, err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(waitTime)
|
|
|
|
benchmarkProxy(b, proxy)
|
|
|
|
}
|