Files
2026-08-17 10:10:14 +08:00

63 lines
2.5 KiB
Go

package hostnginx
import (
"bytes"
"strings"
"testing"
)
// serverConfiguration 含受管理 upstream 块、8080 被注释、8081 活动的示例配置,供各测试共享。
const serverConfiguration = `http {
upstream yms-server {
# yms-update managed upstream begin
# server 10.11.1.117:8080 max_fails=1 fail_timeout=2s;
server 10.11.1.117:8081 max_fails=1 fail_timeout=2s;
# yms-update managed upstream end
}
}
`
// TestActiveBackendPortReadsExactManagedBlock 验证 ActiveBackendPort 能从示例配置中
// 精确读取到活动端口 8081。
func TestActiveBackendPortReadsExactManagedBlock(t *testing.T) {
port, err := ActiveBackendPort([]byte(serverConfiguration))
if err != nil || port != 8081 {
t.Fatalf("unexpected active backend port: port=%d err=%v", port, err)
}
}
// TestRenderBackendPortPreservesConfigurationAndSwitchesOneServer 验证 RenderBackendPort
// 只切换一条服务器行,其余配置保持不变,且渲染结果的活动端口正确。
func TestRenderBackendPortPreservesConfigurationAndSwitchesOneServer(t *testing.T) {
rendered, err := RenderBackendPort([]byte(serverConfiguration), 8080)
if err != nil {
t.Fatalf("render backend port: %v", err)
}
port, err := ActiveBackendPort(rendered)
if err != nil || port != 8080 {
t.Fatalf("unexpected rendered backend port: port=%d err=%v", port, err)
}
if !bytes.Contains(rendered, []byte("server 10.11.1.117:8080 max_fails=1 fail_timeout=2s;")) ||
!bytes.Contains(rendered, []byte("# server 10.11.1.117:8081 max_fails=1 fail_timeout=2s;")) {
t.Fatalf("rendered configuration does not contain exact server lines:\n%s", rendered)
}
}
// TestManagedBlockRejectsAmbiguousOrAlteredInput 验证受管理块在端口双活、端口缺失、
// 选项被篡改或出现多余行等情况下都会被拒绝。
func TestManagedBlockRejectsAmbiguousOrAlteredInput(t *testing.T) {
tests := map[string]string{
"both active": strings.Replace(serverConfiguration, "# server 10.11.1.117:8080", "server 10.11.1.117:8080", 1),
"missing port": strings.Replace(serverConfiguration, " # server 10.11.1.117:8080 max_fails=1 fail_timeout=2s;\n", "", 1),
"changed option": strings.Replace(serverConfiguration, "max_fails=1", "max_fails=2", 1),
"extra line": strings.Replace(serverConfiguration, managedEnd, "# unexpected\n "+managedEnd, 1),
}
for name, content := range tests {
t.Run(name, func(t *testing.T) {
if _, err := ActiveBackendPort([]byte(content)); err == nil {
t.Fatal("expected altered managed block rejection")
}
})
}
}