github.com/influxdata/telegraf@v1.30.3/config/types_test.go (about) 1 package config_test 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/influxdata/telegraf" 10 "github.com/influxdata/telegraf/config" 11 "github.com/influxdata/telegraf/plugins/inputs" 12 "github.com/influxdata/telegraf/plugins/processors/reverse_dns" 13 ) 14 15 func TestConfigDuration(t *testing.T) { 16 c := config.NewConfig() 17 err := c.LoadConfigData([]byte(` 18 [[processors.reverse_dns]] 19 cache_ttl = "3h" 20 lookup_timeout = "17s" 21 max_parallel_lookups = 13 22 ordered = true 23 [[processors.reverse_dns.lookup]] 24 field = "source_ip" 25 dest = "source_name" 26 `)) 27 require.NoError(t, err) 28 require.Len(t, c.Processors, 1) 29 p := c.Processors[0].Processor.(*reverse_dns.ReverseDNS) 30 require.EqualValues(t, 3*time.Hour, p.CacheTTL) 31 require.EqualValues(t, 17*time.Second, p.LookupTimeout) 32 require.Equal(t, 13, p.MaxParallelLookups) 33 require.True(t, p.Ordered) 34 } 35 36 func TestDuration(t *testing.T) { 37 var d config.Duration 38 39 d = config.Duration(0) 40 require.NoError(t, d.UnmarshalText([]byte(`1s`))) 41 require.Equal(t, time.Second, time.Duration(d)) 42 43 d = config.Duration(0) 44 require.NoError(t, d.UnmarshalText([]byte(`10`))) 45 require.Equal(t, 10*time.Second, time.Duration(d)) 46 47 d = config.Duration(0) 48 require.NoError(t, d.UnmarshalText([]byte(`1.5`))) 49 require.Equal(t, 1500*time.Millisecond, time.Duration(d)) 50 51 d = config.Duration(0) 52 require.NoError(t, d.UnmarshalText([]byte(``))) 53 require.Equal(t, 0*time.Second, time.Duration(d)) 54 55 require.Error(t, d.UnmarshalText([]byte(`"1"`))) // string missing unit 56 require.Error(t, d.UnmarshalText([]byte(`'2'`))) // string missing unit 57 require.Error(t, d.UnmarshalText([]byte(`'ns'`))) // string missing time 58 require.Error(t, d.UnmarshalText([]byte(`'us'`))) // string missing time 59 } 60 61 func TestSize(t *testing.T) { 62 var s config.Size 63 64 require.NoError(t, s.UnmarshalText([]byte(`1B`))) 65 require.Equal(t, int64(1), int64(s)) 66 67 s = config.Size(0) 68 require.NoError(t, s.UnmarshalText([]byte(`1`))) 69 require.Equal(t, int64(1), int64(s)) 70 71 s = config.Size(0) 72 require.NoError(t, s.UnmarshalText([]byte(`1GB`))) 73 require.Equal(t, int64(1000*1000*1000), int64(s)) 74 75 s = config.Size(0) 76 require.NoError(t, s.UnmarshalText([]byte(`12GiB`))) 77 require.Equal(t, int64(12*1024*1024*1024), int64(s)) 78 } 79 80 func TestTOMLParsingStringDurations(t *testing.T) { 81 cfg := []byte(` 82 [[inputs.typesmockup]] 83 durations = [ 84 "1s", 85 '''1s''', 86 '1s', 87 "1.5s", 88 "", 89 '', 90 "2h", 91 "42m", 92 "100ms", 93 "100us", 94 "100ns", 95 "1d", 96 "7.5d", 97 "7d8h15m", 98 "3d7d", 99 "15m8h3.5d" 100 ] 101 `) 102 103 expected := []time.Duration{ 104 1 * time.Second, 105 1 * time.Second, 106 1 * time.Second, 107 1500 * time.Millisecond, 108 0, 109 0, 110 2 * time.Hour, 111 42 * time.Minute, 112 100 * time.Millisecond, 113 100 * time.Microsecond, 114 100 * time.Nanosecond, 115 24 * time.Hour, 116 7*24*time.Hour + 12*time.Hour, 117 7*24*time.Hour + 8*time.Hour + 15*time.Minute, 118 10 * 24 * time.Hour, 119 3*24*time.Hour + 12*time.Hour + 8*time.Hour + 15*time.Minute, 120 } 121 122 // Load the data 123 c := config.NewConfig() 124 err := c.LoadConfigData(cfg) 125 require.NoError(t, err) 126 require.Len(t, c.Inputs, 1) 127 plugin := c.Inputs[0].Input.(*MockupTypesPlugin) 128 129 require.Empty(t, plugin.Sizes) 130 require.Len(t, plugin.Durations, len(expected)) 131 for i, actual := range plugin.Durations { 132 require.EqualValuesf(t, expected[i], actual, "case %d failed", i) 133 } 134 } 135 136 func TestTOMLParsingIntegerDurations(t *testing.T) { 137 cfg := []byte(` 138 [[inputs.typesmockup]] 139 durations = [ 140 1, 141 10, 142 3601 143 ] 144 `) 145 146 expected := []time.Duration{ 147 1 * time.Second, 148 10 * time.Second, 149 3601 * time.Second, 150 } 151 152 // Load the data 153 c := config.NewConfig() 154 err := c.LoadConfigData(cfg) 155 require.NoError(t, err) 156 require.Len(t, c.Inputs, 1) 157 plugin := c.Inputs[0].Input.(*MockupTypesPlugin) 158 159 require.Empty(t, plugin.Sizes) 160 require.Len(t, plugin.Durations, len(expected)) 161 for i, actual := range plugin.Durations { 162 require.EqualValuesf(t, expected[i], actual, "case %d failed", i) 163 } 164 } 165 166 func TestTOMLParsingFloatDurations(t *testing.T) { 167 cfg := []byte(` 168 [[inputs.typesmockup]] 169 durations = [ 170 42.0, 171 1.5 172 ] 173 `) 174 175 expected := []time.Duration{ 176 42 * time.Second, 177 1500 * time.Millisecond, 178 } 179 180 // Load the data 181 c := config.NewConfig() 182 err := c.LoadConfigData(cfg) 183 require.NoError(t, err) 184 require.Len(t, c.Inputs, 1) 185 plugin := c.Inputs[0].Input.(*MockupTypesPlugin) 186 187 require.Empty(t, plugin.Sizes) 188 require.Len(t, plugin.Durations, len(expected)) 189 for i, actual := range plugin.Durations { 190 require.EqualValuesf(t, expected[i], actual, "case %d failed", i) 191 } 192 } 193 194 func TestTOMLParsingStringSizes(t *testing.T) { 195 cfg := []byte(` 196 [[inputs.typesmockup]] 197 sizes = [ 198 "1B", 199 "1", 200 '1', 201 '''15kB''', 202 """15KiB""", 203 "1GB", 204 "12GiB" 205 ] 206 `) 207 208 expected := []int64{ 209 1, 210 1, 211 1, 212 15 * 1000, 213 15 * 1024, 214 1000 * 1000 * 1000, 215 12 * 1024 * 1024 * 1024, 216 } 217 218 // Load the data 219 c := config.NewConfig() 220 err := c.LoadConfigData(cfg) 221 require.NoError(t, err) 222 require.Len(t, c.Inputs, 1) 223 plugin := c.Inputs[0].Input.(*MockupTypesPlugin) 224 225 require.Empty(t, plugin.Durations) 226 require.Len(t, plugin.Sizes, len(expected)) 227 for i, actual := range plugin.Sizes { 228 require.EqualValuesf(t, expected[i], actual, "case %d failed", i) 229 } 230 } 231 232 func TestTOMLParsingIntegerSizes(t *testing.T) { 233 cfg := []byte(` 234 [[inputs.typesmockup]] 235 sizes = [ 236 0, 237 1, 238 1000, 239 1024 240 ] 241 `) 242 243 expected := []int64{ 244 0, 245 1, 246 1000, 247 1024, 248 } 249 250 // Load the data 251 c := config.NewConfig() 252 err := c.LoadConfigData(cfg) 253 require.NoError(t, err) 254 require.Len(t, c.Inputs, 1) 255 plugin := c.Inputs[0].Input.(*MockupTypesPlugin) 256 257 require.Empty(t, plugin.Durations) 258 require.Len(t, plugin.Sizes, len(expected)) 259 for i, actual := range plugin.Sizes { 260 require.EqualValuesf(t, expected[i], actual, "case %d failed", i) 261 } 262 } 263 264 /*** Mockup (input) plugin for testing to avoid cyclic dependencies ***/ 265 type MockupTypesPlugin struct { 266 Durations []config.Duration `toml:"durations"` 267 Sizes []config.Size `toml:"sizes"` 268 } 269 270 func (*MockupTypesPlugin) SampleConfig() string { return "Mockup test types plugin" } 271 func (*MockupTypesPlugin) Gather(_ telegraf.Accumulator) error { return nil } 272 273 // Register the mockup plugin on loading 274 func init() { 275 // Register the mockup input plugin for the required names 276 inputs.Add("typesmockup", func() telegraf.Input { return &MockupTypesPlugin{} }) 277 }