package traefik import ( "errors" "reflect" "testing" ) func nodeConfig(t *testing.T, host, name, domain string) *Configuration { t.Helper() c, err := FromLabels(host, map[string]string{ "traefik.enable": "true", "traefik.http.routers." + name + ".rule": "Host(`" + domain + "`)", "traefik.http.services." + name + ".loadbalancer.server.port": "80", "traefik.http.middlewares." + name + "-gzip.compress": "true", }) if err != nil { t.Fatalf("FromLabels: %v", err) } return c } func TestMerge_Disjoint(t *testing.T) { a := nodeConfig(t, "10.0.0.1", "a", "a.de") b := nodeConfig(t, "10.0.0.2", "b", "b.de") got, err := Merge(a, nil, &Configuration{}, b) if err != nil { t.Fatalf("unerwarteter Fehler: %v", err) } for _, name := range []string{"a", "b"} { if got.HTTP.Routers[name] == nil || got.HTTP.Services[name] == nil || got.HTTP.Middlewares[name+"-gzip"] == nil { t.Errorf("%s fehlt in %s", name, mustJSON(t, got)) } } if n := len(a.HTTP.Routers); n != 1 { t.Errorf("Eingabe wurde verändert: %d Router in a", n) } } func TestMerge_IdenticalDuplicateAllowed(t *testing.T) { a := nodeConfig(t, "10.0.0.1", "a", "a.de") again := nodeConfig(t, "10.0.0.1", "a", "a.de") got, err := Merge(a, again) if err != nil { t.Fatalf("unerwarteter Fehler: %v", err) } if !reflect.DeepEqual(got, a) { t.Errorf("erwartet %s, bekommen %s", mustJSON(t, a), mustJSON(t, got)) } } func TestMerge_Conflicts(t *testing.T) { a := nodeConfig(t, "10.0.0.1", "a", "a.de") sameNameOtherHost := nodeConfig(t, "10.0.0.2", "a", "a.de") sameNameOtherRule := nodeConfig(t, "10.0.0.1", "a", "evil.de") otherMiddleware := &Configuration{HTTP: &HTTPConfiguration{ Middlewares: map[string]Middleware{"a-gzip": {"compress": "false"}}, }} tests := map[string]*Configuration{ "Service": sameNameOtherHost, "Router": sameNameOtherRule, "Middleware": otherMiddleware, } for name, other := range tests { t.Run(name, func(t *testing.T) { got, err := Merge(a, other) if !errors.Is(err, ErrConflict) { t.Fatalf("erwartet ErrConflict, bekommen %v", err) } if got != nil { t.Errorf("bei Konflikt erwartet nil, bekommen %+v", got) } }) } } func TestMerge_Empty(t *testing.T) { for _, in := range [][]*Configuration{nil, {nil}, {{}}, {{HTTP: &HTTPConfiguration{}}}} { got, err := Merge(in...) if err != nil { t.Fatalf("unerwarteter Fehler: %v", err) } if got == nil || got.HTTP != nil { t.Errorf("erwartet leere Konfiguration, bekommen %+v", got) } } }