master
go 149 lines 4.73 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package main
4
5 import (
6 "os"
7 "path/filepath"
8 "testing"
9 "time"
10
11 "github.com/netdata/netdata/go/plugins/pkg/buildinfo"
12 "github.com/stretchr/testify/require"
13 )
14
15 func TestLoadConfigCustomFile(t *testing.T) {
16 tmpDir := t.TempDir()
17 cfgPath := filepath.Join(tmpDir, "topology-ip-intel.yaml")
18 err := os.WriteFile(cfgPath, []byte(`
19 sources:
20 - name: primary-asn
21 family: asn
22 provider: dbip
23 artifact: asn-lite
24 path: /tmp/asn.mmdb
25 - name: fallback-geo
26 family: geo
27 provider: dbip
28 artifact: city-lite
29 url: https://example.test/city.mmdb.gz
30 format: mmdb
31 output:
32 directory: /tmp/netdata-ip-intel
33 asn_file: asn.mmdb
34 geo_file: geo.mmdb
35 metadata_file: meta.json
36 policy:
37 localhost_cidrs: ["127.0.0.0/8"]
38 private_cidrs: ["10.0.0.0/8"]
39 interesting_cidrs: ["203.0.113.0/24"]
40 http:
41 timeout: 30s
42 user_agent: test-agent
43 `), 0o644)
44 require.NoError(t, err)
45
46 cfg, loadedPath, err := loadConfig(cfgPath)
47 require.NoError(t, err)
48 require.Equal(t, cfgPath, loadedPath)
49 require.Len(t, cfg.sources, 2)
50
51 require.Equal(t, "primary-asn", cfg.sources[0].name)
52 require.Equal(t, sourceFamilyASN, cfg.sources[0].family)
53 require.Equal(t, providerDBIP, cfg.sources[0].provider)
54 require.Equal(t, artifactDBIPASNLite, cfg.sources[0].artifact)
55 require.Equal(t, formatMMDB, cfg.sources[0].format)
56 require.Equal(t, "/tmp/asn.mmdb", cfg.sources[0].path)
57
58 require.Equal(t, "fallback-geo", cfg.sources[1].name)
59 require.Equal(t, sourceFamilyGeo, cfg.sources[1].family)
60 require.Equal(t, providerDBIP, cfg.sources[1].provider)
61 require.Equal(t, artifactDBIPCityLite, cfg.sources[1].artifact)
62 require.Equal(t, formatMMDB, cfg.sources[1].format)
63 require.Equal(t, "https://example.test/city.mmdb.gz", cfg.sources[1].url)
64
65 require.Equal(t, "/tmp/netdata-ip-intel", cfg.output.directory)
66 require.Equal(t, "asn.mmdb", cfg.output.asnFile)
67 require.Equal(t, "geo.mmdb", cfg.output.geoFile)
68 require.Equal(t, "meta.json", cfg.output.metadataFile)
69 require.Equal(t, []string{"127.0.0.0/8"}, cfg.policy.localhostCIDRs)
70 require.Equal(t, []string{"10.0.0.0/8"}, cfg.policy.privateCIDRs)
71 require.Equal(t, []string{"203.0.113.0/24"}, cfg.policy.interestingCIDRs)
72 require.Equal(t, 30*time.Second, cfg.http.timeout)
73 require.Equal(t, "test-agent", cfg.http.userAgent)
74 }
75
76 func TestDefaultConfigValidation(t *testing.T) {
77 cfg := defaultConfig()
78 require.NoError(t, cfg.validate())
79 require.Len(t, cfg.familySources(sourceFamilyASN), 1)
80 require.Len(t, cfg.familySources(sourceFamilyGeo), 1)
81 require.True(t, cfg.hasFamily(sourceFamilyASN))
82 require.True(t, cfg.hasFamily(sourceFamilyGeo))
83 }
84
85 func TestConfigValidationAllowsAllFamiliesDisabled(t *testing.T) {
86 cfg := defaultConfig()
87 cfg.sources = nil
88 require.NoError(t, cfg.validate())
89 require.False(t, cfg.hasFamily(sourceFamilyASN))
90 require.False(t, cfg.hasFamily(sourceFamilyGeo))
91 }
92
93 func TestDefaultConfigUsesBuildInfoCacheDir(t *testing.T) {
94 oldCacheDir := buildinfo.CacheDir
95 t.Cleanup(func() {
96 buildinfo.CacheDir = oldCacheDir
97 })
98
99 buildinfo.CacheDir = "/opt/netdata/var/cache/netdata"
100 cfg := defaultConfig()
101 require.Equal(t, "/opt/netdata/var/cache/netdata/topology-ip-intel", cfg.output.directory)
102 }
103
104 func TestDiscoverDefaultConfigPathUsesBuildInfoDirs(t *testing.T) {
105 oldUserConfigDir := buildinfo.UserConfigDir
106 oldStockConfigDir := buildinfo.StockConfigDir
107 t.Cleanup(func() {
108 buildinfo.UserConfigDir = oldUserConfigDir
109 buildinfo.StockConfigDir = oldStockConfigDir
110 })
111
112 root := t.TempDir()
113 userDir := filepath.Join(root, "opt", "netdata", "etc", "netdata")
114 stockDir := filepath.Join(root, "opt", "netdata", "usr", "lib", "netdata", "conf.d")
115 require.NoError(t, os.MkdirAll(userDir, 0o755))
116 require.NoError(t, os.MkdirAll(stockDir, 0o755))
117
118 userPath := filepath.Join(userDir, "topology-ip-intel.yaml")
119 stockPath := filepath.Join(stockDir, "topology-ip-intel.yaml")
120
121 buildinfo.UserConfigDir = userDir
122 buildinfo.StockConfigDir = stockDir
123
124 require.NoError(t, os.WriteFile(stockPath, []byte("output: {}\n"), 0o644))
125 require.Equal(t, stockPath, discoverDefaultConfigPath())
126
127 require.NoError(t, os.WriteFile(userPath, []byte("output: {}\n"), 0o644))
128 require.Equal(t, userPath, discoverDefaultConfigPath())
129 }
130
131 func TestInvalidOutputNamesRejected(t *testing.T) {
132 cfg := defaultConfig()
133 cfg.output.asnFile = "nested/asn.mmdb"
134 err := cfg.validate()
135 require.Error(t, err)
136 require.Contains(t, err.Error(), "output.asn_file")
137 }
138
139 func TestNormalizeSourceEntryInfersFormatFromPath(t *testing.T) {
140 source := sourceEntry{
141 family: sourceFamilyGeo,
142 provider: providerDBIP,
143 artifact: artifactDBIPCityLite,
144 path: "/tmp/dbip-city-lite.mmdb.gz",
145 }
146 require.NoError(t, normalizeSourceEntry(&source))
147 require.Equal(t, formatMMDB, source.format)
148 require.Equal(t, "dbip-city-lite", source.name)
149 }