@ -17,18 +17,29 @@ import (
"errors"
"testing"
"github.com/prometheus/prometheus/util/testuti l"
"github.com/prometheus/common/mode l"
"gopkg.in/yaml.v2"
"github.com/prometheus/prometheus/util/testutil"
)
func TestTargetGroupStrictJsonUnmarshal ( t * testing . T ) {
tests := [ ] struct {
json string
expectedReply error
expectedGroup Group
} {
{
json : ` { "labels": { },"targets": []} ` ,
expectedReply : nil ,
expectedGroup : Group { Targets : [ ] model . LabelSet { } , Labels : model . LabelSet { } } ,
} ,
{
json : ` { "labels": { "my":"label"},"targets": ["localhost:9090","localhost:9091"]} ` ,
expectedReply : nil ,
expectedGroup : Group { Targets : [ ] model . LabelSet {
model . LabelSet { "__address__" : "localhost:9090" } ,
model . LabelSet { "__address__" : "localhost:9091" } } , Labels : model . LabelSet { "my" : "label" } } ,
} ,
{
json : ` { "label": { },"targets": []} ` ,
@ -39,15 +50,54 @@ func TestTargetGroupStrictJsonUnmarshal(t *testing.T) {
expectedReply : errors . New ( "json: unknown field \"target\"" ) ,
} ,
}
tg := Group { }
for _ , test := range tests {
tg := Group { }
actual := tg . UnmarshalJSON ( [ ] byte ( test . json ) )
testutil . Equals ( t , test . expectedReply , actual )
testutil . Equals ( t , test . expectedGroup , tg )
}
}
func TestTargetGroupYamlMarshal ( t * testing . T ) {
marshal := func ( g interface { } ) [ ] byte {
d , err := yaml . Marshal ( g )
if err != nil {
panic ( err )
}
return d
}
tests := [ ] struct {
expectedYaml string
expectetedErr error
group Group
} {
{
// labels should be omitted if empty.
group : Group { } ,
expectedYaml : "targets: []\n" ,
expectetedErr : nil ,
} ,
{
// targets only exposes addresses.
group : Group { Targets : [ ] model . LabelSet {
model . LabelSet { "__address__" : "localhost:9090" } ,
model . LabelSet { "__address__" : "localhost:9091" } } ,
Labels : model . LabelSet { "foo" : "bar" , "bar" : "baz" } } ,
expectedYaml : "targets:\n- localhost:9090\n- localhost:9091\nlabels:\n bar: baz\n foo: bar\n" ,
expectetedErr : nil ,
} ,
}
for _ , test := range tests {
actual , err := test . group . MarshalYAML ( )
testutil . Equals ( t , test . expectetedErr , err )
testutil . Equals ( t , test . expectedYaml , string ( marshal ( actual ) ) )
}
}
func TestTargetGroupYamlUnmarshal ( t * testing . T ) {
unmarshal := func ( d [ ] byte ) func ( interface { } ) error {
return func ( o interface { } ) error {
@ -55,28 +105,28 @@ func TestTargetGroupYamlUnmarshal(t *testing.T) {
}
}
tests := [ ] struct {
yaml string
expectedNumberOfTargets int
expectedNumberOfLabels int
expectedReply error
yaml string
expectedGroup Group
expectedReply error
} {
{
yaml : "labels:\ntargets:\n" ,
expectedNumberOfTargets : 0 ,
expectedNumberOfLabels : 0 ,
expectedReply : nil ,
// empty target group.
yaml : "labels:\ntargets:\n" ,
expectedGroup : Group { Targets : [ ] model . LabelSet { } } ,
expectedReply : nil ,
} ,
{
yaml : "labels:\n my: label\ntargets:\n ['localhost:9090', 'localhost:9191']" ,
expectedNumberOfTargets : 2 ,
expectedNumberOfLabels : 1 ,
expectedReply : nil ,
// brackets syntax.
yaml : "labels:\n my: label\ntargets:\n ['localhost:9090', 'localhost:9191']" ,
expectedReply : nil ,
expectedGroup : Group { Targets : [ ] model . LabelSet {
model . LabelSet { "__address__" : "localhost:9090" } ,
model . LabelSet { "__address__" : "localhost:9191" } } , Labels : model . LabelSet { "my" : "label" } } ,
} ,
{
yaml : "labels:\ntargets:\n 'localhost:9090'" ,
expectedNumberOfTargets : 0 ,
expectedNumberOfLabels : 0 ,
expectedReply : & yaml . TypeError { Errors : [ ] string { "line 3: cannot unmarshal !!str `localho...` into []string" } } ,
// incorrect syntax.
yaml : "labels:\ntargets:\n 'localhost:9090'" ,
expectedReply : & yaml . TypeError { Errors : [ ] string { "line 3: cannot unmarshal !!str `localho...` into []string" } } ,
} ,
}
@ -84,8 +134,24 @@ func TestTargetGroupYamlUnmarshal(t *testing.T) {
tg := Group { }
actual := tg . UnmarshalYAML ( unmarshal ( [ ] byte ( test . yaml ) ) )
testutil . Equals ( t , test . expectedReply , actual )
testutil . Equals ( t , test . expectedNumberOfTargets , len ( tg . Targets ) )
testutil . Equals ( t , test . expectedNumberOfLabels , len ( tg . Labels ) )
testutil . Equals ( t , test . expectedGroup , tg )
}
}
func TestString ( t * testing . T ) {
// String() should return only the source, regardless of other attributes.
group1 :=
Group { Targets : [ ] model . LabelSet {
model . LabelSet { "__address__" : "localhost:9090" } ,
model . LabelSet { "__address__" : "localhost:9091" } } ,
Source : "<source>" ,
Labels : model . LabelSet { "foo" : "bar" , "bar" : "baz" } }
group2 :=
Group { Targets : [ ] model . LabelSet { } ,
Source : "<source>" ,
Labels : model . LabelSet { } }
testutil . Equals ( t , "<source>" , group1 . String ( ) )
testutil . Equals ( t , "<source>" , group2 . String ( ) )
testutil . Equals ( t , group1 . String ( ) , group2 . String ( ) )
}