// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
//go:build !consulent
package structs
import (
"testing"
"github.com/hashicorp/hcl"
"github.com/stretchr/testify/require"
)
func TestDecodeConfigEntry_CE ( t * testing . T ) {
for _ , tc := range [ ] struct {
name string
camel string
snake string
expect ConfigEntry
expectErr string
} {
{
name : "namespaces invalid top level" ,
snake : `
kind = "terminating-gateway"
name = "terminating-gateway"
namespace = "foo"
` ,
camel : `
Kind = "terminating-gateway"
Name = "terminating-gateway"
Namespace = "foo"
` ,
expectErr : ` invalid config key "namespace", namespaces are a consul enterprise feature ` ,
} ,
{
name : "namespaces invalid deep" ,
snake : `
kind = "ingress-gateway"
name = "ingress-web"
listeners = [
{
port = 8080
protocol = "http"
services = [
{
name = "web"
hosts = [ "test.example.com" , "test2.example.com" ]
namespace = "frontend"
} ,
]
}
]
` ,
camel : `
Kind = "ingress-gateway"
Name = "ingress-web"
Namespace = "blah"
Listeners = [
{
Port = 8080
Protocol = "http"
Services = [
{
Name = "web"
Hosts = [ "test.example.com" , "test2.example.com" ]
Namespace = "frontend"
} ,
]
} ,
]
` ,
expectErr : ` * invalid config key "listeners[0].services[0].namespace", namespaces are a consul enterprise feature ` ,
} ,
} {
tc := tc
testbody := func ( t * testing . T , body string ) {
var raw map [ string ] interface { }
err := hcl . Decode ( & raw , body )
require . NoError ( t , err )
got , err := DecodeConfigEntry ( raw )
if tc . expectErr != "" {
require . Nil ( t , got )
require . Error ( t , err )
requireContainsLower ( t , err . Error ( ) , tc . expectErr )
} else {
require . NoError ( t , err )
require . Equal ( t , tc . expect , got )
}
}
t . Run ( tc . name + " (snake case)" , func ( t * testing . T ) {
testbody ( t , tc . snake )
} )
t . Run ( tc . name + " (camel case)" , func ( t * testing . T ) {
testbody ( t , tc . camel )
} )
}
}
func Test_GetLocalUpstreamIDs ( t * testing . T ) {
cases := map [ string ] struct {
input * ServiceConfigRequest
expect [ ] ServiceID
} {
"no_upstreams" : {
input : & ServiceConfigRequest {
Name : "svc" ,
} ,
expect : nil ,
} ,
"upstreams" : {
input : & ServiceConfigRequest {
Name : "svc" ,
UpstreamServiceNames : [ ] PeeredServiceName {
{ ServiceName : NewServiceName ( "a" , nil ) } ,
{ ServiceName : NewServiceName ( "b" , nil ) } ,
{ ServiceName : NewServiceName ( "c" , nil ) } ,
} ,
} ,
expect : [ ] ServiceID {
{ ID : "a" } ,
{ ID : "b" } ,
{ ID : "c" } ,
} ,
} ,
"peer_upstream" : {
input : & ServiceConfigRequest {
Name : "svc" ,
UpstreamServiceNames : [ ] PeeredServiceName {
{ Peer : "p" , ServiceName : NewServiceName ( "a" , nil ) } ,
} ,
} ,
expect : nil ,
} ,
"mixed_upstreams" : {
input : & ServiceConfigRequest {
Name : "svc" ,
UpstreamServiceNames : [ ] PeeredServiceName {
{ ServiceName : NewServiceName ( "a" , nil ) } ,
{ Peer : "p" , ServiceName : NewServiceName ( "b" , nil ) } ,
{ ServiceName : NewServiceName ( "c" , nil ) } ,
} ,
} ,
expect : [ ] ServiceID {
{ ID : "a" } ,
{ ID : "c" } ,
} ,
} ,
}
for name , tc := range cases {
t . Run ( name , func ( t * testing . T ) {
require . Equal ( t , tc . expect , tc . input . GetLocalUpstreamIDs ( ) )
} )
}
}