From 123a055242072bede7e00651ec08497ed819ca15 Mon Sep 17 00:00:00 2001 From: Calle Pettersson Date: Sat, 3 Aug 2019 14:39:28 +0200 Subject: [PATCH] Simple test of Perflib unmarshalling --- collector/perflib.go | 16 ++++- collector/perflib_test.go | 125 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 collector/perflib_test.go diff --git a/collector/perflib.go b/collector/perflib.go index 8abd5185..3b8af9fa 100644 --- a/collector/perflib.go +++ b/collector/perflib.go @@ -63,10 +63,14 @@ func unmarshalObject(obj *perflib.PerfObject, vs interface{}) error { ctr, found := counters[tag] if !found { - log.Debugf("missing counter %q, has %v", tag, counters) + log.Debugf("missing counter %q, have %v", tag, counterMapKeys(counters)) + continue } if !target.Field(i).CanSet() { - return fmt.Errorf("tagged field %v cannot be written to", f) + return fmt.Errorf("tagged field %v cannot be written to", f.Name) + } + if fieldType := target.Field(i).Type(); fieldType != reflect.TypeOf((*float64)(nil)).Elem() { + return fmt.Errorf("tagged field %v has wrong type %v, must be float64", f.Name, fieldType) } switch ctr.Def.CounterType { @@ -86,3 +90,11 @@ func unmarshalObject(obj *perflib.PerfObject, vs interface{}) error { return nil } + +func counterMapKeys(m map[string]*perflib.PerfCounter) []string { + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + return keys +} diff --git a/collector/perflib_test.go b/collector/perflib_test.go new file mode 100644 index 00000000..98f0693b --- /dev/null +++ b/collector/perflib_test.go @@ -0,0 +1,125 @@ +package collector + +import ( + "reflect" + "testing" + + perflibCollector "github.com/leoluk/perflib_exporter/collector" + "github.com/leoluk/perflib_exporter/perflib" +) + +type simple struct { + ValA float64 `perflib:"Something"` + ValB float64 `perflib:"Something Else"` +} + +func TestUnmarshalPerflib(t *testing.T) { + cases := []struct { + name string + obj *perflib.PerfObject + + expectedOutput []simple + expectError bool + }{ + { + name: "nil check", + obj: nil, + expectedOutput: []simple{}, + expectError: true, + }, + { + name: "Simple", + obj: &perflib.PerfObject{ + Instances: []*perflib.PerfInstance{ + { + Counters: []*perflib.PerfCounter{ + { + Def: &perflib.PerfCounterDef{ + Name: "Something", + CounterType: perflibCollector.PERF_COUNTER_COUNTER, + }, + Value: 123, + }, + }, + }, + }, + }, + expectedOutput: []simple{{ValA: 123}}, + expectError: false, + }, + { + name: "Multiple properties", + obj: &perflib.PerfObject{ + Instances: []*perflib.PerfInstance{ + { + Counters: []*perflib.PerfCounter{ + { + Def: &perflib.PerfCounterDef{ + Name: "Something", + CounterType: perflibCollector.PERF_COUNTER_COUNTER, + }, + Value: 123, + }, + { + Def: &perflib.PerfCounterDef{ + Name: "Something Else", + CounterType: perflibCollector.PERF_COUNTER_COUNTER, + }, + Value: 256, + }, + }, + }, + }, + }, + expectedOutput: []simple{{ValA: 123, ValB: 256}}, + expectError: false, + }, + { + name: "Multiple instances", + obj: &perflib.PerfObject{ + Instances: []*perflib.PerfInstance{ + { + Counters: []*perflib.PerfCounter{ + { + Def: &perflib.PerfCounterDef{ + Name: "Something", + CounterType: perflibCollector.PERF_COUNTER_COUNTER, + }, + Value: 321, + }, + }, + }, + { + Counters: []*perflib.PerfCounter{ + { + Def: &perflib.PerfCounterDef{ + Name: "Something", + CounterType: perflibCollector.PERF_COUNTER_COUNTER, + }, + Value: 231, + }, + }, + }, + }, + }, + expectedOutput: []simple{{ValA: 321}, {ValA: 231}}, + expectError: false, + }, + } + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + output := make([]simple, 0) + err := unmarshalObject(c.obj, &output) + if err != nil && !c.expectError { + t.Errorf("Did not expect error, got %q", err) + } + if err == nil && c.expectError { + t.Errorf("Expected an error, but got ok") + } + + if err == nil && !reflect.DeepEqual(output, c.expectedOutput) { + t.Errorf("Output mismatch, expected %+v, got %+v", c.expectedOutput, output) + } + }) + } +}