920a78fdae
Внутри e2e-hysteria.sh жила вторая реализация hysteria2:// URI на bash. Go-юнит-тесты проверяли production-генератор, e2e проверял свою функцию - и дрейф любой из двух реализаций оставлял обе группы тестов зелёными. Фраза "реальный клиент подключается именно по ссылке, которую выдаёт HY2XS" была неточной. Билдер ссылки вынесен в экспортируемую service.BuildHysteria2ShareURI, production-путь Hysteria2Url стал её тонкой обёрткой. Новая тестовая утилита apps/tools/share-uri печатает ссылку тем же кодом; в production-бинарь админки она не входит. Единственное расхождение с пользовательской ссылкой - insecure=1: e2e работает на самоподписанном сертификате. Расхождение ограничено с трёх сторон: - e2e отдельно печатает и проверяет production-вариант ссылки (insecure=0, корректные obfs и sni); - TestBuildHysteria2ShareURI_InsecureDiffersOnlyInThatParam доказывает, что кроме этого параметра ссылки совпадают; - TestBuildHysteria2Url_ProductionPathNeverDisablesVerification фиксирует, что production-путь никогда не передаёт insecure=1. Для запуска e2e теперь нужен Go (GO_BIN).
54 lines
2.0 KiB
Go
54 lines
2.0 KiB
Go
// Утилита для end-to-end проверки: печатает клиентскую ссылку тем же
|
||
// production-кодом, который выдаёт её пользователю панели.
|
||
//
|
||
// Существует, чтобы у HY2XS была ровно ОДНА реализация hysteria2:// URI.
|
||
// Раньше tools/test/e2e-hysteria.sh собирал ссылку собственной функцией на
|
||
// bash, и дрейф любой из двух реализаций оставлял обе группы тестов зелёными.
|
||
//
|
||
// В production-бинарь админки не входит: это отдельный пакет, который не
|
||
// импортируется приложением.
|
||
//
|
||
// go run ./tools/share-uri \
|
||
// --secret peer-secret --host 127.0.0.1 --port 34643 \
|
||
// --obfs gecko --obfs-password p --sni hy2xs-e2e.local [--insecure]
|
||
package main
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"os"
|
||
|
||
"hy2xs-admin/model/bo"
|
||
"hy2xs-admin/service"
|
||
)
|
||
|
||
func main() {
|
||
secret := flag.String("secret", "", "peer connection secret (userinfo)")
|
||
host := flag.String("host", "", "public host")
|
||
port := flag.Int("port", 0, "public port")
|
||
obfsType := flag.String("obfs", "", "obfuscation type: gecko or salamander")
|
||
obfsPassword := flag.String("obfs-password", "", "obfuscation password")
|
||
sni := flag.String("sni", "", "TLS SNI")
|
||
remark := flag.String("remark", "", "link remark (fragment)")
|
||
insecure := flag.Bool("insecure", false, "skip client-side certificate verification (test only)")
|
||
flag.Parse()
|
||
|
||
if *secret == "" || *host == "" || *port <= 0 || *port > 65535 {
|
||
fmt.Fprintln(os.Stderr, "share-uri: --secret, --host and a valid --port are required")
|
||
os.Exit(2)
|
||
}
|
||
|
||
fmt.Println(service.BuildHysteria2ShareURI(service.ShareURIOptions{
|
||
Secret: *secret,
|
||
Host: *host,
|
||
Port: *port,
|
||
Obfs: bo.ObfsShareConfig{
|
||
Type: *obfsType,
|
||
Password: *obfsPassword,
|
||
},
|
||
SNI: *sni,
|
||
Remark: *remark,
|
||
Insecure: *insecure,
|
||
}))
|
||
}
|