Skip to content

Commit 5cc5f9f

Browse files
committed
fix(config): reference real config keys in validation errors
Several config validation errors named keys that do not exist, so an operator following the message could not find the option to fix: - "duplicate proxy name in channel.named_proxies" - named proxies live under the top-level `proxies` key, there is no `channel.named_proxies`. - "connect_code_to_http_status.transforms[N]" - the key is `connect_code_to_http_response.transforms`. - "connect_code_to_http_status.transforms[N].to_response" - the nested field is `to`, not `to_response`. Only the error strings change; validation behaviour is untouched. Also add tests for both validation paths, which had no coverage before, pinning the reported config paths so they cannot drift from the tags again.
1 parent d573e2c commit 5cc5f9f

2 files changed

Lines changed: 103 additions & 5 deletions

File tree

internal/config/validate.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func (c Config) Validate() error {
6060
var proxyNames []string
6161
for _, p := range c.Proxies {
6262
if slices.Contains(proxyNames, p.Name) {
63-
return fmt.Errorf("duplicate proxy name in channel.named_proxies: %s", p.Name)
63+
return fmt.Errorf("duplicate proxy name in proxies: %s", p.Name)
6464
}
6565
if err := validateProxy(p.Name, p.Proxy); err != nil {
6666
return fmt.Errorf("in proxy %s: %v", p.Name, err)
@@ -181,10 +181,10 @@ func (c Config) Validate() error {
181181
}
182182

183183
if err := validateConnectCodeTransforms(c.UniSSE.ConnectCodeToHTTPResponse.Transforms); err != nil {
184-
return fmt.Errorf("in uni_sse.connect_code_to_http_status.transforms: %v", err)
184+
return fmt.Errorf("in uni_sse.connect_code_to_http_response.transforms: %v", err)
185185
}
186186
if err := validateConnectCodeTransforms(c.UniHTTPStream.ConnectCodeToHTTPResponse.Transforms); err != nil {
187-
return fmt.Errorf("in uni_http_stream.connect_code_to_http_status.transforms: %v", err)
187+
return fmt.Errorf("in uni_http_stream.connect_code_to_http_response.transforms: %v", err)
188188
}
189189

190190
// Map broker validation.
@@ -581,10 +581,10 @@ func validateStatusTransforms(transforms []configtypes.HttpStatusToCodeTransform
581581
func validateConnectCodeTransforms(transforms []configtypes.ConnectCodeToHTTPResponseTransform) error {
582582
for i, transform := range transforms {
583583
if transform.Code == 0 {
584-
return fmt.Errorf("code should be set in connect_code_to_http_status.transforms[%d]", i)
584+
return fmt.Errorf("code should be set in connect_code_to_http_response.transforms[%d]", i)
585585
}
586586
if transform.To.StatusCode == 0 {
587-
return fmt.Errorf("status_code should be set in connect_code_to_http_status.transforms[%d].to_response", i)
587+
return fmt.Errorf("status_code should be set in connect_code_to_http_response.transforms[%d].to", i)
588588
}
589589
}
590590
return nil

internal/config/validate_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,3 +607,101 @@ func TestValidateMapNamespace_MapBrokerType(t *testing.T) {
607607
})
608608
}
609609
}
610+
611+
func TestValidateConnectCodeToHTTPResponseTransforms(t *testing.T) {
612+
validTransform := configtypes.ConnectCodeToHTTPResponseTransform{
613+
Code: 3500,
614+
To: configtypes.TransformedConnectErrorHttpResponse{
615+
StatusCode: 403,
616+
Body: "forbidden",
617+
},
618+
}
619+
noCode := validTransform
620+
noCode.Code = 0
621+
noStatusCode := validTransform
622+
noStatusCode.To.StatusCode = 0
623+
624+
tests := []struct {
625+
name string
626+
transforms configtypes.ConnectCodeToHTTPResponseTransforms
627+
wantErr string
628+
}{
629+
{
630+
name: "valid transform",
631+
transforms: configtypes.ConnectCodeToHTTPResponseTransforms{validTransform},
632+
},
633+
{
634+
name: "missing code",
635+
transforms: configtypes.ConnectCodeToHTTPResponseTransforms{noCode},
636+
wantErr: "code should be set in connect_code_to_http_response.transforms[0]",
637+
},
638+
{
639+
name: "missing status code",
640+
transforms: configtypes.ConnectCodeToHTTPResponseTransforms{validTransform, noStatusCode},
641+
wantErr: "status_code should be set in connect_code_to_http_response.transforms[1].to",
642+
},
643+
}
644+
645+
// The same transforms are validated for both unidirectional HTTP transports,
646+
// each reporting under its own config path.
647+
transports := []struct {
648+
name string
649+
prefix string
650+
set func(cfg *Config, transforms configtypes.ConnectCodeToHTTPResponseTransforms)
651+
}{
652+
{
653+
name: "uni_sse",
654+
prefix: "in uni_sse.connect_code_to_http_response.transforms: ",
655+
set: func(cfg *Config, transforms configtypes.ConnectCodeToHTTPResponseTransforms) {
656+
cfg.UniSSE.ConnectCodeToHTTPResponse.Transforms = transforms
657+
},
658+
},
659+
{
660+
name: "uni_http_stream",
661+
prefix: "in uni_http_stream.connect_code_to_http_response.transforms: ",
662+
set: func(cfg *Config, transforms configtypes.ConnectCodeToHTTPResponseTransforms) {
663+
cfg.UniHTTPStream.ConnectCodeToHTTPResponse.Transforms = transforms
664+
},
665+
},
666+
}
667+
668+
for _, transport := range transports {
669+
for _, tt := range tests {
670+
t.Run(transport.name+"/"+tt.name, func(t *testing.T) {
671+
cfg := DefaultConfig()
672+
transport.set(&cfg, tt.transforms)
673+
err := cfg.Validate()
674+
if tt.wantErr == "" {
675+
require.NoError(t, err)
676+
return
677+
}
678+
require.EqualError(t, err, transport.prefix+tt.wantErr)
679+
})
680+
}
681+
}
682+
}
683+
684+
func TestValidateDuplicateProxyName(t *testing.T) {
685+
proxy := configtypes.Proxy{
686+
Endpoint: "http://localhost:3000/proxy",
687+
Timeout: configtypes.Duration(time.Second),
688+
}
689+
690+
t.Run("unique names are valid", func(t *testing.T) {
691+
cfg := DefaultConfig()
692+
cfg.Proxies = configtypes.NamedProxies{
693+
{Name: "first", Proxy: proxy},
694+
{Name: "second", Proxy: proxy},
695+
}
696+
require.NoError(t, cfg.Validate())
697+
})
698+
699+
t.Run("duplicate name is invalid", func(t *testing.T) {
700+
cfg := DefaultConfig()
701+
cfg.Proxies = configtypes.NamedProxies{
702+
{Name: "first", Proxy: proxy},
703+
{Name: "first", Proxy: proxy},
704+
}
705+
require.EqualError(t, cfg.Validate(), "duplicate proxy name in proxies: first")
706+
})
707+
}

0 commit comments

Comments
 (0)