master
go 161 lines 3.81 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package pipeline
4
5 import (
6 "encoding/json"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11 "gopkg.in/yaml.v2"
12 )
13
14 func TestDiscovererPayload_RoundTrip(t *testing.T) {
15 tests := map[string]struct {
16 input string
17 unmarshal func([]byte, *DiscovererPayload) error
18 marshal func(DiscovererPayload) ([]byte, error)
19 assertOut func(*testing.T, string)
20 wantType string
21 }{
22 "json": {
23 input: `{"docker":{"address":"unix:///var/run/docker.sock","timeout":"5s"}}`,
24 unmarshal: func(data []byte, p *DiscovererPayload) error {
25 return json.Unmarshal(data, p)
26 },
27 marshal: func(p DiscovererPayload) ([]byte, error) {
28 return json.Marshal(p)
29 },
30 wantType: "docker",
31 assertOut: func(t *testing.T, out string) {
32 assert.JSONEq(t, `{"docker":{"address":"unix:///var/run/docker.sock","timeout":"5s"}}`, out)
33 },
34 },
35 "yaml": {
36 input: "docker:\n address: unix:///var/run/docker.sock\n timeout: 5s\n",
37 unmarshal: func(data []byte, p *DiscovererPayload) error {
38 return yaml.Unmarshal(data, p)
39 },
40 marshal: func(p DiscovererPayload) ([]byte, error) {
41 return yaml.Marshal(p)
42 },
43 wantType: "docker",
44 assertOut: func(t *testing.T, out string) {
45 assert.Contains(t, out, "docker:")
46 assert.Contains(t, out, "address: unix:///var/run/docker.sock")
47 assert.Contains(t, out, "timeout: 5s")
48 },
49 },
50 }
51
52 for name, tc := range tests {
53 t.Run(name, func(t *testing.T) {
54 var p DiscovererPayload
55 require.NoError(t, tc.unmarshal([]byte(tc.input), &p))
56 require.Equal(t, tc.wantType, p.Type())
57
58 out, err := tc.marshal(p)
59 require.NoError(t, err)
60 tc.assertOut(t, string(out))
61 })
62 }
63 }
64
65 func TestDiscovererPayload_RejectsMultipleDiscoverers(t *testing.T) {
66 tests := map[string]struct {
67 input string
68 unmarshal func([]byte, *DiscovererPayload) error
69 }{
70 "json": {
71 input: `{"docker":{},"snmp":{}}`,
72 unmarshal: func(data []byte, p *DiscovererPayload) error {
73 return json.Unmarshal(data, p)
74 },
75 },
76 "yaml": {
77 input: "docker: {}\nsnmp: {}\n",
78 unmarshal: func(data []byte, p *DiscovererPayload) error {
79 return yaml.Unmarshal(data, p)
80 },
81 },
82 }
83
84 for name, tc := range tests {
85 t.Run(name, func(t *testing.T) {
86 var p DiscovererPayload
87 err := tc.unmarshal([]byte(tc.input), &p)
88 require.Error(t, err)
89 assert.Contains(t, err.Error(), "multiple discoverers configured")
90 })
91 }
92 }
93
94 func TestConfig_UnmarshalYAMLLegacyDiscover(t *testing.T) {
95 tests := map[string]struct {
96 input string
97 wantErr bool
98 wantErrContain []string
99 assertCfg func(*testing.T, Config)
100 }{
101 "k8s merge": {
102 input: `
103 name: test-k8s
104 discover:
105 - discoverer: k8s
106 k8s:
107 - role: pod
108 namespaces:
109 - default
110 - discoverer: k8s
111 k8s:
112 - role: service
113 services:
114 - id: "test-rule"
115 match: "true"
116 `,
117 assertCfg: func(t *testing.T, cfg Config) {
118 require.Equal(t, "k8s", cfg.Discoverer.Type())
119
120 var got []map[string]any
121 require.NoError(t, json.Unmarshal(cfg.Discoverer.Config, &got))
122 require.Len(t, got, 2)
123 assert.Equal(t, "pod", got[0]["role"])
124 assert.Equal(t, "service", got[1]["role"])
125 },
126 },
127 "missing discoverer config fails": {
128 input: `
129 name: test-invalid
130 discover:
131 - discoverer: docker
132 snmp: {}
133 services:
134 - id: "test-rule"
135 match: "true"
136 `,
137 wantErr: true,
138 wantErrContain: []string{"missing config for discoverer", "docker"},
139 },
140 }
141
142 for name, tc := range tests {
143 t.Run(name, func(t *testing.T) {
144 var cfg Config
145 err := yaml.Unmarshal([]byte(tc.input), &cfg)
146
147 if tc.wantErr {
148 require.Error(t, err)
149 for _, s := range tc.wantErrContain {
150 assert.Contains(t, err.Error(), s)
151 }
152 return
153 }
154
155 require.NoError(t, err)
156 if tc.assertCfg != nil {
157 tc.assertCfg(t, cfg)
158 }
159 })
160 }
161 }