config_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package presence
  2. import (
  3. "fmt"
  4. "net"
  5. "path/filepath"
  6. "testing"
  7. "time"
  8. "github.com/stretchr/testify/assert"
  9. mockwrap "douglasthrift.net/presence/wrap/mocks"
  10. )
  11. func TestParseConfig(t *testing.T) {
  12. cases := []struct {
  13. name, file string
  14. setup func(wNet *mockwrap.Net)
  15. config *Config
  16. err string
  17. }{
  18. {
  19. name: "success",
  20. file: "success.yml",
  21. setup: func(wNet *mockwrap.Net) {
  22. wNet.Mock.On("InterfaceByName", "eth0").Return(&net.Interface{}, nil)
  23. wNet.Mock.On("InterfaceByName", "eth1").Return(&net.Interface{}, nil)
  24. },
  25. config: &Config{
  26. Interval: 1 * time.Minute,
  27. Interfaces: []string{"eth0", "eth1"},
  28. MACAddresses: []string{"00:00:00:00:00:0a", "00:00:00:00:00:0b"},
  29. PingCount: 5,
  30. },
  31. },
  32. {
  33. name: "defaults",
  34. file: "defaults.yml",
  35. setup: func(wNet *mockwrap.Net) {
  36. wNet.Mock.On("Interfaces").Return([]net.Interface{{Name: "eth0"}, {Name: "eth1"}, {Name: "lo"}}, nil)
  37. },
  38. config: &Config{
  39. Interval: 30 * time.Second,
  40. Interfaces: []string{"eth0", "eth1", "lo"},
  41. MACAddresses: []string{"00:00:00:00:00:01", "00:00:00:00:00:02"},
  42. PingCount: 1,
  43. },
  44. },
  45. {
  46. name: "nonexistent file",
  47. file: "nonexistent.yml",
  48. err: "open tests/nonexistent.yml: no such file or directory",
  49. },
  50. {
  51. name: "wrong MAC encoding",
  52. file: "wrong_mac_encoding.yml",
  53. err: "yaml: unmarshal errors:\n line 2: cannot unmarshal !!seq into string",
  54. },
  55. {
  56. name: "bad MAC encoding",
  57. file: "bad_mac_encoding.yml",
  58. setup: func(wNet *mockwrap.Net) {
  59. wNet.Mock.On("Interfaces").Return([]net.Interface{{Name: "eth0"}, {Name: "eth1"}, {Name: "lo"}}, nil)
  60. },
  61. err: "address 00-00-00-00-00-0x: invalid MAC address",
  62. },
  63. {
  64. name: "negative interval",
  65. file: "negative_interval.yml",
  66. err: "negative interval (-1ns)",
  67. },
  68. {
  69. name: "error listing interfaces",
  70. file: "defaults.yml",
  71. setup: func(wNet *mockwrap.Net) {
  72. wNet.Mock.On("Interfaces").Return(nil, fmt.Errorf("no network interfaces"))
  73. },
  74. err: "no network interfaces",
  75. },
  76. {
  77. name: "error getting interface by name",
  78. file: "success.yml",
  79. setup: func(wNet *mockwrap.Net) {
  80. wNet.Mock.On("InterfaceByName", "eth0").Return(nil, fmt.Errorf("no such network interface"))
  81. },
  82. err: "interface eth0: no such network interface",
  83. },
  84. {
  85. name: "no MAC addresses",
  86. file: "no_mac_addresses.yml",
  87. setup: func(wNet *mockwrap.Net) {
  88. wNet.Mock.On("InterfaceByName", "eth0").Return(&net.Interface{}, nil)
  89. },
  90. err: "no MAC addresses",
  91. },
  92. {
  93. name: "duplicate MAC address",
  94. file: "duplicate_mac_address.yml",
  95. setup: func(wNet *mockwrap.Net) {
  96. wNet.Mock.On("InterfaceByName", "eth0").Return(&net.Interface{}, nil)
  97. },
  98. err: "duplicate MAC address (00:00:00:00:00:0e)",
  99. },
  100. }
  101. for _, tc := range cases {
  102. tc := tc
  103. t.Run(tc.name, func(t *testing.T) {
  104. t.Parallel()
  105. assert := assert.New(t)
  106. wNet := mockwrap.NewNet(t)
  107. if tc.setup != nil {
  108. tc.setup(wNet)
  109. }
  110. c, err := ParseConfig(filepath.Join("tests", tc.file), wNet)
  111. if tc.err != "" {
  112. assert.ErrorContains(err, tc.err)
  113. } else {
  114. assert.NoError(err)
  115. assert.Equal(tc.config, c)
  116. }
  117. })
  118. }
  119. }