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  }