diff --git a/agent/config/runtime_test.go b/agent/config/runtime_test.go index 190be8e14..9b47cface 100644 --- a/agent/config/runtime_test.go +++ b/agent/config/runtime_test.go @@ -36,15 +36,15 @@ import ( // testCase used to test different config loading and flag parsing scenarios. type testCase struct { - desc string - args []string - pre func() // setup(t *testing.T) - patch func(rt *RuntimeConfig) // expected - err string // expectedErr - warns []string // expectedWarnings - opts LoadOpts - json []string - hcl []string + desc string + args []string + setup func() // TODO: accept a testing.T instead of panic + expected func(rt *RuntimeConfig) + expectedErr string + expectedWarnings []string + opts LoadOpts + json []string + hcl []string } func (tc testCase) source(format string) []string { @@ -86,7 +86,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-advertise=1.2.3.4`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("1.2.3.4") rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") rt.RPCAdvertiseAddr = tcpAddr("1.2.3.4:8300") @@ -107,7 +107,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-advertise-wan=1.2.3.4`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") rt.SerfAdvertiseAddrWAN = tcpAddr("1.2.3.4:8302") rt.TaggedAddresses = map[string]string{ @@ -126,7 +126,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-advertise-wan=5.6.7.8`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("1.2.3.4") rt.AdvertiseAddrWAN = ipAddr("5.6.7.8") rt.RPCAdvertiseAddr = tcpAddr("1.2.3.4:8300") @@ -147,7 +147,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-bind=1.2.3.4`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.BindAddr = ipAddr("1.2.3.4") rt.AdvertiseAddrLAN = ipAddr("1.2.3.4") rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") @@ -173,14 +173,14 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-server`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Bootstrap = true rt.ServerMode = true rt.LeaveOnTerm = false rt.SkipLeaveOnInt = true rt.DataDir = dataDir }, - warns: []string{"bootstrap = true: do not enable unless necessary"}, + expectedWarnings: []string{"bootstrap = true: do not enable unless necessary"}, }) run(t, testCase{ desc: "-bootstrap-expect", @@ -189,14 +189,14 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-server`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.BootstrapExpect = 3 rt.ServerMode = true rt.LeaveOnTerm = false rt.SkipLeaveOnInt = true rt.DataDir = dataDir }, - warns: []string{"bootstrap_expect > 0: expecting 3 servers"}, + expectedWarnings: []string{"bootstrap_expect > 0: expecting 3 servers"}, }) run(t, testCase{ desc: "-client", @@ -204,7 +204,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-client=1.2.3.4`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("1.2.3.4")} rt.DNSAddrs = []net.Addr{tcpAddr("1.2.3.4:8600"), udpAddr("1.2.3.4:8600")} rt.HTTPAddrs = []net.Addr{tcpAddr("1.2.3.4:8500")} @@ -217,13 +217,13 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-data-dir=` + dataDir, `-config-dir`, filepath.Join(dataDir, "conf.d"), }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "a" rt.ACLDatacenter = "a" rt.PrimaryDatacenter = "a" rt.DataDir = dataDir }, - pre: func() { + setup: func() { writeFile(filepath.Join(dataDir, "conf.d/conf.json"), []byte(`{"datacenter":"a"}`)) }, }) @@ -233,13 +233,13 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-data-dir=` + dataDir, `-config-file`, filepath.Join(dataDir, "conf.json"), }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "a" rt.ACLDatacenter = "a" rt.PrimaryDatacenter = "a" rt.DataDir = dataDir }, - pre: func() { + setup: func() { writeFile(filepath.Join(dataDir, "conf.json"), []byte(`{"datacenter":"a"}`)) }, }) @@ -250,13 +250,13 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-config-file`, filepath.Join(dataDir, "conf.hcl"), `-config-file`, filepath.Join(dataDir, "conf.json"), }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "b" rt.ACLDatacenter = "b" rt.PrimaryDatacenter = "b" rt.DataDir = dataDir }, - pre: func() { + setup: func() { writeFile(filepath.Join(dataDir, "conf.hcl"), []byte(`datacenter = "a"`)) writeFile(filepath.Join(dataDir, "conf.json"), []byte(`{"datacenter":"b"}`)) }, @@ -266,14 +266,14 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{ `-data-dir=`, }, - err: "data_dir cannot be empty", + expectedErr: "data_dir cannot be empty", }) run(t, testCase{ desc: "-data-dir non-directory", args: []string{ `-data-dir=runtime_test.go`, }, - err: `data_dir "runtime_test.go" is not a directory`, + expectedErr: `data_dir "runtime_test.go" is not a directory`, }) run(t, testCase{ desc: "-datacenter", @@ -281,7 +281,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "a" rt.ACLDatacenter = "a" rt.PrimaryDatacenter = "a" @@ -294,14 +294,14 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=`, `-data-dir=` + dataDir, }, - err: "datacenter cannot be empty", + expectedErr: "datacenter cannot be empty", }) run(t, testCase{ desc: "-dev", args: []string{ `-dev`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("127.0.0.1") rt.AdvertiseAddrWAN = ipAddr("127.0.0.1") rt.BindAddr = ipAddr("127.0.0.1") @@ -350,7 +350,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-disable-host-node-id`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DisableHostNodeID = true rt.DataDir = dataDir }, @@ -361,7 +361,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-disable-keyring-file`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DisableKeyringFile = true rt.DataDir = dataDir }, @@ -372,7 +372,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-dns-port=123`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DNSPort = 123 rt.DNSAddrs = []net.Addr{tcpAddr("127.0.0.1:123"), udpAddr("127.0.0.1:123")} rt.DataDir = dataDir @@ -384,7 +384,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-domain=a`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DNSDomain = "a" rt.DataDir = dataDir }, @@ -395,7 +395,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-alt-domain=alt`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DNSAltDomain = "alt" rt.DataDir = dataDir }, @@ -407,7 +407,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-alt-domain=a.alt`, `-data-dir=` + dataDir, }, - err: "alt_domain cannot start with {service,connect,node,query,addr,a}", + expectedErr: "alt_domain cannot start with {service,connect,node,query,addr,a}", }) run(t, testCase{ desc: "-alt-domain can't be prefixed by service", @@ -415,7 +415,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-alt-domain=service.alt`, `-data-dir=` + dataDir, }, - err: "alt_domain cannot start with {service,connect,node,query,addr,dc1}", + expectedErr: "alt_domain cannot start with {service,connect,node,query,addr,dc1}", }) run(t, testCase{ desc: "-alt-domain can be prefixed by non-keywords", @@ -423,7 +423,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-alt-domain=mydomain.alt`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DNSAltDomain = "mydomain.alt" rt.DataDir = dataDir }, @@ -434,7 +434,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-alt-domain=dc1.alt`, `-data-dir=` + dataDir, }, - err: "alt_domain cannot start with {service,connect,node,query,addr,dc1}", + expectedErr: "alt_domain cannot start with {service,connect,node,query,addr,dc1}", }) run(t, testCase{ desc: "-enable-script-checks", @@ -442,12 +442,12 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-enable-script-checks`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.EnableLocalScriptChecks = true rt.EnableRemoteScriptChecks = true rt.DataDir = dataDir }, - warns: []string{remoteScriptCheckSecurityWarning}, + expectedWarnings: []string{remoteScriptCheckSecurityWarning}, }) run(t, testCase{ desc: "-encrypt", @@ -455,7 +455,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-encrypt=pUqJrVyVRj5jsiYEkM/tFQYfWyJIv4s3XkvDwy7Cu5s=`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.EncryptKey = "pUqJrVyVRj5jsiYEkM/tFQYfWyJIv4s3XkvDwy7Cu5s=" rt.DataDir = dataDir }, @@ -466,17 +466,17 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-data-dir=` + dataDir, `-config-dir`, filepath.Join(dataDir, "conf"), }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "a" rt.ACLDatacenter = "a" rt.PrimaryDatacenter = "a" rt.DataDir = dataDir }, - pre: func() { + setup: func() { writeFile(filepath.Join(dataDir, "conf", "valid.json"), []byte(`{"datacenter":"a"}`)) writeFile(filepath.Join(dataDir, "conf", "invalid.skip"), []byte(`NOPE`)) }, - warns: []string{ + expectedWarnings: []string{ "skipping file " + filepath.Join(dataDir, "conf", "invalid.skip") + ", extension must be .hcl or .json, or config format must be set", }, }) @@ -487,13 +487,13 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-config-format=json`, `-config-file`, filepath.Join(dataDir, "conf"), }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "a" rt.ACLDatacenter = "a" rt.PrimaryDatacenter = "a" rt.DataDir = dataDir }, - pre: func() { + setup: func() { writeFile(filepath.Join(dataDir, "conf"), []byte(`{"datacenter":"a"}`)) }, }) @@ -504,13 +504,13 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-config-format=hcl`, `-config-file`, filepath.Join(dataDir, "conf"), }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "a" rt.ACLDatacenter = "a" rt.PrimaryDatacenter = "a" rt.DataDir = dataDir }, - pre: func() { + setup: func() { writeFile(filepath.Join(dataDir, "conf"), []byte(`datacenter = "a"`)) }, }) @@ -520,7 +520,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-http-port=123`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.HTTPPort = 123 rt.HTTPAddrs = []net.Addr{tcpAddr("127.0.0.1:123")} rt.DataDir = dataDir @@ -533,7 +533,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-join=b`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.StartJoinAddrsLAN = []string{"a", "b"} rt.DataDir = dataDir }, @@ -545,7 +545,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-join-wan=b`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.StartJoinAddrsWAN = []string{"a", "b"} rt.DataDir = dataDir }, @@ -556,7 +556,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-log-level=a`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Logging.LogLevel = "a" rt.DataDir = dataDir }, @@ -567,7 +567,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-log-json`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Logging.LogJSON = true rt.DataDir = dataDir }, @@ -580,7 +580,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, json: []string{`{ "log_rotate_max_files": 2 }`}, hcl: []string{`log_rotate_max_files = 2`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Logging.LogRotateMaxFiles = 2 rt.DataDir = dataDir }, @@ -591,7 +591,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-node=a`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.NodeName = "a" rt.DataDir = dataDir }, @@ -602,7 +602,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-node-id=a`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.NodeID = "a" rt.DataDir = dataDir }, @@ -614,7 +614,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-node-meta=c:d`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.NodeMeta = map[string]string{"a": "b", "c": "d"} rt.DataDir = dataDir }, @@ -625,11 +625,11 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-non-voting-server`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ReadReplica = true rt.DataDir = dataDir }, - warns: enterpriseReadReplicaWarnings, + expectedWarnings: enterpriseReadReplicaWarnings, }) run(t, testCase{ desc: "-pid-file", @@ -637,7 +637,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-pid-file=a`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.PidFile = "a" rt.DataDir = dataDir }, @@ -653,7 +653,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, json: []string{`{ "primary_datacenter": "dc1" }`}, hcl: []string{`primary_datacenter = "dc1"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "dc2" rt.PrimaryDatacenter = "dc1" rt.ACLDatacenter = "dc1" @@ -671,7 +671,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-protocol=1`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RPCProtocol = 1 rt.DataDir = dataDir }, @@ -682,7 +682,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-raft-protocol=3`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RaftProtocol = 3 rt.DataDir = dataDir }, @@ -693,7 +693,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-raft-protocol=2`, `-data-dir=` + dataDir, }, - err: "raft_protocol version 2 is not supported by this version of Consul", + expectedErr: "raft_protocol version 2 is not supported by this version of Consul", }) run(t, testCase{ desc: "-recursor", @@ -702,7 +702,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-recursor=5.6.7.8`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DNSRecursors = []string{"1.2.3.4", "5.6.7.8"} rt.DataDir = dataDir }, @@ -713,7 +713,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-rejoin`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RejoinAfterLeave = true rt.DataDir = dataDir }, @@ -724,7 +724,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-retry-interval=5s`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RetryJoinIntervalLAN = 5 * time.Second rt.DataDir = dataDir }, @@ -735,7 +735,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-retry-interval-wan=5s`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RetryJoinIntervalWAN = 5 * time.Second rt.DataDir = dataDir }, @@ -747,7 +747,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-retry-join=b`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RetryJoinLAN = []string{"a", "b"} rt.DataDir = dataDir }, @@ -759,7 +759,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-retry-join-wan=b`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RetryJoinWAN = []string{"a", "b"} rt.DataDir = dataDir }, @@ -770,7 +770,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-retry-max=1`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RetryJoinMaxAttemptsLAN = 1 rt.DataDir = dataDir }, @@ -781,7 +781,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-retry-max-wan=1`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RetryJoinMaxAttemptsWAN = 1 rt.DataDir = dataDir }, @@ -792,7 +792,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-serf-lan-bind=1.2.3.4`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.SerfBindAddrLAN = tcpAddr("1.2.3.4:8301") rt.DataDir = dataDir }, @@ -803,7 +803,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-serf-lan-port=123`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.SerfPortLAN = 123 rt.SerfAdvertiseAddrLAN = tcpAddr("10.0.0.1:123") rt.SerfBindAddrLAN = tcpAddr("0.0.0.0:123") @@ -816,7 +816,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-serf-wan-bind=1.2.3.4`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.SerfBindAddrWAN = tcpAddr("1.2.3.4:8302") rt.DataDir = dataDir }, @@ -827,7 +827,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-serf-wan-port=123`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.SerfPortWAN = 123 rt.SerfAdvertiseAddrWAN = tcpAddr("10.0.0.1:123") rt.SerfBindAddrWAN = tcpAddr("0.0.0.0:123") @@ -840,7 +840,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-server`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ServerMode = true rt.LeaveOnTerm = false rt.SkipLeaveOnInt = true @@ -853,7 +853,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-server-port=123`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ServerPort = 123 rt.RPCAdvertiseAddr = tcpAddr("10.0.0.1:123") rt.RPCBindAddr = tcpAddr("0.0.0.0:123") @@ -866,7 +866,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-syslog`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Logging.EnableSyslog = true rt.DataDir = dataDir }, @@ -877,7 +877,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-ui`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.UIConfig.Enabled = true rt.DataDir = dataDir }, @@ -888,7 +888,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-ui-dir=a`, `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.UIConfig.Dir = "a" rt.DataDir = dataDir }, @@ -900,7 +900,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.UIConfig.ContentPath = "/a/b/" rt.DataDir = dataDir }, @@ -915,7 +915,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "bind_addr":"0.0.0.0" }`}, hcl: []string{`bind_addr = "0.0.0.0"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("10.0.0.1") rt.AdvertiseAddrWAN = ipAddr("10.0.0.1") rt.BindAddr = ipAddr("0.0.0.0") @@ -939,7 +939,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "bind_addr":"::" }`}, hcl: []string{`bind_addr = "::"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("dead:beef::1") rt.AdvertiseAddrWAN = ipAddr("dead:beef::1") rt.BindAddr = ipAddr("::") @@ -968,7 +968,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "bind_addr":"0.0.0.0", "advertise_addr": "1.2.3.4" }`}, hcl: []string{`bind_addr = "0.0.0.0" advertise_addr = "1.2.3.4"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("1.2.3.4") rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") rt.BindAddr = ipAddr("0.0.0.0") @@ -1003,7 +1003,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { client_addr = "0.0.0.0" ports {} `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("0.0.0.0")} rt.DNSAddrs = []net.Addr{tcpAddr("0.0.0.0:8600"), udpAddr("0.0.0.0:8600")} rt.HTTPAddrs = []net.Addr{tcpAddr("0.0.0.0:8500")} @@ -1021,7 +1021,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { client_addr = "0.0.0.0" ports { dns = -1 http = -2 https = -3 grpc = -4 } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("0.0.0.0")} rt.DNSPort = -1 rt.DNSAddrs = nil @@ -1043,7 +1043,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { client_addr = "0.0.0.0" ports { dns = 1 http = 2 https = 3 grpc = 4 } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("0.0.0.0")} rt.DNSPort = 1 rt.DNSAddrs = []net.Addr{tcpAddr("0.0.0.0:1"), udpAddr("0.0.0.0:1")} @@ -1070,7 +1070,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { addresses = { dns = "1.1.1.1" http = "2.2.2.2" https = "3.3.3.3" grpc = "4.4.4.4" } ports {} `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("0.0.0.0")} rt.DNSAddrs = []net.Addr{tcpAddr("1.1.1.1:8600"), udpAddr("1.1.1.1:8600")} rt.HTTPAddrs = []net.Addr{tcpAddr("2.2.2.2:8500")} @@ -1092,7 +1092,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { addresses = { dns = "1.1.1.1" http = "2.2.2.2" https = "3.3.3.3" grpc = "4.4.4.4" } ports { dns = -1 http = -2 https = -3 grpc = -4 } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("0.0.0.0")} rt.DNSPort = -1 rt.DNSAddrs = nil @@ -1116,7 +1116,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { addresses = { dns = "1.1.1.1" http = "2.2.2.2" https = "3.3.3.3" grpc = "4.4.4.4" } ports { dns = 1 http = 2 https = 3 grpc = 4 } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("0.0.0.0")} rt.DNSPort = 1 rt.DNSAddrs = []net.Addr{tcpAddr("1.1.1.1:1"), udpAddr("1.1.1.1:1")} @@ -1140,7 +1140,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { client_addr = "{{ printf \"1.2.3.4 2001:db8::1\" }}" ports { dns = 1 http = 2 https = 3 grpc = 4 } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("1.2.3.4"), ipAddr("2001:db8::1")} rt.DNSPort = 1 rt.DNSAddrs = []net.Addr{tcpAddr("1.2.3.4:1"), tcpAddr("[2001:db8::1]:1"), udpAddr("1.2.3.4:1"), udpAddr("[2001:db8::1]:1")} @@ -1176,7 +1176,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } ports { dns = 1 http = 2 https = 3 grpc = 4 } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ClientAddrs = []*net.IPAddr{ipAddr("1.2.3.4"), ipAddr("2001:db8::1")} rt.DNSPort = 1 rt.DNSAddrs = []net.Addr{tcpAddr("1.1.1.1:1"), tcpAddr("[2001:db8::10]:1"), udpAddr("1.1.1.1:1"), udpAddr("[2001:db8::10]:1")} @@ -1194,7 +1194,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "advertise_addr": "{{ printf \"1.2.3.4\" }}" }`}, hcl: []string{`advertise_addr = "{{ printf \"1.2.3.4\" }}"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("1.2.3.4") rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") rt.RPCAdvertiseAddr = tcpAddr("1.2.3.4:8300") @@ -1214,7 +1214,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "advertise_addr_wan": "{{ printf \"1.2.3.4\" }}" }`}, hcl: []string{`advertise_addr_wan = "{{ printf \"1.2.3.4\" }}"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") rt.SerfAdvertiseAddrWAN = tcpAddr("1.2.3.4:8302") rt.TaggedAddresses = map[string]string{ @@ -1245,7 +1245,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } advertise_addr = "1.2.3.4" `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("1.2.3.4") rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") rt.RPCAdvertiseAddr = tcpAddr("1.2.3.4:1000") @@ -1285,7 +1285,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } advertise_addr_wan = "1.2.3.4" `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("10.0.0.1") rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") rt.RPCAdvertiseAddr = tcpAddr("10.0.0.1:1000") @@ -1321,7 +1321,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } advertise_addr_wan = "1.2.3.4" `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrWAN = ipAddr("1.2.3.4") rt.SerfAdvertiseAddrWAN = nil rt.SerfBindAddrWAN = nil @@ -1340,7 +1340,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "serf_lan": "{{ printf \"1.2.3.4\" }}" }`}, hcl: []string{`serf_lan = "{{ printf \"1.2.3.4\" }}"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.SerfBindAddrLAN = tcpAddr("1.2.3.4:8301") rt.DataDir = dataDir }, @@ -1350,7 +1350,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "serf_wan": "{{ printf \"1.2.3.4\" }}" }`}, hcl: []string{`serf_wan = "{{ printf \"1.2.3.4\" }}"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.SerfBindAddrWAN = tcpAddr("1.2.3.4:8302") rt.DataDir = dataDir }, @@ -1360,7 +1360,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "recursors": [ "{{ printf \"5.6.7.8:9999\" }}", "{{ printf \"1.2.3.4\" }}", "{{ printf \"5.6.7.8:9999\" }}" ] }`}, hcl: []string{`recursors = [ "{{ printf \"5.6.7.8:9999\" }}", "{{ printf \"1.2.3.4\" }}", "{{ printf \"5.6.7.8:9999\" }}" ] `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DNSRecursors = []string{"5.6.7.8:9999", "1.2.3.4"} rt.DataDir = dataDir }, @@ -1370,7 +1370,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "start_join": ["{{ printf \"1.2.3.4 4.3.2.1\" }}"] }`}, hcl: []string{`start_join = ["{{ printf \"1.2.3.4 4.3.2.1\" }}"]`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.StartJoinAddrsLAN = []string{"1.2.3.4", "4.3.2.1"} rt.DataDir = dataDir }, @@ -1380,7 +1380,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "start_join_wan": ["{{ printf \"1.2.3.4 4.3.2.1\" }}"] }`}, hcl: []string{`start_join_wan = ["{{ printf \"1.2.3.4 4.3.2.1\" }}"]`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.StartJoinAddrsWAN = []string{"1.2.3.4", "4.3.2.1"} rt.DataDir = dataDir }, @@ -1390,7 +1390,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "retry_join": ["{{ printf \"1.2.3.4 4.3.2.1\" }}"] }`}, hcl: []string{`retry_join = ["{{ printf \"1.2.3.4 4.3.2.1\" }}"]`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RetryJoinLAN = []string{"1.2.3.4", "4.3.2.1"} rt.DataDir = dataDir }, @@ -1400,7 +1400,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "retry_join_wan": ["{{ printf \"1.2.3.4 4.3.2.1\" }}"] }`}, hcl: []string{`retry_join_wan = ["{{ printf \"1.2.3.4 4.3.2.1\" }}"]`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.RetryJoinWAN = []string{"1.2.3.4", "4.3.2.1"} rt.DataDir = dataDir }, @@ -1420,7 +1420,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { expose_max_port = 5678 } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ExposeMinPort = 1234 rt.ExposeMaxPort = 5678 rt.DataDir = dataDir @@ -1429,7 +1429,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { run(t, testCase{ desc: "defaults for dynamic exposed listeners", args: []string{`-data-dir=` + dataDir}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ExposeMinPort = 21500 rt.ExposeMaxPort = 21755 rt.DataDir = dataDir @@ -1475,7 +1475,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { node_meta = { "a" = "c" } `, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Bootstrap = false rt.BootstrapExpect = 0 rt.Datacenter = "b" @@ -1529,7 +1529,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-serf-lan-bind=3.3.3.3`, `-serf-wan-bind=4.4.4.4`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AdvertiseAddrLAN = ipAddr("1.1.1.1") rt.AdvertiseAddrWAN = ipAddr("2.2.2.2") rt.RPCAdvertiseAddr = tcpAddr("1.1.1.1:8300") @@ -1562,7 +1562,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "performance": { "raft_multiplier": 9} }`}, hcl: []string{`performance = { raft_multiplier=9 }`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ConsulRaftElectionTimeout = 9 * 1000 * time.Millisecond rt.ConsulRaftHeartbeatTimeout = 9 * 1000 * time.Millisecond rt.ConsulRaftLeaderLeaseTimeout = 9 * 500 * time.Millisecond @@ -1575,7 +1575,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir, `-serf-lan-allowed-cidrs=127.0.0.0/4`, `-serf-lan-allowed-cidrs=192.168.0.0/24`}, json: []string{}, hcl: []string{}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.SerfAllowedCIDRsLAN = []net.IPNet{*(parseCIDR(t, "127.0.0.0/4")), *(parseCIDR(t, "192.168.0.0/24"))} }, @@ -1587,7 +1587,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `{"serf_wan_allowed_cidrs": ["10.228.85.46/25"]}`}, hcl: []string{`serf_lan_allowed_cidrs=["127.0.0.0/4", "192.168.0.0/24"]`, `serf_wan_allowed_cidrs=["10.228.85.46/25"]`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.SerfAllowedCIDRsLAN = []net.IPNet{*(parseCIDR(t, "127.0.0.0/4")), *(parseCIDR(t, "192.168.0.0/24"))} rt.SerfAllowedCIDRsWAN = []net.IPNet{*(parseCIDR(t, "10.228.85.46/25"))} @@ -1598,7 +1598,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir, `-serf-wan-allowed-cidrs=192.168.4.0/24`, `-serf-wan-allowed-cidrs=192.168.3.0/24`}, json: []string{}, hcl: []string{}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.SerfAllowedCIDRsWAN = []net.IPNet{*(parseCIDR(t, "192.168.4.0/24")), *(parseCIDR(t, "192.168.3.0/24"))} }, @@ -1609,18 +1609,18 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { // run(t, testCase{ - desc: "invalid input", - args: []string{`-data-dir=` + dataDir}, - json: []string{`this is not JSON`}, - hcl: []string{`*** 0123 this is not HCL`}, - err: "failed to parse", + desc: "invalid input", + args: []string{`-data-dir=` + dataDir}, + json: []string{`this is not JSON`}, + hcl: []string{`*** 0123 this is not HCL`}, + expectedErr: "failed to parse", }) run(t, testCase{ desc: "datacenter is lower-cased", args: []string{`-data-dir=` + dataDir}, json: []string{`{ "datacenter": "A" }`}, hcl: []string{`datacenter = "A"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Datacenter = "a" rt.ACLDatacenter = "a" rt.PrimaryDatacenter = "a" @@ -1632,20 +1632,20 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "acl_datacenter": "A" }`}, hcl: []string{`acl_datacenter = "A"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ACLsEnabled = true rt.ACLDatacenter = "a" rt.DataDir = dataDir rt.PrimaryDatacenter = "a" }, - warns: []string{`The 'acl_datacenter' field is deprecated. Use the 'primary_datacenter' field instead.`}, + expectedWarnings: []string{`The 'acl_datacenter' field is deprecated. Use the 'primary_datacenter' field instead.`}, }) run(t, testCase{ desc: "acl_replication_token enables acl replication", args: []string{`-data-dir=` + dataDir}, json: []string{`{ "acl_replication_token": "a" }`}, hcl: []string{`acl_replication_token = "a"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ACLTokens.ACLReplicationToken = "a" rt.ACLTokenReplication = true rt.DataDir = dataDir @@ -1656,10 +1656,10 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{`-data-dir=` + dataDir}, json: []string{`{ "acl_enforce_version_8": true }`}, hcl: []string{`acl_enforce_version_8 = true`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir }, - warns: []string{`config key "acl_enforce_version_8" is deprecated and should be removed`}, + expectedWarnings: []string{`config key "acl_enforce_version_8" is deprecated and should be removed`}, }) run(t, testCase{ @@ -1672,7 +1672,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { return nil, errors.New("some error") }, }, - err: "Error detecting private IPv4 address: some error", + expectedErr: "Error detecting private IPv4 address: some error", }) run(t, testCase{ desc: "advertise address detect none v4", @@ -1684,7 +1684,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { return nil, nil }, }, - err: "No private IPv4 address found", + expectedErr: "No private IPv4 address found", }) run(t, testCase{ desc: "advertise address detect multiple v4", @@ -1696,7 +1696,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { return []*net.IPAddr{ipAddr("1.1.1.1"), ipAddr("2.2.2.2")}, nil }, }, - err: "Multiple private IPv4 addresses found. Please configure one", + expectedErr: "Multiple private IPv4 addresses found. Please configure one", }) run(t, testCase{ desc: "advertise address detect fails v6", @@ -1708,7 +1708,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { return nil, errors.New("some error") }, }, - err: "Error detecting public IPv6 address: some error", + expectedErr: "Error detecting public IPv6 address: some error", }) run(t, testCase{ desc: "advertise address detect none v6", @@ -1720,7 +1720,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { return nil, nil }, }, - err: "No public IPv6 address found", + expectedErr: "No public IPv6 address found", }) run(t, testCase{ desc: "advertise address detect multiple v6", @@ -1732,14 +1732,14 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { return []*net.IPAddr{ipAddr("dead:beef::1"), ipAddr("dead:beef::2")}, nil }, }, - err: "Multiple public IPv6 addresses found. Please configure one", + expectedErr: "Multiple public IPv6 addresses found. Please configure one", }) run(t, testCase{ desc: "ae_interval is overridden by NonUserSource", args: []string{`-data-dir=` + dataDir}, json: []string{`{ "ae_interval": "-1s" }`}, hcl: []string{`ae_interval = "-1s"`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.AEInterval = time.Minute }, @@ -1750,10 +1750,10 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "acl_datacenter": "%" }`}, - hcl: []string{`acl_datacenter = "%"`}, - err: `acl_datacenter can only contain lowercase alphanumeric, - or _ characters.`, - warns: []string{`The 'acl_datacenter' field is deprecated. Use the 'primary_datacenter' field instead.`}, + json: []string{`{ "acl_datacenter": "%" }`}, + hcl: []string{`acl_datacenter = "%"`}, + expectedErr: `acl_datacenter can only contain lowercase alphanumeric, - or _ characters.`, + expectedWarnings: []string{`The 'acl_datacenter' field is deprecated. Use the 'primary_datacenter' field instead.`}, }) run(t, testCase{ desc: "autopilot.max_trailing_logs invalid", @@ -1761,30 +1761,30 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "autopilot": { "max_trailing_logs": -1 } }`}, - hcl: []string{`autopilot = { max_trailing_logs = -1 }`}, - err: "autopilot.max_trailing_logs cannot be -1. Must be greater than or equal to zero", + json: []string{`{ "autopilot": { "max_trailing_logs": -1 } }`}, + hcl: []string{`autopilot = { max_trailing_logs = -1 }`}, + expectedErr: "autopilot.max_trailing_logs cannot be -1. Must be greater than or equal to zero", }) run(t, testCase{ - desc: "bind_addr cannot be empty", - args: []string{`-data-dir=` + dataDir}, - json: []string{`{ "bind_addr": "" }`}, - hcl: []string{`bind_addr = ""`}, - err: "bind_addr cannot be empty", + desc: "bind_addr cannot be empty", + args: []string{`-data-dir=` + dataDir}, + json: []string{`{ "bind_addr": "" }`}, + hcl: []string{`bind_addr = ""`}, + expectedErr: "bind_addr cannot be empty", }) run(t, testCase{ - desc: "bind_addr does not allow multiple addresses", - args: []string{`-data-dir=` + dataDir}, - json: []string{`{ "bind_addr": "1.1.1.1 2.2.2.2" }`}, - hcl: []string{`bind_addr = "1.1.1.1 2.2.2.2"`}, - err: "bind_addr cannot contain multiple addresses", + desc: "bind_addr does not allow multiple addresses", + args: []string{`-data-dir=` + dataDir}, + json: []string{`{ "bind_addr": "1.1.1.1 2.2.2.2" }`}, + hcl: []string{`bind_addr = "1.1.1.1 2.2.2.2"`}, + expectedErr: "bind_addr cannot contain multiple addresses", }) run(t, testCase{ - desc: "bind_addr cannot be a unix socket", - args: []string{`-data-dir=` + dataDir}, - json: []string{`{ "bind_addr": "unix:///foo" }`}, - hcl: []string{`bind_addr = "unix:///foo"`}, - err: "bind_addr cannot be a unix socket", + desc: "bind_addr cannot be a unix socket", + args: []string{`-data-dir=` + dataDir}, + json: []string{`{ "bind_addr": "unix:///foo" }`}, + hcl: []string{`bind_addr = "unix:///foo"`}, + expectedErr: "bind_addr cannot be a unix socket", }) run(t, testCase{ desc: "bootstrap without server", @@ -1792,9 +1792,9 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "bootstrap": true }`}, - hcl: []string{`bootstrap = true`}, - err: "'bootstrap = true' requires 'server = true'", + json: []string{`{ "bootstrap": true }`}, + hcl: []string{`bootstrap = true`}, + expectedErr: "'bootstrap = true' requires 'server = true'", }) run(t, testCase{ desc: "bootstrap-expect without server", @@ -1802,9 +1802,9 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "bootstrap_expect": 3 }`}, - hcl: []string{`bootstrap_expect = 3`}, - err: "'bootstrap_expect > 0' requires 'server = true'", + json: []string{`{ "bootstrap_expect": 3 }`}, + hcl: []string{`bootstrap_expect = 3`}, + expectedErr: "'bootstrap_expect > 0' requires 'server = true'", }) run(t, testCase{ desc: "bootstrap-expect invalid", @@ -1812,9 +1812,9 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "bootstrap_expect": -1 }`}, - hcl: []string{`bootstrap_expect = -1`}, - err: "bootstrap_expect cannot be -1. Must be greater than or equal to zero", + json: []string{`{ "bootstrap_expect": -1 }`}, + hcl: []string{`bootstrap_expect = -1`}, + expectedErr: "bootstrap_expect cannot be -1. Must be greater than or equal to zero", }) run(t, testCase{ desc: "bootstrap-expect and dev mode", @@ -1823,9 +1823,9 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "bootstrap_expect": 3, "server": true }`}, - hcl: []string{`bootstrap_expect = 3 server = true`}, - err: "'bootstrap_expect > 0' not allowed in dev mode", + json: []string{`{ "bootstrap_expect": 3, "server": true }`}, + hcl: []string{`bootstrap_expect = 3 server = true`}, + expectedErr: "'bootstrap_expect > 0' not allowed in dev mode", }) run(t, testCase{ desc: "bootstrap-expect and bootstrap", @@ -1833,9 +1833,9 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "bootstrap": true, "bootstrap_expect": 3, "server": true }`}, - hcl: []string{`bootstrap = true bootstrap_expect = 3 server = true`}, - err: "'bootstrap_expect > 0' and 'bootstrap = true' are mutually exclusive", + json: []string{`{ "bootstrap": true, "bootstrap_expect": 3, "server": true }`}, + hcl: []string{`bootstrap = true bootstrap_expect = 3 server = true`}, + expectedErr: "'bootstrap_expect > 0' and 'bootstrap = true' are mutually exclusive", }) run(t, testCase{ desc: "bootstrap-expect=1 equals bootstrap", @@ -1844,7 +1844,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, json: []string{`{ "bootstrap_expect": 1, "server": true }`}, hcl: []string{`bootstrap_expect = 1 server = true`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Bootstrap = true rt.BootstrapExpect = 0 rt.LeaveOnTerm = false @@ -1852,7 +1852,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { rt.SkipLeaveOnInt = true rt.DataDir = dataDir }, - warns: []string{"BootstrapExpect is set to 1; this is the same as Bootstrap mode.", "bootstrap = true: do not enable unless necessary"}, + expectedWarnings: []string{"BootstrapExpect is set to 1; this is the same as Bootstrap mode.", "bootstrap = true: do not enable unless necessary"}, }) run(t, testCase{ desc: "bootstrap-expect=2 warning", @@ -1861,14 +1861,14 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, json: []string{`{ "bootstrap_expect": 2, "server": true }`}, hcl: []string{`bootstrap_expect = 2 server = true`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.BootstrapExpect = 2 rt.LeaveOnTerm = false rt.ServerMode = true rt.SkipLeaveOnInt = true rt.DataDir = dataDir }, - warns: []string{ + expectedWarnings: []string{ `bootstrap_expect = 2: A cluster with 2 servers will provide no failure tolerance. See https://www.consul.io/docs/internals/consensus.html#deployment-table`, `bootstrap_expect > 0: expecting 2 servers`, }, @@ -1880,14 +1880,14 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, json: []string{`{ "bootstrap_expect": 4, "server": true }`}, hcl: []string{`bootstrap_expect = 4 server = true`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.BootstrapExpect = 4 rt.LeaveOnTerm = false rt.ServerMode = true rt.SkipLeaveOnInt = true rt.DataDir = dataDir }, - warns: []string{ + expectedWarnings: []string{ `bootstrap_expect is even number: A cluster with an even number of servers does not achieve optimum fault tolerance. See https://www.consul.io/docs/internals/consensus.html#deployment-table`, `bootstrap_expect > 0: expecting 4 servers`, }, @@ -1899,7 +1899,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, json: []string{`{ "server": false }`}, hcl: []string{` server = false`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.LeaveOnTerm = true rt.ServerMode = false rt.SkipLeaveOnInt = false @@ -1912,16 +1912,16 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "client_addr": "unix:///foo" }`}, - hcl: []string{`client_addr = "unix:///foo"`}, - err: "client_addr cannot be a unix socket", + json: []string{`{ "client_addr": "unix:///foo" }`}, + hcl: []string{`client_addr = "unix:///foo"`}, + expectedErr: "client_addr cannot be a unix socket", }) run(t, testCase{ - desc: "datacenter invalid", - args: []string{`-data-dir=` + dataDir}, - json: []string{`{ "datacenter": "%" }`}, - hcl: []string{`datacenter = "%"`}, - err: `datacenter can only contain lowercase alphanumeric, - or _ characters.`, + desc: "datacenter invalid", + args: []string{`-data-dir=` + dataDir}, + json: []string{`{ "datacenter": "%" }`}, + hcl: []string{`datacenter = "%"`}, + expectedErr: `datacenter can only contain lowercase alphanumeric, - or _ characters.`, }) run(t, testCase{ desc: "dns does not allow socket", @@ -1929,9 +1929,9 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `-datacenter=a`, `-data-dir=` + dataDir, }, - json: []string{`{ "addresses": {"dns": "unix:///foo" } }`}, - hcl: []string{`addresses = { dns = "unix:///foo" }`}, - err: "DNS address cannot be a unix socket", + json: []string{`{ "addresses": {"dns": "unix:///foo" } }`}, + hcl: []string{`addresses = { dns = "unix:///foo" }`}, + expectedErr: "DNS address cannot be a unix socket", }) run(t, testCase{ desc: "ui enabled and dir specified", @@ -1941,7 +1941,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, json: []string{`{ "ui_config": { "enabled": true, "dir": "a" } }`}, hcl: []string{`ui_config { enabled = true dir = "a"}`}, - err: "Both the ui_config.enabled and ui_config.dir (or -ui and -ui-dir) were specified, please provide only one.\n" + + expectedErr: "Both the ui_config.enabled and ui_config.dir (or -ui and -ui-dir) were specified, please provide only one.\n" + "If trying to use your own web UI resources, use ui_config.dir or the -ui-dir flag.\n" + "The web UI is included in the binary so use ui_config.enabled or the -ui flag to enable it", }) @@ -1953,72 +1953,72 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "advertise_addr": "0.0.0.0" }`}, - hcl: []string{`advertise_addr = "0.0.0.0"`}, - err: "Advertise address cannot be 0.0.0.0, :: or [::]", + json: []string{`{ "advertise_addr": "0.0.0.0" }`}, + hcl: []string{`advertise_addr = "0.0.0.0"`}, + expectedErr: "Advertise address cannot be 0.0.0.0, :: or [::]", }) run(t, testCase{ desc: "advertise_addr_wan any", args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "advertise_addr_wan": "::" }`}, - hcl: []string{`advertise_addr_wan = "::"`}, - err: "Advertise WAN address cannot be 0.0.0.0, :: or [::]", + json: []string{`{ "advertise_addr_wan": "::" }`}, + hcl: []string{`advertise_addr_wan = "::"`}, + expectedErr: "Advertise WAN address cannot be 0.0.0.0, :: or [::]", }) run(t, testCase{ desc: "recursors any", args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "recursors": ["::"] }`}, - hcl: []string{`recursors = ["::"]`}, - err: "DNS recursor address cannot be 0.0.0.0, :: or [::]", + json: []string{`{ "recursors": ["::"] }`}, + hcl: []string{`recursors = ["::"]`}, + expectedErr: "DNS recursor address cannot be 0.0.0.0, :: or [::]", }) run(t, testCase{ desc: "dns_config.udp_answer_limit invalid", args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "dns_config": { "udp_answer_limit": -1 } }`}, - hcl: []string{`dns_config = { udp_answer_limit = -1 }`}, - err: "dns_config.udp_answer_limit cannot be -1. Must be greater than or equal to zero", + json: []string{`{ "dns_config": { "udp_answer_limit": -1 } }`}, + hcl: []string{`dns_config = { udp_answer_limit = -1 }`}, + expectedErr: "dns_config.udp_answer_limit cannot be -1. Must be greater than or equal to zero", }) run(t, testCase{ desc: "dns_config.a_record_limit invalid", args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "dns_config": { "a_record_limit": -1 } }`}, - hcl: []string{`dns_config = { a_record_limit = -1 }`}, - err: "dns_config.a_record_limit cannot be -1. Must be greater than or equal to zero", + json: []string{`{ "dns_config": { "a_record_limit": -1 } }`}, + hcl: []string{`dns_config = { a_record_limit = -1 }`}, + expectedErr: "dns_config.a_record_limit cannot be -1. Must be greater than or equal to zero", }) run(t, testCase{ desc: "performance.raft_multiplier < 0", args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "performance": { "raft_multiplier": -1 } }`}, - hcl: []string{`performance = { raft_multiplier = -1 }`}, - err: `performance.raft_multiplier cannot be -1. Must be between 1 and 10`, + json: []string{`{ "performance": { "raft_multiplier": -1 } }`}, + hcl: []string{`performance = { raft_multiplier = -1 }`}, + expectedErr: `performance.raft_multiplier cannot be -1. Must be between 1 and 10`, }) run(t, testCase{ desc: "performance.raft_multiplier == 0", args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "performance": { "raft_multiplier": 0 } }`}, - hcl: []string{`performance = { raft_multiplier = 0 }`}, - err: `performance.raft_multiplier cannot be 0. Must be between 1 and 10`, + json: []string{`{ "performance": { "raft_multiplier": 0 } }`}, + hcl: []string{`performance = { raft_multiplier = 0 }`}, + expectedErr: `performance.raft_multiplier cannot be 0. Must be between 1 and 10`, }) run(t, testCase{ desc: "performance.raft_multiplier > 10", args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "performance": { "raft_multiplier": 20 } }`}, - hcl: []string{`performance = { raft_multiplier = 20 }`}, - err: `performance.raft_multiplier cannot be 20. Must be between 1 and 10`, + json: []string{`{ "performance": { "raft_multiplier": 20 } }`}, + hcl: []string{`performance = { raft_multiplier = 20 }`}, + expectedErr: `performance.raft_multiplier cannot be 20. Must be between 1 and 10`, }) run(t, testCase{ desc: "node_name invalid", @@ -2029,7 +2029,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { opts: LoadOpts{ hostname: func() (string, error) { return "", nil }, }, - err: "node_name cannot be empty", + expectedErr: "node_name cannot be empty", }) run(t, testCase{ desc: "node_meta key too long", @@ -2044,7 +2044,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `dns_config = { udp_answer_limit = 1 }`, `node_meta = { "` + randomString(130) + `" = "a" }`, }, - err: "Key is too long (limit: 128 characters)", + expectedErr: "Key is too long (limit: 128 characters)", }) run(t, testCase{ desc: "node_meta value too long", @@ -2059,7 +2059,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `dns_config = { udp_answer_limit = 1 }`, `node_meta = { "a" = "` + randomString(520) + `" }`, }, - err: "Value is too long (limit: 512 characters)", + expectedErr: "Value is too long (limit: 512 characters)", }) run(t, testCase{ desc: "node_meta too many keys", @@ -2074,7 +2074,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `dns_config = { udp_answer_limit = 1 }`, `node_meta = {` + metaPairs(70, "hcl") + ` }`, }, - err: "Node metadata cannot contain more than 64 key/value pairs", + expectedErr: "Node metadata cannot contain more than 64 key/value pairs", }) run(t, testCase{ desc: "unique listeners dns vs http", @@ -2089,7 +2089,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { client_addr = "1.2.3.4" ports = { dns = 1000 http = 1000 } `}, - err: "HTTP address 1.2.3.4:1000 already configured for DNS", + expectedErr: "HTTP address 1.2.3.4:1000 already configured for DNS", }) run(t, testCase{ desc: "unique listeners dns vs https", @@ -2104,7 +2104,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { client_addr = "1.2.3.4" ports = { dns = 1000 https = 1000 } `}, - err: "HTTPS address 1.2.3.4:1000 already configured for DNS", + expectedErr: "HTTPS address 1.2.3.4:1000 already configured for DNS", }) run(t, testCase{ desc: "unique listeners http vs https", @@ -2119,7 +2119,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { client_addr = "1.2.3.4" ports = { http = 1000 https = 1000 } `}, - err: "HTTPS address 1.2.3.4:1000 already configured for HTTP", + expectedErr: "HTTPS address 1.2.3.4:1000 already configured for HTTP", }) run(t, testCase{ desc: "unique advertise addresses HTTP vs RPC", @@ -2134,7 +2134,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { addresses = { http = "10.0.0.1" } ports = { http = 1000 server = 1000 } `}, - err: "RPC Advertise address 10.0.0.1:1000 already configured for HTTP", + expectedErr: "RPC Advertise address 10.0.0.1:1000 already configured for HTTP", }) run(t, testCase{ desc: "unique advertise addresses RPC vs Serf LAN", @@ -2147,7 +2147,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` ports = { server = 1000 serf_lan = 1000 } `}, - err: "Serf Advertise LAN address 10.0.0.1:1000 already configured for RPC Advertise", + expectedErr: "Serf Advertise LAN address 10.0.0.1:1000 already configured for RPC Advertise", }) run(t, testCase{ desc: "unique advertise addresses RPC vs Serf WAN", @@ -2160,7 +2160,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` ports = { server = 1000 serf_wan = 1000 } `}, - err: "Serf Advertise WAN address 10.0.0.1:1000 already configured for RPC Advertise", + expectedErr: "Serf Advertise WAN address 10.0.0.1:1000 already configured for RPC Advertise", }) run(t, testCase{ desc: "http use_cache defaults to true", @@ -2173,7 +2173,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` http_config = {} `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.HTTPUseCache = true }, @@ -2189,7 +2189,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` http_config = { use_cache = true } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.HTTPUseCache = true }, @@ -2205,7 +2205,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` http_config = { use_cache = false } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.HTTPUseCache = false }, @@ -2237,7 +2237,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: "sidecar_service can't specify an ID", + expectedErr: "sidecar_service can't specify an ID", }) run(t, testCase{ desc: "sidecar_service can't have nested sidecar", @@ -2271,7 +2271,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: "sidecar_service can't have a nested sidecar_service", + expectedErr: "sidecar_service can't have a nested sidecar_service", }) run(t, testCase{ desc: "telemetry.prefix_filter cannot be empty", @@ -2284,10 +2284,10 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` telemetry = { prefix_filter = [""] } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir }, - warns: []string{"Cannot have empty filter rule in prefix_filter"}, + expectedWarnings: []string{"Cannot have empty filter rule in prefix_filter"}, }) run(t, testCase{ desc: "telemetry.prefix_filter must start with + or -", @@ -2300,21 +2300,21 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` telemetry = { prefix_filter = ["+foo", "-bar", "nix"] } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.Telemetry.AllowedPrefixes = []string{"foo"} rt.Telemetry.BlockedPrefixes = []string{"bar"} }, - warns: []string{`Filter rule must begin with either '+' or '-': "nix"`}, + expectedWarnings: []string{`Filter rule must begin with either '+' or '-': "nix"`}, }) run(t, testCase{ desc: "encrypt has invalid key", args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "encrypt": "this is not a valid key" }`}, - hcl: []string{` encrypt = "this is not a valid key" `}, - err: "encrypt has invalid key: illegal base64 data at input byte 4", + json: []string{`{ "encrypt": "this is not a valid key" }`}, + hcl: []string{` encrypt = "this is not a valid key" `}, + expectedErr: "encrypt has invalid key: illegal base64 data at input byte 4", }) run(t, testCase{ desc: "multiple check files", @@ -2329,7 +2329,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `check = { name = "a" args = ["/bin/true"] }`, `check = { name = "b" args = ["/bin/false"] }`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Checks = []*structs.CheckDefinition{ {Name: "a", ScriptArgs: []string{"/bin/true"}, OutputMaxSize: checks.DefaultBufSize}, {Name: "b", ScriptArgs: []string{"/bin/false"}, OutputMaxSize: checks.DefaultBufSize}, @@ -2348,7 +2348,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{ `check = { name = "a" grpc = "localhost:12345/foo", grpc_use_tls = true }`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Checks = []*structs.CheckDefinition{ {Name: "a", GRPC: "localhost:12345/foo", GRPCUseTLS: true, OutputMaxSize: checks.DefaultBufSize}, } @@ -2366,7 +2366,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{ `check = { name = "a", alias_service = "foo" }`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Checks = []*structs.CheckDefinition{ {Name: "a", AliasService: "foo", OutputMaxSize: checks.DefaultBufSize}, } @@ -2386,7 +2386,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { `service = { name = "a" port = 80 }`, `service = { name = "b" port = 90 meta={my="value"}, weights={passing=13}}`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Services = []*structs.ServiceDefinition{ { Name: "a", @@ -2420,7 +2420,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{ `service = { name = "a" port = 80, meta={` + randomString(520) + `="metaValue"} }`, }, - err: `Key is too long`, + expectedErr: `Key is too long`, }) run(t, testCase{ desc: "service with wrong meta: too long value", @@ -2433,7 +2433,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{ `service = { name = "a" port = 80, meta={a="` + randomString(520) + `"} }`, }, - err: `Value is too long`, + expectedErr: `Value is too long`, }) run(t, testCase{ desc: "service with wrong meta: too many meta", @@ -2446,7 +2446,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{ `service = { name = "a" port = 80 meta={` + metaPairs(70, "hcl") + `} }`, }, - err: `invalid meta for service a: Node metadata cannot contain more than 64 key`, + expectedErr: `invalid meta for service a: Node metadata cannot contain more than 64 key`, }) run(t, testCase{ desc: "translated keys", @@ -2495,7 +2495,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } }`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.Services = []*structs.ServiceDefinition{ { Name: "a", @@ -2537,7 +2537,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{ `snapshot_agent = { dont = "care" }`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir }, }) @@ -2621,7 +2621,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.Services = []*structs.ServiceDefinition{ { @@ -2750,7 +2750,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } }] `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.Services = []*structs.ServiceDefinition{ { @@ -2812,7 +2812,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` verify_server_hostname = true `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.VerifyServerHostname = true rt.VerifyOutgoing = true @@ -2833,7 +2833,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { auto_encrypt { allow_tls = true } server = true `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.VerifyIncoming = true rt.AutoEncryptAllowTLS = true @@ -2860,7 +2860,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { auto_encrypt { allow_tls = true } server = true `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.VerifyIncoming = true rt.AutoEncryptAllowTLS = true @@ -2887,7 +2887,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { auto_encrypt { allow_tls = true } server = true `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.VerifyIncomingRPC = true rt.AutoEncryptAllowTLS = true @@ -2912,8 +2912,8 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { auto_encrypt { allow_tls = true } server = true `}, - warns: []string{"if auto_encrypt.allow_tls is turned on, either verify_incoming or verify_incoming_rpc should be enabled. It is necessary to turn it off during a migration to TLS, but it should definitely be turned on afterwards."}, - patch: func(rt *RuntimeConfig) { + expectedWarnings: []string{"if auto_encrypt.allow_tls is turned on, either verify_incoming or verify_incoming_rpc should be enabled. It is necessary to turn it off during a migration to TLS, but it should definitely be turned on afterwards."}, + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.AutoEncryptAllowTLS = true rt.ConnectEnabled = true @@ -2934,8 +2934,8 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` rpc { enable_streaming = true } `}, - warns: []string{"rpc.enable_streaming = true has no effect when not running in server mode"}, - patch: func(rt *RuntimeConfig) { + expectedWarnings: []string{"rpc.enable_streaming = true has no effect when not running in server mode"}, + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir // rpc.enable_streaming make no sense in not-server mode rt.RPCConfig.EnableStreaming = true @@ -2955,8 +2955,8 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { use_streaming_backend = true server = true `}, - warns: []string{"use_streaming_backend = true requires rpc.enable_streaming on servers to work properly"}, - patch: func(rt *RuntimeConfig) { + expectedWarnings: []string{"use_streaming_backend = true requires rpc.enable_streaming on servers to work properly"}, + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.UseStreamingBackend = true // server things @@ -2978,7 +2978,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { auto_encrypt { allow_tls = true } server = false `}, - err: "auto_encrypt.allow_tls can only be used on a server.", + expectedErr: "auto_encrypt.allow_tls can only be used on a server.", }) run(t, testCase{ desc: "auto_encrypt.tls errors in server mode", @@ -2993,7 +2993,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { auto_encrypt { tls = true } server = true `}, - err: "auto_encrypt.tls can only be used on a client.", + expectedErr: "auto_encrypt.tls can only be used on a client.", }) run(t, testCase{ desc: "test connect vault provider configuration", @@ -3034,7 +3034,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConnectEnabled = true rt.ConnectCAProvider = "vault" @@ -3076,7 +3076,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConnectEnabled = true rt.ConnectCAProvider = "aws-pca" @@ -3109,7 +3109,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: "AWS PCA doesn't support certificates that are valid for less than 24 hours", + expectedErr: "AWS PCA doesn't support certificates that are valid for less than 24 hours", }) run(t, testCase{ desc: "Connect AWS CA provider EC key length validation", @@ -3134,7 +3134,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: "AWS PCA only supports P256 EC curve", + expectedErr: "AWS PCA only supports P256 EC curve", }) run(t, testCase{ desc: "connect.enable_mesh_gateway_wan_federation requires connect.enabled", @@ -3153,7 +3153,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { enable_mesh_gateway_wan_federation = true } `}, - err: "'connect.enable_mesh_gateway_wan_federation=true' requires 'connect.enabled=true'", + expectedErr: "'connect.enable_mesh_gateway_wan_federation=true' requires 'connect.enabled=true'", }) run(t, testCase{ desc: "connect.enable_mesh_gateway_wan_federation cannot use -join-wan", @@ -3179,7 +3179,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { enable_mesh_gateway_wan_federation = true } `}, - err: "'start_join_wan' is incompatible with 'connect.enable_mesh_gateway_wan_federation = true'", + expectedErr: "'start_join_wan' is incompatible with 'connect.enable_mesh_gateway_wan_federation = true'", }) run(t, testCase{ desc: "connect.enable_mesh_gateway_wan_federation cannot use -retry-join-wan", @@ -3205,7 +3205,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { enable_mesh_gateway_wan_federation = true } `}, - err: "'retry_join_wan' is incompatible with 'connect.enable_mesh_gateway_wan_federation = true'", + expectedErr: "'retry_join_wan' is incompatible with 'connect.enable_mesh_gateway_wan_federation = true'", }) run(t, testCase{ desc: "connect.enable_mesh_gateway_wan_federation requires server mode", @@ -3226,7 +3226,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { enable_mesh_gateway_wan_federation = true } `}, - err: "'connect.enable_mesh_gateway_wan_federation = true' requires 'server = true'", + expectedErr: "'connect.enable_mesh_gateway_wan_federation = true' requires 'server = true'", }) run(t, testCase{ desc: "connect.enable_mesh_gateway_wan_federation requires no slashes in node names", @@ -3249,7 +3249,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { enable_mesh_gateway_wan_federation = true } `}, - err: "'connect.enable_mesh_gateway_wan_federation = true' requires that 'node_name' not contain '/' characters", + expectedErr: "'connect.enable_mesh_gateway_wan_federation = true' requires that 'node_name' not contain '/' characters", }) run(t, testCase{ desc: "primary_gateways requires server mode", @@ -3264,7 +3264,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { server = false primary_gateways = [ "foo.local", "bar.local" ] `}, - err: "'primary_gateways' requires 'server = true'", + expectedErr: "'primary_gateways' requires 'server = true'", }) run(t, testCase{ desc: "primary_gateways only works in a secondary datacenter", @@ -3283,7 +3283,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { datacenter = "one" primary_gateways = [ "foo.local", "bar.local" ] `}, - err: "'primary_gateways' should only be configured in a secondary datacenter", + expectedErr: "'primary_gateways' should only be configured in a secondary datacenter", }) run(t, testCase{ desc: "connect.enable_mesh_gateway_wan_federation in secondary with primary_gateways configured", @@ -3310,7 +3310,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { enable_mesh_gateway_wan_federation = true } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.Datacenter = "two" rt.PrimaryDatacenter = "one" @@ -3346,7 +3346,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { foo = "bar" } }`}, - err: "config_entries.bootstrap[0]: Payload does not contain a kind/Kind", + expectedErr: "config_entries.bootstrap[0]: Payload does not contain a kind/Kind", }) run(t, testCase{ desc: "ConfigEntry bootstrap unknown kind", @@ -3370,7 +3370,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { baz = 1 } }`}, - err: "config_entries.bootstrap[0]: invalid config entry kind: foo", + expectedErr: "config_entries.bootstrap[0]: invalid config entry kind: foo", }) run(t, testCase{ desc: "ConfigEntry bootstrap invalid service-defaults", @@ -3394,7 +3394,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { made_up_key = "blah" } }`}, - err: "config_entries.bootstrap[0]: 1 error occurred:\n\t* invalid config key \"made_up_key\"\n\n", + expectedErr: "config_entries.bootstrap[0]: 1 error occurred:\n\t* invalid config key \"made_up_key\"\n\n", }) run(t, testCase{ desc: "ConfigEntry bootstrap proxy-defaults (snake-case)", @@ -3434,7 +3434,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } }`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConfigEntryBootstrap = []structs.ConfigEntry{ &structs.ProxyConfigEntry{ @@ -3492,7 +3492,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } }`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConfigEntryBootstrap = []structs.ConfigEntry{ &structs.ProxyConfigEntry{ @@ -3550,7 +3550,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } }`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConfigEntryBootstrap = []structs.ConfigEntry{ &structs.ServiceConfigEntry{ @@ -3608,7 +3608,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } }`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConfigEntryBootstrap = []structs.ConfigEntry{ &structs.ServiceConfigEntry{ @@ -3806,7 +3806,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { ] } }`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConfigEntryBootstrap = []structs.ConfigEntry{ &structs.ServiceRouterConfigEntry{ @@ -3965,7 +3965,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } `, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConfigEntryBootstrap = []structs.ConfigEntry{ &structs.ServiceIntentionsConfigEntry{ @@ -4042,7 +4042,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } `, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.ConfigEntryBootstrap = []structs.ConfigEntry{ &structs.ServiceIntentionsConfigEntry{ @@ -4071,7 +4071,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { args: []string{ `-data-dir=` + dataDir, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.DataDir = dataDir // Note that in the happy case this test will pass even if you comment // out all the stuff below since rt is also initialized from the @@ -4114,7 +4114,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "verify_outgoing": true }`}, - err: "both auto_encrypt.tls and auto_config.enabled cannot be set to true.", + expectedErr: "both auto_encrypt.tls and auto_config.enabled cannot be set to true.", }) run(t, testCase{ desc: "auto config not allowed for servers", @@ -4140,7 +4140,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "verify_outgoing": true }`}, - err: "auto_config.enabled cannot be set to true for server agents", + expectedErr: "auto_config.enabled cannot be set to true for server agents", }) run(t, testCase{ @@ -4163,7 +4163,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { "intro_token": "foo" } }`}, - err: "auto_config.enabled cannot be set without configuring TLS for server communications", + expectedErr: "auto_config.enabled cannot be set without configuring TLS for server communications", }) run(t, testCase{ @@ -4188,7 +4188,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } }`}, - err: "auto_config.authorization.enabled cannot be set without providing a TLS certificate for the server", + expectedErr: "auto_config.authorization.enabled cannot be set without providing a TLS certificate for the server", }) run(t, testCase{ @@ -4211,7 +4211,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "verify_outgoing": true }`}, - err: "One of auto_config.intro_token, auto_config.intro_token_file or the CONSUL_INTRO_TOKEN environment variable must be set to enable auto_config", + expectedErr: "One of auto_config.intro_token, auto_config.intro_token_file or the CONSUL_INTRO_TOKEN environment variable must be set to enable auto_config", }) run(t, testCase{ @@ -4234,7 +4234,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "verify_outgoing": true }`}, - err: "auto_config.enabled is set without providing a list of addresses", + expectedErr: "auto_config.enabled is set without providing a list of addresses", }) run(t, testCase{ @@ -4265,11 +4265,11 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "verify_outgoing": true }`}, - warns: []string{ + expectedWarnings: []string{ "Cannot parse ip \"invalid\" from auto_config.ip_sans", "Both an intro token and intro token file are set. The intro token will be used instead of the file", }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.ConnectEnabled = true rt.AutoConfig.Enabled = true rt.AutoConfig.IntroToken = "blah" @@ -4302,7 +4302,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } }`}, - err: "auto_config.authorization.enabled cannot be set to true for client agents", + expectedErr: "auto_config.authorization.enabled cannot be set to true for client agents", }) run(t, testCase{ @@ -4328,7 +4328,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "cert_file": "foo" }`}, - err: `auto_config.authorization.static has invalid configuration: exactly one of 'JWTValidationPubKeys', 'JWKSURL', or 'OIDCDiscoveryURL' must be set for type "jwt"`, + expectedErr: `auto_config.authorization.static has invalid configuration: exactly one of 'JWTValidationPubKeys', 'JWKSURL', or 'OIDCDiscoveryURL' must be set for type "jwt"`, }) run(t, testCase{ @@ -4362,7 +4362,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "cert_file": "foo" }`}, - err: `auto_config.authorization.static has invalid configuration: exactly one of 'JWTValidationPubKeys', 'JWKSURL', or 'OIDCDiscoveryURL' must be set for type "jwt"`, + expectedErr: `auto_config.authorization.static has invalid configuration: exactly one of 'JWTValidationPubKeys', 'JWKSURL', or 'OIDCDiscoveryURL' must be set for type "jwt"`, }) run(t, testCase{ @@ -4404,7 +4404,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "cert_file": "foo" }`}, - err: `Enabling auto-config authorization (auto_config.authorization.enabled) in non primary datacenters with ACLs enabled (acl.enabled) requires also enabling ACL token replication (acl.enable_token_replication)`, + expectedErr: `Enabling auto-config authorization (auto_config.authorization.enabled) in non primary datacenters with ACLs enabled (acl.enabled) requires also enabling ACL token replication (acl.enable_token_replication)`, }) run(t, testCase{ @@ -4442,7 +4442,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "cert_file": "foo" }`}, - err: `auto_config.authorization.static.claim_assertion "values.node == ${node}" is invalid: Selector "values" is not valid`, + expectedErr: `auto_config.authorization.static.claim_assertion "values.node == ${node}" is invalid: Selector "values" is not valid`, }) run(t, testCase{ desc: "auto config authorizer ok", @@ -4485,7 +4485,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { }, "cert_file": "foo" }`}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.AutoConfig.Authorizer.Enabled = true rt.AutoConfig.Authorizer.AuthMethod.Config["ClaimMappings"] = map[string]string{ "node": "node", @@ -4511,11 +4511,11 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { ui = true ui_content_path = "/bar" `}, - warns: []string{ + expectedWarnings: []string{ `The 'ui' field is deprecated. Use the 'ui_config.enabled' field instead.`, `The 'ui_content_path' field is deprecated. Use the 'ui_config.content_path' field instead.`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { // Should still work! rt.UIConfig.Enabled = true rt.UIConfig.ContentPath = "/bar/" @@ -4531,10 +4531,10 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { hcl: []string{` ui_dir = "/bar" `}, - warns: []string{ + expectedWarnings: []string{ `The 'ui_dir' field is deprecated. Use the 'ui_config.dir' field instead.`, }, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { // Should still work! rt.UIConfig.Dir = "/bar" rt.DataDir = dataDir @@ -4553,7 +4553,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { metrics_provider = "((((lisp 4 life))))" } `}, - err: `ui_config.metrics_provider can only contain lowercase alphanumeric, - or _ characters.`, + expectedErr: `ui_config.metrics_provider can only contain lowercase alphanumeric, - or _ characters.`, }) run(t, testCase{ desc: "metrics_provider_options_json invalid JSON", @@ -4568,7 +4568,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { metrics_provider_options_json = "not valid JSON" } `}, - err: `ui_config.metrics_provider_options_json must be empty or a string containing a valid JSON object.`, + expectedErr: `ui_config.metrics_provider_options_json must be empty or a string containing a valid JSON object.`, }) run(t, testCase{ desc: "metrics_provider_options_json not an object", @@ -4583,7 +4583,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { metrics_provider_options_json = "1.0" } `}, - err: `ui_config.metrics_provider_options_json must be empty or a string containing a valid JSON object.`, + expectedErr: `ui_config.metrics_provider_options_json must be empty or a string containing a valid JSON object.`, }) run(t, testCase{ desc: "metrics_proxy.base_url valid", @@ -4602,7 +4602,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.metrics_proxy.base_url must be a valid http or https URL.`, + expectedErr: `ui_config.metrics_proxy.base_url must be a valid http or https URL.`, }) run(t, testCase{ desc: "metrics_proxy.path_allowlist invalid (empty)", @@ -4621,7 +4621,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.metrics_proxy.path_allowlist: path "" is not an absolute path`, + expectedErr: `ui_config.metrics_proxy.path_allowlist: path "" is not an absolute path`, }) run(t, testCase{ desc: "metrics_proxy.path_allowlist invalid (relative)", @@ -4640,7 +4640,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.metrics_proxy.path_allowlist: path "bar/baz" is not an absolute path`, + expectedErr: `ui_config.metrics_proxy.path_allowlist: path "bar/baz" is not an absolute path`, }) run(t, testCase{ desc: "metrics_proxy.path_allowlist invalid (weird)", @@ -4659,7 +4659,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.metrics_proxy.path_allowlist: path "://bar/baz" is not an absolute path`, + expectedErr: `ui_config.metrics_proxy.path_allowlist: path "://bar/baz" is not an absolute path`, }) run(t, testCase{ desc: "metrics_proxy.path_allowlist invalid (fragment)", @@ -4678,7 +4678,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.metrics_proxy.path_allowlist: path "/bar/baz#stuff" is not an absolute path`, + expectedErr: `ui_config.metrics_proxy.path_allowlist: path "/bar/baz#stuff" is not an absolute path`, }) run(t, testCase{ desc: "metrics_proxy.path_allowlist invalid (querystring)", @@ -4697,7 +4697,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.metrics_proxy.path_allowlist: path "/bar/baz?stu=ff" is not an absolute path`, + expectedErr: `ui_config.metrics_proxy.path_allowlist: path "/bar/baz?stu=ff" is not an absolute path`, }) run(t, testCase{ desc: "metrics_proxy.path_allowlist invalid (encoded slash)", @@ -4716,7 +4716,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.metrics_proxy.path_allowlist: path "/bar%2fbaz" is not an absolute path`, + expectedErr: `ui_config.metrics_proxy.path_allowlist: path "/bar%2fbaz" is not an absolute path`, }) run(t, testCase{ desc: "metrics_proxy.path_allowlist ok", @@ -4735,7 +4735,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.UIConfig.MetricsProxy.PathAllowlist = []string{"/bar/baz", "/foo"} rt.DataDir = dataDir }, @@ -4753,7 +4753,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { metrics_provider = "prometheus" } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.UIConfig.MetricsProvider = "prometheus" rt.UIConfig.MetricsProxy.PathAllowlist = []string{ "/api/v1/query", @@ -4781,7 +4781,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - patch: func(rt *RuntimeConfig) { + expected: func(rt *RuntimeConfig) { rt.UIConfig.MetricsProvider = "prometheus" rt.UIConfig.MetricsProxy.PathAllowlist = []string{"/bar/baz", "/foo"} rt.DataDir = dataDir @@ -4804,7 +4804,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.metrics_proxy.base_url must be a valid http or https URL.`, + expectedErr: `ui_config.metrics_proxy.base_url must be a valid http or https URL.`, }) run(t, testCase{ desc: "dashboard_url_templates key format", @@ -4823,7 +4823,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.dashboard_url_templates key names can only contain lowercase alphanumeric, - or _ characters.`, + expectedErr: `ui_config.dashboard_url_templates key names can only contain lowercase alphanumeric, - or _ characters.`, }) run(t, testCase{ desc: "dashboard_url_templates value format", @@ -4842,7 +4842,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { } } `}, - err: `ui_config.dashboard_url_templates values must be a valid http or https URL.`, + expectedErr: `ui_config.dashboard_url_templates values must be a valid http or https URL.`, }) // Per node reconnect timeout test @@ -4859,7 +4859,7 @@ func TestLoad_IntegrationWithFlags(t *testing.T) { { "advertise_reconnect_timeout": "5s" }`}, - err: "advertise_reconnect_timeout can only be used on a client", + expectedErr: "advertise_reconnect_timeout can only be used on a client", }) } @@ -4869,8 +4869,8 @@ func (tc testCase) run(format string, dataDir string) func(t *testing.T) { os.RemoveAll(dataDir) os.MkdirAll(dataDir, 0755) - if tc.pre != nil { - tc.pre() + if tc.setup != nil { + tc.setup() } opts := tc.opts @@ -4896,17 +4896,17 @@ func (tc testCase) run(format string, dataDir string) func(t *testing.T) { // build/merge the config fragments actual, err := b.BuildAndValidate() switch { - case err == nil && tc.err != "": - t.Fatalf("got nil want error to contain %q", tc.err) - case err != nil && tc.err == "": + case err == nil && tc.expectedErr != "": + t.Fatalf("got nil want error to contain %q", tc.expectedErr) + case err != nil && tc.expectedErr == "": t.Fatalf("got error %s want nil", err) - case err != nil && tc.err != "" && !strings.Contains(err.Error(), tc.err): - t.Fatalf("error %q does not contain %q", err.Error(), tc.err) + case err != nil && tc.expectedErr != "" && !strings.Contains(err.Error(), tc.expectedErr): + t.Fatalf("error %q does not contain %q", err.Error(), tc.expectedErr) } - if tc.err != "" { + if tc.expectedErr != "" { return } - require.Equal(t, tc.warns, b.Warnings, "warnings") + require.Equal(t, tc.expectedWarnings, b.Warnings, "warnings") // build a default configuration, then patch the fields we expect to change // and compare it with the generated configuration. Since the expected @@ -4918,8 +4918,8 @@ func (tc testCase) run(format string, dataDir string) func(t *testing.T) { expected, err := x.Build() require.NoError(t, err) - if tc.patch != nil { - tc.patch(&expected) + if tc.expected != nil { + tc.expected(&expected) } // both DataDir fields should always be the same, so test for the diff --git a/agent/config/segment_oss_test.go b/agent/config/segment_oss_test.go index 351a6d48d..de224be85 100644 --- a/agent/config/segment_oss_test.go +++ b/agent/config/segment_oss_test.go @@ -18,10 +18,10 @@ func TestSegments(t *testing.T) { args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "server": true, "segment": "a" }`}, - hcl: []string{` server = true segment = "a" `}, - err: `Network segments are not supported in this version of Consul`, - warns: []string{ + json: []string{`{ "server": true, "segment": "a" }`}, + hcl: []string{` server = true segment = "a" `}, + expectedErr: `Network segments are not supported in this version of Consul`, + expectedWarnings: []string{ enterpriseConfigKeyError{key: "segment"}.Error(), }, }, @@ -30,10 +30,10 @@ func TestSegments(t *testing.T) { args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "segments":[{ "name":"x" }] }`}, - hcl: []string{`segments = [{ name = "x" }]`}, - err: `Port for segment "x" cannot be <= 0`, - warns: []string{ + json: []string{`{ "segments":[{ "name":"x" }] }`}, + hcl: []string{`segments = [{ name = "x" }]`}, + expectedErr: `Port for segment "x" cannot be <= 0`, + expectedWarnings: []string{ enterpriseConfigKeyError{key: "segments"}.Error(), }, }, @@ -42,10 +42,10 @@ func TestSegments(t *testing.T) { args: []string{ `-data-dir=` + dataDir, }, - json: []string{`{ "segments":[{ "name":"x", "port": 123 }] }`}, - hcl: []string{`segments = [{ name = "x" port = 123 }]`}, - err: `Network segments are not supported in this version of Consul`, - warns: []string{ + json: []string{`{ "segments":[{ "name":"x", "port": 123 }] }`}, + hcl: []string{`segments = [{ name = "x" port = 123 }]`}, + expectedErr: `Network segments are not supported in this version of Consul`, + expectedWarnings: []string{ enterpriseConfigKeyError{key: "segments"}.Error(), }, },