consul/agent/structs/discovery_chain_test.go
R.B. Boyer 6a52f9f9fb
initial version of L7 config entry compiler (#5994)
With this you should be able to fetch all of the relevant discovery
chain config entries from the state store in one query and then feed
them into the compiler outside of a transaction.

There are a lot of TODOs scattered through here, but they're mostly
around handling fun edge cases and can be deferred until more of the
plumbing works completely.
2019-06-27 13:38:21 -05:00

121 lines
2.9 KiB
Go

package structs
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestDiscoveryTarget_TextMarshal(t *testing.T) {
for _, tc := range []struct {
target DiscoveryTarget
enc string
alt DiscoveryTarget
}{
{
target: DiscoveryTarget{"", "", "", ""},
enc: ",,,",
alt: DiscoveryTarget{"", "", "default", ""},
},
{
target: DiscoveryTarget{"a:b", "", "", ""},
enc: "a%3Ab,,,",
alt: DiscoveryTarget{"a:b", "", "default", ""},
},
{
target: DiscoveryTarget{"", "a:b", "", ""},
enc: ",a%3Ab,,",
alt: DiscoveryTarget{"", "a:b", "default", ""},
},
{
target: DiscoveryTarget{"", "", "a:b", ""},
enc: ",,a%3Ab,",
alt: DiscoveryTarget{"", "", "a:b", ""},
},
{
target: DiscoveryTarget{"", "", "", "a:b"},
enc: ",,,a%3Ab",
alt: DiscoveryTarget{"", "", "default", "a:b"},
},
{
target: DiscoveryTarget{"one", "two", "three", "four"},
enc: "one,two,three,four",
},
} {
tc := tc
t.Run(tc.target.String(), func(t *testing.T) {
out, err := tc.target.MarshalText()
require.NoError(t, err)
require.Equal(t, tc.enc, string(out))
var dec DiscoveryTarget
require.NoError(t, dec.UnmarshalText(out))
if tc.alt.IsEmpty() {
require.Equal(t, tc.target, dec)
} else {
require.Equal(t, tc.alt, dec)
}
})
}
}
func TestDiscoveryTarget_CopyAndModify(t *testing.T) {
type fields = DiscoveryTarget // abbreviation
for _, tc := range []struct {
name string
in fields
mod fields // this is semantically wrong, but the shape of the struct is still what we want
expect fields
}{
{
name: "service with no subset and no mod",
in: fields{"foo", "", "default", "dc1"},
mod: fields{},
expect: fields{"foo", "", "default", "dc1"},
},
{
name: "service with subset and no mod",
in: fields{"foo", "v2", "default", "dc1"},
mod: fields{},
expect: fields{"foo", "v2", "default", "dc1"},
},
{
name: "service with no subset and service mod",
in: fields{"foo", "", "default", "dc1"},
mod: fields{"bar", "", "", ""},
expect: fields{"bar", "", "default", "dc1"},
},
{
name: "service with subset and service mod",
in: fields{"foo", "v2", "default", "dc1"},
mod: fields{"bar", "", "", ""},
expect: fields{"bar", "", "default", "dc1"},
},
{
name: "service with subset and noop service mod with dc mod",
in: fields{"foo", "v2", "default", "dc1"},
mod: fields{"foo", "", "", "dc9"},
expect: fields{"foo", "v2", "default", "dc9"},
},
{
name: "service with subset and namespace mod",
in: fields{"foo", "v2", "default", "dc1"},
mod: fields{"", "", "fancy", ""},
expect: fields{"foo", "v2", "fancy", "dc1"},
},
} {
tc := tc
t.Run(tc.name, func(t *testing.T) {
out := tc.in.CopyAndModify(
tc.mod.Service,
tc.mod.ServiceSubset,
tc.mod.Namespace,
tc.mod.Datacenter,
)
require.Equal(t, tc.expect, out)
})
}
}