Skip to content

Commit 6558395

Browse files
ruflinmergify-bot
authored andcommitted
[Elastic Agent] Golden files for program tests (#27862)
Currently it seems the expected config files for each program were manually generated. This makes adding a new test cumbersome and in case of small changes it means adjusting many files. This changes the test that it is possible to run with `go test . -generate` and new golden files are generated. Ideally it also means most of the additional tests become obsolete like how many program files should be generated. To make sure no left over files exist, on -generate all the generated files are first cleaned up. (cherry picked from commit d898e3d)
1 parent ab105e5 commit 6558395

25 files changed

Lines changed: 1741 additions & 0 deletions

x-pack/elastic-agent/pkg/agent/program/program_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package program
66

77
import (
8+
"flag"
89
"io/ioutil"
910
"os"
1011
"path/filepath"
@@ -21,6 +22,10 @@ import (
2122
"github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/transpiler"
2223
)
2324

25+
var (
26+
generateFlag = flag.Bool("generate", false, "Write golden files")
27+
)
28+
2429
func TestGroupBy(t *testing.T) {
2530
t.Run("only named output", func(t *testing.T) {
2631
sConfig := map[string]interface{}{
@@ -490,6 +495,81 @@ func TestConfiguration(t *testing.T) {
490495
}
491496
}
492497

498+
func TestUseCases(t *testing.T) {
499+
defer os.Remove("fleet.yml")
500+
501+
useCasesPath := filepath.Join("testdata", "usecases")
502+
useCases, err := filepath.Glob(filepath.Join(useCasesPath, "*.yml"))
503+
require.NoError(t, err)
504+
505+
generatedFilesDir := filepath.Join(useCasesPath, "generated")
506+
507+
// Cleanup all generated files to make sure not having any left overs
508+
if *generateFlag {
509+
err := os.RemoveAll(generatedFilesDir)
510+
require.NoError(t, err)
511+
}
512+
513+
for _, usecase := range useCases {
514+
t.Run(usecase, func(t *testing.T) {
515+
516+
useCaseName := strings.TrimSuffix(filepath.Base(usecase), ".yml")
517+
singleConfig, err := ioutil.ReadFile(usecase)
518+
require.NoError(t, err)
519+
520+
var m map[string]interface{}
521+
err = yaml.Unmarshal(singleConfig, &m)
522+
require.NoError(t, err)
523+
524+
ast, err := transpiler.NewAST(m)
525+
require.NoError(t, err)
526+
527+
programs, err := Programs(&fakeAgentInfo{}, ast)
528+
require.NoError(t, err)
529+
530+
require.Equal(t, 1, len(programs))
531+
532+
defPrograms, ok := programs["default"]
533+
require.True(t, ok)
534+
535+
for _, program := range defPrograms {
536+
generatedPath := filepath.Join(
537+
useCasesPath, "generated",
538+
useCaseName+"."+strings.ToLower(program.Spec.Cmd)+".golden.yml",
539+
)
540+
541+
compareMap := &transpiler.MapVisitor{}
542+
program.Config.Accept(compareMap)
543+
544+
// Generate new golden file for programm
545+
if *generateFlag {
546+
d, err := yaml.Marshal(&compareMap.Content)
547+
require.NoError(t, err)
548+
549+
err = os.MkdirAll(generatedFilesDir, 0755)
550+
require.NoError(t, err)
551+
err = ioutil.WriteFile(generatedPath, d, 0644)
552+
require.NoError(t, err)
553+
}
554+
555+
programConfig, err := ioutil.ReadFile(generatedPath)
556+
require.NoError(t, err)
557+
558+
var m map[string]interface{}
559+
err = yamltest.FromYAML(programConfig, &m)
560+
require.NoError(t, errors.Wrap(err, program.Cmd()))
561+
562+
if !assert.True(t, cmp.Equal(m, compareMap.Content)) {
563+
diff := cmp.Diff(m, compareMap.Content)
564+
if diff != "" {
565+
t.Errorf("%s-%s mismatch (-want +got):\n%s", usecase, program.Spec.Name, diff)
566+
}
567+
}
568+
}
569+
})
570+
}
571+
}
572+
493573
type fakeAgentInfo struct{}
494574

495575
func (*fakeAgentInfo) AgentID() string {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
inputs:
2+
- type: event/file
3+
streams:
4+
- paths:
5+
- /var/log/hello1.log
6+
- /var/log/hello2.log
7+
management:
8+
host: "localhost"
9+
config:
10+
reload: 123
11+
outputs:
12+
default:
13+
type: elasticsearch
14+
enabled: true
15+
hosts: [127.0.0.1:9200, 127.0.0.1:9300]
16+
username: elastic
17+
password: changeme
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Production Website DB Servers
2+
fleet:
3+
kibana_url: https://kibana.mydomain.com:5601
4+
ca_hash: 7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=
5+
checkin_interval: 5m
6+
inputs:
7+
- type: event/file
8+
streams:
9+
- enabled: true
10+
paths:
11+
- /var/log/hello1.log
12+
- /var/log/hello2.log
13+
management:
14+
host: "localhost"
15+
config:
16+
reload: 123
17+
outputs:
18+
default:
19+
type: elasticsearch
20+
hosts: [127.0.0.1:9200, 127.0.0.1:9300]
21+
username: elastic
22+
password: changeme
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
revision: 5
2+
name: Endpoint Host
3+
fleet:
4+
access_api_key: VuaCfGcBCdbkQm-e5aOx:ui2lp2axTNmsyakw9tvNnw
5+
protocol: https
6+
hosts: [ localhost:5601 ]
7+
timeout: 30s
8+
agent:
9+
id: fleet-agent-id
10+
logging.level: error
11+
host:
12+
id: host-agent-id
13+
14+
outputs:
15+
default:
16+
type: elasticsearch
17+
hosts: [127.0.0.1:9200, 127.0.0.1:9300]
18+
username: elastic
19+
password: changeme
20+
api_key: TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA
21+
ca_sha256: 7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=
22+
23+
inputs:
24+
- id: endpoint-id
25+
type: endpoint
26+
name: endpoint-1
27+
enabled: true
28+
package:
29+
name: endpoint
30+
version: 0.3.0
31+
data_stream:
32+
namespace: default
33+
artifact_manifest:
34+
schema_version: v22
35+
manifest_version: v21
36+
artifacts:
37+
- endpoint-allowlist-windows:
38+
sha256: 1234
39+
size: 2
40+
url: /relative/path/to/endpoint-allowlist-windows
41+
- endpoint-allowlist-macos:
42+
sha256: 1234
43+
size: 2
44+
url: /relative/path/to/endpoint-allowlist-macos
45+
- endpoint-allowlist-linux:
46+
sha256: 1234
47+
size: 2
48+
url: /relative/path/to/endpoint-allowlist-linux
49+
policy:
50+
linux:
51+
advanced:
52+
free-form: free-form-value
53+
indices:
54+
network: logs-endpoint.events.network-default
55+
file: logs-endpoint.events.file-default
56+
process: logs-endpoint.events.process-default
57+
metadata: metrics-endpoint.metadata-default
58+
policy: metrics-endpoint.policy-default
59+
telemetry: metrics-endpoint.telemetry-default
60+
logging:
61+
file: info
62+
stdout: debug
63+
events:
64+
process: true
65+
file: true
66+
network: true
67+
windows:
68+
malware:
69+
mode: prevent
70+
advanced:
71+
free-form: free-form-value
72+
indices:
73+
network: logs-endpoint.events.network-default
74+
file: logs-endpoint.events.file-default
75+
registry: logs-endpoint.events.registry-default
76+
process: logs-endpoint.events.process-default
77+
driver: logs-endpoint.events.driver-default
78+
library: logs-endpoint.events.library-default
79+
alerts: logs-endpoint.alerts-default
80+
metadata: metrics-endpoint.metadata-default
81+
policy: metrics-endpoint.policy-default
82+
telemetry: metrics-endpoint.telemetry-default
83+
logging:
84+
file: info
85+
stdout: debug
86+
events:
87+
registry: true
88+
process: true
89+
security: true
90+
file: true
91+
dns: false
92+
dll_and_driver_load: false
93+
network: true
94+
mac:
95+
malware:
96+
mode: prevent
97+
advanced:
98+
free-form: free-form-value
99+
indices:
100+
network: logs-endpoint.events.network-default
101+
file: logs-endpoint.events.file-default
102+
process: logs-endpoint.events.process-default
103+
alerts: logs-endpoint.alerts-default
104+
metadata: metrics-endpoint.metadata-default
105+
policy: metrics-endpoint.policy-default
106+
telemetry: metrics-endpoint.telemetry-default
107+
logging:
108+
file: info
109+
stdout: debug
110+
events:
111+
process: true
112+
file: true
113+
network: true
114+
runtime:
115+
arch: x86_64
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: Fleet Server Only
2+
fleet:
3+
enabled: true
4+
access_api_key: VuaCfGcBCdbkQm-e5aOx:ui2lp2axTNmsyakw9tvNnw
5+
protocol: https
6+
hosts: [ localhost:5601 ]
7+
timeout: 30s
8+
agent:
9+
id: fleet-agent-id
10+
logging.level: error
11+
host:
12+
id: host-agent-id
13+
server:
14+
host: 127.0.0.1
15+
port: 8822
16+
ssl:
17+
verification_mode: none
18+
policy:
19+
id: copy-policy-id
20+
output:
21+
elasticsearch:
22+
hosts: [ 127.0.0.1:9200, 127.0.0.1:9300 ]
23+
username: fleet
24+
password: fleetpassword
25+
26+
outputs:
27+
default:
28+
type: elasticsearch
29+
hosts: [127.0.0.1:9200, 127.0.0.1:9300]
30+
username: elastic
31+
password: changeme
32+
api_key: TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA
33+
ca_sha256: 7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=
34+
35+
inputs:
36+
- id: fleet-server-id
37+
type: fleet-server
38+
use_output: default
39+
data_stream:
40+
namespace: default
41+
name: fleet_server-1
42+
revision: 6
43+
server:
44+
host: 0.0.0.0
45+
port: 8220
46+
limits:
47+
max_connections: 40
48+
runtime:
49+
gc_percent: 50
50+
timeouts:
51+
read: 5m
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
filebeat:
2+
inputs:
3+
- index: logs-generic-default
4+
paths:
5+
- /var/log/hello1.log
6+
- /var/log/hello2.log
7+
processors:
8+
- add_fields:
9+
fields:
10+
dataset: generic
11+
namespace: default
12+
type: logs
13+
target: data_stream
14+
- add_fields:
15+
fields:
16+
dataset: generic
17+
target: event
18+
- add_fields:
19+
fields:
20+
id: agent-id
21+
snapshot: false
22+
version: 8.0.0
23+
target: elastic_agent
24+
- add_fields:
25+
fields:
26+
id: agent-id
27+
target: agent
28+
type: log
29+
output:
30+
elasticsearch:
31+
enabled: true
32+
headers:
33+
h1: test-header
34+
hosts:
35+
- 127.0.0.1:9200
36+
- 127.0.0.1:9300
37+
password: changeme
38+
username: elastic
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
filebeat:
2+
inputs:
3+
- enabled: true
4+
index: logs-generic-default
5+
paths:
6+
- /var/log/hello1.log
7+
- /var/log/hello2.log
8+
processors:
9+
- add_fields:
10+
fields:
11+
dataset: generic
12+
namespace: default
13+
type: logs
14+
target: data_stream
15+
- add_fields:
16+
fields:
17+
dataset: generic
18+
target: event
19+
- add_fields:
20+
fields:
21+
id: agent-id
22+
snapshot: false
23+
version: 8.0.0
24+
target: elastic_agent
25+
- add_fields:
26+
fields:
27+
id: agent-id
28+
target: agent
29+
type: log
30+
output:
31+
elasticsearch:
32+
headers:
33+
h1: test-header
34+
hosts:
35+
- 127.0.0.1:9200
36+
- 127.0.0.1:9300
37+
password: changeme
38+
username: elastic

0 commit comments

Comments
 (0)