package hostnginx import ( "bytes" "strings" "testing" ) 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 } } ` 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) } } 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) } } 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") } }) } }