open-consul/command/connect/proxy/proxy_test.go

110 lines
2.5 KiB
Go

package proxy
import (
"testing"
"time"
"github.com/hashicorp/consul/agent"
"github.com/hashicorp/consul/connect/proxy"
"github.com/mitchellh/cli"
"github.com/stretchr/testify/require"
)
func TestCommandConfigWatcher(t *testing.T) {
t.Parallel()
cases := []struct {
Name string
Flags []string
Test func(*testing.T, *proxy.Config)
}{
{
"-service flag only",
[]string{"-service", "web"},
func(t *testing.T, cfg *proxy.Config) {
require.Equal(t, 0, cfg.PublicListener.BindPort)
require.Len(t, cfg.Upstreams, 0)
},
},
{
"-service flag with upstreams",
[]string{
"-service", "web",
"-upstream", "db:1234",
"-upstream", "db2:2345",
},
func(t *testing.T, cfg *proxy.Config) {
require.Equal(t, 0, cfg.PublicListener.BindPort)
require.Len(t, cfg.Upstreams, 2)
require.Equal(t, 1234, cfg.Upstreams[0].LocalBindPort)
require.Equal(t, 2345, cfg.Upstreams[1].LocalBindPort)
},
},
{
"-service flag with -service-addr",
[]string{"-service", "web"},
func(t *testing.T, cfg *proxy.Config) {
// -service-addr has no affect since -listen isn't set
require.Equal(t, 0, cfg.PublicListener.BindPort)
require.Len(t, cfg.Upstreams, 0)
},
},
{
"-service, -service-addr, -listen",
[]string{
"-service", "web",
"-service-addr", "127.0.0.1:1234",
"-listen", ":4567",
},
func(t *testing.T, cfg *proxy.Config) {
require.Len(t, cfg.Upstreams, 0)
require.Equal(t, "", cfg.PublicListener.BindAddress)
require.Equal(t, 4567, cfg.PublicListener.BindPort)
require.Equal(t, "127.0.0.1:1234", cfg.PublicListener.LocalServiceAddress)
},
},
}
for _, tc := range cases {
t.Run(tc.Name, func(t *testing.T) {
require := require.New(t)
a := agent.NewTestAgent(t.Name(), ``)
defer a.Shutdown()
client := a.Client()
ui := cli.NewMockUi()
c := New(ui, make(chan struct{}))
c.testNoStart = true
// Run and purposely fail the command
code := c.Run(append([]string{
"-http-addr=" + a.HTTPAddr(),
}, tc.Flags...))
require.Equal(0, code, ui.ErrorWriter.String())
// Get the configuration watcher
cw, err := c.configWatcher(client)
require.NoError(err)
tc.Test(t, testConfig(t, cw))
})
}
}
func testConfig(t *testing.T, cw proxy.ConfigWatcher) *proxy.Config {
t.Helper()
select {
case cfg := <-cw.Watch():
return cfg
case <-time.After(1 * time.Second):
t.Fatal("no configuration loaded")
return nil // satisfy compiler
}
}