mirror of https://github.com/hashicorp/consul
FFMMM
3 years ago
committed by
GitHub
2 changed files with 0 additions and 151 deletions
@ -1,99 +0,0 @@
|
||||
package lib |
||||
|
||||
import ( |
||||
"reflect" |
||||
"testing" |
||||
"time" |
||||
|
||||
"github.com/armon/go-metrics/prometheus" |
||||
|
||||
"github.com/stretchr/testify/require" |
||||
) |
||||
|
||||
func makeFullTelemetryConfig(t *testing.T) TelemetryConfig { |
||||
var ( |
||||
promOpts = prometheus.PrometheusOpts{} |
||||
strSliceVal = []string{"foo"} |
||||
strVal = "foo" |
||||
intVal = int64(1 * time.Second) |
||||
) |
||||
|
||||
cfg := TelemetryConfig{} |
||||
cfgP := reflect.ValueOf(&cfg) |
||||
cfgV := cfgP.Elem() |
||||
for i := 0; i < cfgV.NumField(); i++ { |
||||
f := cfgV.Field(i) |
||||
if !f.IsValid() || !f.CanSet() { |
||||
continue |
||||
} |
||||
// Set non-zero values for all fields. We only implement kinds that exist
|
||||
// now for brevity but will fail the test if a new field type is added since
|
||||
// this is likely not implemented in MergeDefaults either.
|
||||
switch f.Kind() { |
||||
case reflect.Struct: |
||||
if f.Type() != reflect.TypeOf(promOpts) { |
||||
t.Fatalf("unknown struct type in TelemetryConfig: actual %v, expected: %v", f.Type(), reflect.TypeOf(promOpts)) |
||||
} |
||||
// TODO(kit): This should delve into the fields and set them individually rather than using an empty struct
|
||||
f.Set(reflect.ValueOf(promOpts)) |
||||
case reflect.Slice: |
||||
if f.Type() != reflect.TypeOf(strSliceVal) { |
||||
t.Fatalf("unknown slice type in TelemetryConfig." + |
||||
" You need to update MergeDefaults and this test code.") |
||||
} |
||||
f.Set(reflect.ValueOf(strSliceVal)) |
||||
case reflect.Int, reflect.Int64: // time.Duration == int64
|
||||
f.SetInt(intVal) |
||||
case reflect.String: |
||||
f.SetString(strVal) |
||||
case reflect.Bool: |
||||
f.SetBool(true) |
||||
default: |
||||
t.Fatalf("unknown field type in TelemetryConfig" + |
||||
" You need to update MergeDefaults and this test code.") |
||||
} |
||||
} |
||||
return cfg |
||||
} |
||||
|
||||
func TestTelemetryConfig_MergeDefaults(t *testing.T) { |
||||
tests := []struct { |
||||
name string |
||||
cfg TelemetryConfig |
||||
defaults TelemetryConfig |
||||
want TelemetryConfig |
||||
}{ |
||||
{ |
||||
name: "basic merge", |
||||
cfg: TelemetryConfig{ |
||||
StatsiteAddr: "stats.it:4321", |
||||
}, |
||||
defaults: TelemetryConfig{ |
||||
StatsdAddr: "localhost:5678", |
||||
StatsiteAddr: "localhost:1234", |
||||
}, |
||||
want: TelemetryConfig{ |
||||
StatsdAddr: "localhost:5678", |
||||
StatsiteAddr: "stats.it:4321", |
||||
}, |
||||
}, |
||||
{ |
||||
// This test uses reflect to build a TelemetryConfig with every value set
|
||||
// to ensure that we exercise every possible field type. This means that
|
||||
// if new fields are added that are not supported types in the code, this
|
||||
// test should either ensure they work or fail to build the test case and
|
||||
// fail the test.
|
||||
name: "exhaustive", |
||||
cfg: TelemetryConfig{}, |
||||
defaults: makeFullTelemetryConfig(t), |
||||
want: makeFullTelemetryConfig(t), |
||||
}, |
||||
} |
||||
for _, tt := range tests { |
||||
t.Run(tt.name, func(t *testing.T) { |
||||
c := tt.cfg |
||||
c.MergeDefaults(&tt.defaults) |
||||
require.Equal(t, tt.want, c) |
||||
}) |
||||
} |
||||
} |
Loading…
Reference in new issue