Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/river/encoding/attribute_test.go
4095 views
1
package encoding
2
3
import (
4
"encoding/json"
5
"testing"
6
7
"github.com/grafana/agent/component/discovery"
8
"github.com/grafana/agent/pkg/river/internal/rivertags"
9
"github.com/grafana/agent/pkg/river/internal/value"
10
"github.com/stretchr/testify/require"
11
)
12
13
func TestSimple(t *testing.T) {
14
type t1 struct {
15
Age int `river:"age,attr"`
16
}
17
obj := &t1{
18
Age: 1,
19
}
20
reqString := `{"name":"age","type":"attr","value":{"type":"number","value":1}}`
21
val := value.Encode(obj)
22
tags := rivertags.Get(val.Reflect().Type())
23
require.Len(t, tags, 1)
24
25
af, err := newAttribute(value.Encode(obj.Age), tags[0])
26
require.NoError(t, err)
27
bb, err := json.Marshal(af)
28
require.NoError(t, err)
29
require.JSONEq(t, reqString, string(bb))
30
}
31
32
func TestSimpleZeroVal(t *testing.T) {
33
type t1 struct {
34
Age int `river:"age,attr"`
35
}
36
obj := &t1{
37
Age: 0,
38
}
39
reqString := `{"name":"age","type":"attr","value":{"type":"number","value":0}}`
40
val := value.Encode(obj)
41
tags := rivertags.Get(val.Reflect().Type())
42
require.Len(t, tags, 1)
43
44
af, err := newAttribute(value.Encode(obj.Age), tags[0])
45
require.NoError(t, err)
46
bb, err := json.Marshal(af)
47
require.NoError(t, err)
48
require.JSONEq(t, reqString, string(bb))
49
}
50
51
func TestNested(t *testing.T) {
52
type t1 struct {
53
Age int `river:"age,attr"`
54
}
55
type parent struct {
56
Person *t1 `river:"person,attr"`
57
}
58
reqString := `{"name":"person","type":"attr","value":{"type":"object","value":[{"value":{"type":"number","value":1},"key":"age"}]}}`
59
60
obj := &parent{Person: &t1{Age: 1}}
61
val := value.Encode(obj)
62
tags := rivertags.Get(val.Reflect().Type())
63
require.Len(t, tags, 1)
64
65
af, err := newAttribute(value.Encode(obj.Person), tags[0])
66
require.NoError(t, err)
67
bb, err := json.Marshal(af)
68
require.NoError(t, err)
69
require.JSONEq(t, reqString, string(bb))
70
}
71
72
func TestNestedZeroVal(t *testing.T) {
73
type t1 struct {
74
Age int `river:"age,attr"`
75
}
76
type parent struct {
77
Person *t1 `river:"person,attr"`
78
}
79
reqString := `{"name":"person","type":"attr","value":{"type":"object","value":[{"value":{"type":"number","value":0},"key":"age"}]}}`
80
81
obj := &parent{Person: &t1{Age: 0}}
82
val := value.Encode(obj)
83
tags := rivertags.Get(val.Reflect().Type())
84
require.Len(t, tags, 1)
85
86
af, err := newAttribute(value.Encode(obj.Person), tags[0])
87
require.NoError(t, err)
88
bb, err := json.Marshal(af)
89
require.NoError(t, err)
90
require.JSONEq(t, reqString, string(bb))
91
}
92
93
func TestDiscovery(t *testing.T) {
94
type t1 struct {
95
Targets []discovery.Target `river:"targets,attr"`
96
}
97
testObj := &t1{
98
Targets: make([]discovery.Target, 0),
99
}
100
testObj.Targets = append(testObj.Targets, discovery.Target{"t": "test"})
101
val := value.Encode(testObj)
102
tags := rivertags.Get(val.Reflect().Type())
103
attr, err := newAttribute(value.Encode(testObj.Targets), tags[0])
104
require.NoError(t, err)
105
require.True(t, attr.Name == "targets")
106
require.True(t, attr.hasValue())
107
}
108
109
func TestDiscoveryNil(t *testing.T) {
110
type t1 struct {
111
Targets []discovery.Target `river:"targets,attr"`
112
}
113
testObj := &t1{
114
Targets: make([]discovery.Target, 0),
115
}
116
val := value.Encode(testObj)
117
tags := rivertags.Get(val.Reflect().Type())
118
attr, err := newAttribute(value.Encode(testObj.Targets), tags[0])
119
require.NoError(t, err)
120
require.True(t, attr.Name == "targets")
121
require.False(t, attr.hasValue())
122
}
123
124