Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/flow/internal/controller/value_cache_test.go
4095 views
1
package controller
2
3
import (
4
"testing"
5
6
"github.com/stretchr/testify/require"
7
)
8
9
type fooArgs struct {
10
Something bool `river:"something,attr"`
11
}
12
type fooExports struct {
13
SomethingElse bool `river:"something_else,attr"`
14
}
15
16
type barArgs struct {
17
Number int `river:"number,attr"`
18
}
19
20
func TestValueCache(t *testing.T) {
21
vc := newValueCache()
22
23
// Emulate values from the following River file:
24
//
25
// foo {
26
// something = true
27
//
28
// // Exported fields:
29
// // something_else = true
30
// }
31
//
32
// bar "label_a" {
33
// number = 12
34
// }
35
//
36
// bar "label_b" {
37
// number = 34
38
// }
39
//
40
// and expects to generate the equivalent to the following River object:
41
//
42
// {
43
// foo = {
44
// something_else = true,
45
// },
46
//
47
// bar = {
48
// label_a = {},
49
// label_b = {},
50
// }
51
// }
52
//
53
// For now, only exports are placed in generated objects, which is why the
54
// bar values are empty and the foo object only contains the exports.
55
56
vc.CacheArguments(ComponentID{"foo"}, fooArgs{Something: true})
57
vc.CacheExports(ComponentID{"foo"}, fooExports{SomethingElse: true})
58
vc.CacheArguments(ComponentID{"bar", "label_a"}, barArgs{Number: 12})
59
vc.CacheArguments(ComponentID{"bar", "label_b"}, barArgs{Number: 34})
60
61
res := vc.BuildContext()
62
63
var (
64
expectKeys = []string{"foo", "bar"}
65
actualKeys []string
66
)
67
for varName := range res.Variables {
68
actualKeys = append(actualKeys, varName)
69
}
70
require.ElementsMatch(t, expectKeys, actualKeys)
71
72
type object = map[string]interface{}
73
74
expectFoo := fooExports{SomethingElse: true}
75
expectBar := object{
76
"label_a": object{}, // no exports for bar
77
"label_b": object{}, // no exports for bar
78
}
79
require.Equal(t, expectFoo, res.Variables["foo"])
80
require.Equal(t, expectBar, res.Variables["bar"])
81
}
82
83
func TestExportValueCache(t *testing.T) {
84
vc := newValueCache()
85
vc.CacheModuleExportValue("t1", 1)
86
index := 0
87
require.True(t, vc.ExportChangeIndex() != index)
88
index = vc.ExportChangeIndex()
89
require.False(t, vc.ExportChangeIndex() != index)
90
91
vc.CacheModuleExportValue("t1", 2)
92
require.True(t, vc.ExportChangeIndex() != index)
93
index = vc.ExportChangeIndex()
94
require.False(t, vc.ExportChangeIndex() != index)
95
96
vc.CacheModuleExportValue("t1", 2)
97
require.False(t, vc.ExportChangeIndex() != index)
98
99
index = vc.ExportChangeIndex()
100
vc.CacheModuleExportValue("t2", "test")
101
require.True(t, vc.ExportChangeIndex() != index)
102
103
index = vc.ExportChangeIndex()
104
vc.ClearModuleExports()
105
require.True(t, vc.ExportChangeIndex() != index)
106
}
107
108
func TestModuleArgumentCache(t *testing.T) {
109
tt := []struct {
110
name string
111
argValue any
112
}{
113
{
114
name: "Nil",
115
argValue: nil,
116
},
117
{
118
name: "Number",
119
argValue: 1,
120
},
121
{
122
name: "String",
123
argValue: "string",
124
},
125
{
126
name: "Bool",
127
argValue: true,
128
},
129
{
130
name: "Map",
131
argValue: map[string]any{"test": "map"},
132
},
133
{
134
name: "Capsule",
135
argValue: fooExports{SomethingElse: true},
136
},
137
}
138
139
for _, tc := range tt {
140
t.Run(tc.name, func(t *testing.T) {
141
// Create and cache the argument
142
vc := newValueCache()
143
vc.CacheModuleArgument("arg", tc.argValue)
144
145
// Build the scope and validate it
146
res := vc.BuildContext()
147
expected := map[string]any{"arg": map[string]any{"value": tc.argValue}}
148
require.Equal(t, expected, res.Variables["argument"])
149
150
// Sync arguments where the arg shouldn't change
151
syncArgs := map[string]any{"arg": tc.argValue}
152
vc.SyncModuleArgs(syncArgs)
153
res = vc.BuildContext()
154
require.Equal(t, expected, res.Variables["argument"])
155
156
// Sync arguments where the arg should clear out
157
syncArgs = map[string]any{}
158
vc.SyncModuleArgs(syncArgs)
159
res = vc.BuildContext()
160
require.Equal(t, map[string]any{}, res.Variables)
161
})
162
}
163
}
164
165