/vendor/github.com/hashicorp/consul/agent/consul/util_test.go

https://github.com/dollarshaveclub/furan · Go · 405 lines · 362 code · 30 blank · 13 comment · 86 complexity · f3a5a43eb3258e3742ab10ff55952e9a MD5 · raw file

  1. package consul
  2. import (
  3. "errors"
  4. "fmt"
  5. "net"
  6. "regexp"
  7. "testing"
  8. "github.com/hashicorp/go-version"
  9. "github.com/hashicorp/serf/serf"
  10. )
  11. func TestGetPrivateIP(t *testing.T) {
  12. t.Parallel()
  13. ip, _, err := net.ParseCIDR("10.1.2.3/32")
  14. if err != nil {
  15. t.Fatalf("failed to parse private cidr: %v", err)
  16. }
  17. pubIP, _, err := net.ParseCIDR("8.8.8.8/32")
  18. if err != nil {
  19. t.Fatalf("failed to parse public cidr: %v", err)
  20. }
  21. tests := []struct {
  22. addrs []net.Addr
  23. expected net.IP
  24. err error
  25. }{
  26. {
  27. addrs: []net.Addr{
  28. &net.IPAddr{
  29. IP: ip,
  30. },
  31. &net.IPAddr{
  32. IP: pubIP,
  33. },
  34. },
  35. expected: ip,
  36. },
  37. {
  38. addrs: []net.Addr{
  39. &net.IPAddr{
  40. IP: pubIP,
  41. },
  42. },
  43. err: errors.New("No private IP address found"),
  44. },
  45. {
  46. addrs: []net.Addr{
  47. &net.IPAddr{
  48. IP: ip,
  49. },
  50. &net.IPAddr{
  51. IP: ip,
  52. },
  53. &net.IPAddr{
  54. IP: pubIP,
  55. },
  56. },
  57. err: errors.New("Multiple private IPs found. Please configure one."),
  58. },
  59. }
  60. for _, test := range tests {
  61. ip, err := getPrivateIP(test.addrs)
  62. switch {
  63. case test.err != nil && err != nil:
  64. if err.Error() != test.err.Error() {
  65. t.Fatalf("unexpected error: %v != %v", test.err, err)
  66. }
  67. case (test.err == nil && err != nil) || (test.err != nil && err == nil):
  68. t.Fatalf("unexpected error: %v != %v", test.err, err)
  69. default:
  70. if !test.expected.Equal(ip) {
  71. t.Fatalf("unexpected ip: %v != %v", ip, test.expected)
  72. }
  73. }
  74. }
  75. }
  76. func TestIsPrivateIP(t *testing.T) {
  77. t.Parallel()
  78. if !isPrivateIP("192.168.1.1") {
  79. t.Fatalf("bad")
  80. }
  81. if !isPrivateIP("172.16.45.100") {
  82. t.Fatalf("bad")
  83. }
  84. if !isPrivateIP("10.1.2.3") {
  85. t.Fatalf("bad")
  86. }
  87. if !isPrivateIP("100.115.110.19") {
  88. t.Fatalf("bad")
  89. }
  90. if isPrivateIP("8.8.8.8") {
  91. t.Fatalf("bad")
  92. }
  93. if !isPrivateIP("127.0.0.1") {
  94. t.Fatalf("bad")
  95. }
  96. }
  97. func TestUtil_CanServersUnderstandProtocol(t *testing.T) {
  98. t.Parallel()
  99. var members []serf.Member
  100. // All empty list cases should return false.
  101. for v := ProtocolVersionMin; v <= ProtocolVersionMax; v++ {
  102. grok, err := CanServersUnderstandProtocol(members, v)
  103. if err != nil {
  104. t.Fatalf("err: %v", err)
  105. }
  106. if grok {
  107. t.Fatalf("empty list should always return false")
  108. }
  109. }
  110. // Add a non-server member.
  111. members = append(members, serf.Member{
  112. Tags: map[string]string{
  113. "vsn_min": fmt.Sprintf("%d", ProtocolVersionMin),
  114. "vsn_max": fmt.Sprintf("%d", ProtocolVersionMax),
  115. },
  116. })
  117. // Make sure it doesn't get counted.
  118. for v := ProtocolVersionMin; v <= ProtocolVersionMax; v++ {
  119. grok, err := CanServersUnderstandProtocol(members, v)
  120. if err != nil {
  121. t.Fatalf("err: %v", err)
  122. }
  123. if grok {
  124. t.Fatalf("non-server members should not be counted")
  125. }
  126. }
  127. // Add a server member.
  128. members = append(members, serf.Member{
  129. Tags: map[string]string{
  130. "role": "consul",
  131. "vsn_min": fmt.Sprintf("%d", ProtocolVersionMin),
  132. "vsn_max": fmt.Sprintf("%d", ProtocolVersionMax),
  133. },
  134. })
  135. // Now it should report that it understands.
  136. for v := ProtocolVersionMin; v <= ProtocolVersionMax; v++ {
  137. grok, err := CanServersUnderstandProtocol(members, v)
  138. if err != nil {
  139. t.Fatalf("err: %v", err)
  140. }
  141. if !grok {
  142. t.Fatalf("server should grok")
  143. }
  144. }
  145. // Nobody should understand anything from the future.
  146. for v := uint8(ProtocolVersionMax + 1); v <= uint8(ProtocolVersionMax+10); v++ {
  147. grok, err := CanServersUnderstandProtocol(members, v)
  148. if err != nil {
  149. t.Fatalf("err: %v", err)
  150. }
  151. if grok {
  152. t.Fatalf("server should not grok")
  153. }
  154. }
  155. // Add an older server.
  156. members = append(members, serf.Member{
  157. Tags: map[string]string{
  158. "role": "consul",
  159. "vsn_min": fmt.Sprintf("%d", ProtocolVersionMin),
  160. "vsn_max": fmt.Sprintf("%d", ProtocolVersionMax-1),
  161. },
  162. })
  163. // The servers should no longer understand the max version.
  164. for v := ProtocolVersionMin; v <= ProtocolVersionMax; v++ {
  165. grok, err := CanServersUnderstandProtocol(members, v)
  166. if err != nil {
  167. t.Fatalf("err: %v", err)
  168. }
  169. expected := v < ProtocolVersionMax
  170. if grok != expected {
  171. t.Fatalf("bad: %v != %v", grok, expected)
  172. }
  173. }
  174. // Try a version that's too low for the minimum.
  175. {
  176. grok, err := CanServersUnderstandProtocol(members, 0)
  177. if err != nil {
  178. t.Fatalf("err: %v", err)
  179. }
  180. if grok {
  181. t.Fatalf("server should not grok")
  182. }
  183. }
  184. }
  185. func TestIsConsulNode(t *testing.T) {
  186. t.Parallel()
  187. m := serf.Member{
  188. Tags: map[string]string{
  189. "role": "node",
  190. "dc": "east-aws",
  191. },
  192. }
  193. valid, dc := isConsulNode(m)
  194. if !valid || dc != "east-aws" {
  195. t.Fatalf("bad: %v %v", valid, dc)
  196. }
  197. }
  198. func TestByteConversion(t *testing.T) {
  199. t.Parallel()
  200. var val uint64 = 2 << 50
  201. raw := uint64ToBytes(val)
  202. if bytesToUint64(raw) != val {
  203. t.Fatalf("no match")
  204. }
  205. }
  206. func TestGenerateUUID(t *testing.T) {
  207. t.Parallel()
  208. prev := generateUUID()
  209. for i := 0; i < 100; i++ {
  210. id := generateUUID()
  211. if prev == id {
  212. t.Fatalf("Should get a new ID!")
  213. }
  214. matched, err := regexp.MatchString(
  215. "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}", id)
  216. if !matched || err != nil {
  217. t.Fatalf("expected match %s %v %s", id, matched, err)
  218. }
  219. }
  220. }
  221. func TestGetPublicIPv6(t *testing.T) {
  222. t.Parallel()
  223. ip, _, err := net.ParseCIDR("fe80::1/128")
  224. if err != nil {
  225. t.Fatalf("failed to parse link-local cidr: %v", err)
  226. }
  227. ip2, _, err := net.ParseCIDR("::1/128")
  228. if err != nil {
  229. t.Fatalf("failed to parse loopback cidr: %v", err)
  230. }
  231. ip3, _, err := net.ParseCIDR("fc00::1/128")
  232. if err != nil {
  233. t.Fatalf("failed to parse ULA cidr: %v", err)
  234. }
  235. pubIP, _, err := net.ParseCIDR("2001:0db8:85a3::8a2e:0370:7334/128")
  236. if err != nil {
  237. t.Fatalf("failed to parse public cidr: %v", err)
  238. }
  239. tests := []struct {
  240. addrs []net.Addr
  241. expected net.IP
  242. err error
  243. }{
  244. {
  245. addrs: []net.Addr{
  246. &net.IPAddr{
  247. IP: ip,
  248. },
  249. &net.IPAddr{
  250. IP: ip2,
  251. },
  252. &net.IPAddr{
  253. IP: ip3,
  254. },
  255. &net.IPAddr{
  256. IP: pubIP,
  257. },
  258. },
  259. expected: pubIP,
  260. },
  261. {
  262. addrs: []net.Addr{
  263. &net.IPAddr{
  264. IP: ip,
  265. },
  266. &net.IPAddr{
  267. IP: ip2,
  268. },
  269. &net.IPAddr{
  270. IP: ip3,
  271. },
  272. },
  273. err: errors.New("No public IPv6 address found"),
  274. },
  275. {
  276. addrs: []net.Addr{
  277. &net.IPAddr{
  278. IP: ip,
  279. },
  280. &net.IPAddr{
  281. IP: ip,
  282. },
  283. &net.IPAddr{
  284. IP: pubIP,
  285. },
  286. &net.IPAddr{
  287. IP: pubIP,
  288. },
  289. },
  290. err: errors.New("Multiple public IPv6 addresses found. Please configure one."),
  291. },
  292. }
  293. for _, test := range tests {
  294. ip, err := getPublicIPv6(test.addrs)
  295. switch {
  296. case test.err != nil && err != nil:
  297. if err.Error() != test.err.Error() {
  298. t.Fatalf("unexpected error: %v != %v", test.err, err)
  299. }
  300. case (test.err == nil && err != nil) || (test.err != nil && err == nil):
  301. t.Fatalf("unexpected error: %v != %v", test.err, err)
  302. default:
  303. if !test.expected.Equal(ip) {
  304. t.Fatalf("unexpected ip: %v != %v", ip, test.expected)
  305. }
  306. }
  307. }
  308. }
  309. func TestServersMeetMinimumVersion(t *testing.T) {
  310. t.Parallel()
  311. makeMember := func(version string) serf.Member {
  312. return serf.Member{
  313. Name: "foo",
  314. Addr: net.IP([]byte{127, 0, 0, 1}),
  315. Tags: map[string]string{
  316. "role": "consul",
  317. "id": "asdf",
  318. "dc": "east-aws",
  319. "port": "10000",
  320. "build": version,
  321. "wan_join_port": "1234",
  322. "vsn": "1",
  323. "expect": "3",
  324. "raft_vsn": "3",
  325. },
  326. Status: serf.StatusAlive,
  327. }
  328. }
  329. cases := []struct {
  330. members []serf.Member
  331. ver *version.Version
  332. expected bool
  333. }{
  334. // One server, meets reqs
  335. {
  336. members: []serf.Member{
  337. makeMember("0.7.5"),
  338. },
  339. ver: version.Must(version.NewVersion("0.7.5")),
  340. expected: true,
  341. },
  342. // One server, doesn't meet reqs
  343. {
  344. members: []serf.Member{
  345. makeMember("0.7.5"),
  346. },
  347. ver: version.Must(version.NewVersion("0.8.0")),
  348. expected: false,
  349. },
  350. // Multiple servers, meets req version
  351. {
  352. members: []serf.Member{
  353. makeMember("0.7.5"),
  354. makeMember("0.8.0"),
  355. },
  356. ver: version.Must(version.NewVersion("0.7.5")),
  357. expected: true,
  358. },
  359. // Multiple servers, doesn't meet req version
  360. {
  361. members: []serf.Member{
  362. makeMember("0.7.5"),
  363. makeMember("0.8.0"),
  364. },
  365. ver: version.Must(version.NewVersion("0.8.0")),
  366. expected: false,
  367. },
  368. }
  369. for _, tc := range cases {
  370. result := ServersMeetMinimumVersion(tc.members, tc.ver)
  371. if result != tc.expected {
  372. t.Fatalf("bad: %v, %v, %v", result, tc.ver.String(), tc)
  373. }
  374. }
  375. }