dns_route53_test.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. // Copyright 2020 The go-ethereum Authors
  2. // This file is part of go-ethereum.
  3. //
  4. // go-ethereum is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // go-ethereum is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
  16. package main
  17. import (
  18. "reflect"
  19. "testing"
  20. "github.com/aws/aws-sdk-go-v2/service/route53/types"
  21. )
  22. // This test checks that computeChanges/splitChanges create DNS changes in
  23. // leaf-added -> root-changed -> leaf-deleted order.
  24. func TestRoute53ChangeSort(t *testing.T) {
  25. testTree0 := map[string]recordSet{
  26. "2kfjogvxdqtxxugbh7gs7naaai.n": {ttl: 3333, values: []string{
  27. `"enr:-HW4QO1ml1DdXLeZLsUxewnthhUy8eROqkDyoMTyavfks9JlYQIlMFEUoM78PovJDPQrAkrb3LRJ-""vtrymDguKCOIAWAgmlkgnY0iXNlY3AyNTZrMaEDffaGfJzgGhUif1JqFruZlYmA31HzathLSWxfbq_QoQ4"`,
  28. }},
  29. "fdxn3sn67na5dka4j2gok7bvqi.n": {ttl: treeNodeTTL, values: []string{`"enrtree-branch:"`}},
  30. "n": {ttl: rootTTL, values: []string{`"enrtree-root:v1 e=2KFJOGVXDQTXXUGBH7GS7NAAAI l=FDXN3SN67NA5DKA4J2GOK7BVQI seq=0 sig=v_-J_q_9ICQg5ztExFvLQhDBGMb0lZPJLhe3ts9LAcgqhOhtT3YFJsl8BWNDSwGtamUdR-9xl88_w-X42SVpjwE"`}},
  31. }
  32. testTree1 := map[string]string{
  33. "n": "enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA",
  34. "C7HRFPF3BLGF3YR4DY5KX3SMBE.n": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org",
  35. "JWXYDBPXYWG6FX3GMDIBFA6CJ4.n": "enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24",
  36. "2XS2367YHAXJFGLZHVAWLQD4ZY.n": "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA",
  37. "H4FHT4B454P6UXFD7JCYQ5PWDY.n": "enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI",
  38. "MHTDO6TMUBRIA2XWG5LUDACK24.n": "enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o",
  39. }
  40. wantChanges := []types.Change{
  41. {
  42. Action: "CREATE",
  43. ResourceRecordSet: &types.ResourceRecordSet{
  44. Name: sp("2xs2367yhaxjfglzhvawlqd4zy.n"),
  45. ResourceRecords: []types.ResourceRecord{{
  46. Value: sp(`"enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA"`),
  47. }},
  48. TTL: ip(treeNodeTTL),
  49. Type: "TXT",
  50. },
  51. },
  52. {
  53. Action: "CREATE",
  54. ResourceRecordSet: &types.ResourceRecordSet{
  55. Name: sp("c7hrfpf3blgf3yr4dy5kx3smbe.n"),
  56. ResourceRecords: []types.ResourceRecord{{
  57. Value: sp(`"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org"`),
  58. }},
  59. TTL: ip(treeNodeTTL),
  60. Type: "TXT",
  61. },
  62. },
  63. {
  64. Action: "CREATE",
  65. ResourceRecordSet: &types.ResourceRecordSet{
  66. Name: sp("h4fht4b454p6uxfd7jcyq5pwdy.n"),
  67. ResourceRecords: []types.ResourceRecord{{
  68. Value: sp(`"enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI"`),
  69. }},
  70. TTL: ip(treeNodeTTL),
  71. Type: "TXT",
  72. },
  73. },
  74. {
  75. Action: "CREATE",
  76. ResourceRecordSet: &types.ResourceRecordSet{
  77. Name: sp("jwxydbpxywg6fx3gmdibfa6cj4.n"),
  78. ResourceRecords: []types.ResourceRecord{{
  79. Value: sp(`"enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24"`),
  80. }},
  81. TTL: ip(treeNodeTTL),
  82. Type: "TXT",
  83. },
  84. },
  85. {
  86. Action: "CREATE",
  87. ResourceRecordSet: &types.ResourceRecordSet{
  88. Name: sp("mhtdo6tmubria2xwg5ludack24.n"),
  89. ResourceRecords: []types.ResourceRecord{{
  90. Value: sp(`"enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o"`),
  91. }},
  92. TTL: ip(treeNodeTTL),
  93. Type: "TXT",
  94. },
  95. },
  96. {
  97. Action: "UPSERT",
  98. ResourceRecordSet: &types.ResourceRecordSet{
  99. Name: sp("n"),
  100. ResourceRecords: []types.ResourceRecord{{
  101. Value: sp(`"enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA"`),
  102. }},
  103. TTL: ip(rootTTL),
  104. Type: "TXT",
  105. },
  106. },
  107. {
  108. Action: "DELETE",
  109. ResourceRecordSet: &types.ResourceRecordSet{
  110. Name: sp("2kfjogvxdqtxxugbh7gs7naaai.n"),
  111. ResourceRecords: []types.ResourceRecord{
  112. {Value: sp(`"enr:-HW4QO1ml1DdXLeZLsUxewnthhUy8eROqkDyoMTyavfks9JlYQIlMFEUoM78PovJDPQrAkrb3LRJ-""vtrymDguKCOIAWAgmlkgnY0iXNlY3AyNTZrMaEDffaGfJzgGhUif1JqFruZlYmA31HzathLSWxfbq_QoQ4"`)},
  113. },
  114. TTL: ip(3333),
  115. Type: "TXT",
  116. },
  117. },
  118. {
  119. Action: "DELETE",
  120. ResourceRecordSet: &types.ResourceRecordSet{
  121. Name: sp("fdxn3sn67na5dka4j2gok7bvqi.n"),
  122. ResourceRecords: []types.ResourceRecord{{
  123. Value: sp(`"enrtree-branch:"`),
  124. }},
  125. TTL: ip(treeNodeTTL),
  126. Type: "TXT",
  127. },
  128. },
  129. }
  130. var client route53Client
  131. changes := client.computeChanges("n", testTree1, testTree0)
  132. if !reflect.DeepEqual(changes, wantChanges) {
  133. t.Fatalf("wrong changes (got %d, want %d)", len(changes), len(wantChanges))
  134. }
  135. // Check splitting according to size.
  136. wantSplit := [][]types.Change{
  137. wantChanges[:4],
  138. wantChanges[4:6],
  139. wantChanges[6:],
  140. }
  141. split := splitChanges(changes, 600, 4000)
  142. if !reflect.DeepEqual(split, wantSplit) {
  143. t.Fatalf("wrong split batches: got %d, want %d", len(split), len(wantSplit))
  144. }
  145. // Check splitting according to count.
  146. wantSplit = [][]types.Change{
  147. wantChanges[:5],
  148. wantChanges[5:],
  149. }
  150. split = splitChanges(changes, 10000, 6)
  151. if !reflect.DeepEqual(split, wantSplit) {
  152. t.Fatalf("wrong split batches: got %d, want %d", len(split), len(wantSplit))
  153. }
  154. }
  155. // This test checks that computeChanges compares the quoted value of the records correctly.
  156. func TestRoute53NoChange(t *testing.T) {
  157. // Existing record set.
  158. testTree0 := map[string]recordSet{
  159. "n": {ttl: rootTTL, values: []string{
  160. `"enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA"`,
  161. }},
  162. "2xs2367yhaxjfglzhvawlqd4zy.n": {ttl: treeNodeTTL, values: []string{
  163. `"enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA"`,
  164. }},
  165. }
  166. // New set.
  167. testTree1 := map[string]string{
  168. "n": "enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA",
  169. "2XS2367YHAXJFGLZHVAWLQD4ZY.n": "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA",
  170. }
  171. var client route53Client
  172. changes := client.computeChanges("n", testTree1, testTree0)
  173. if len(changes) > 0 {
  174. t.Fatalf("wrong changes (got %d, want 0)", len(changes))
  175. }
  176. }
  177. func sp(s string) *string { return &s }
  178. func ip(i int64) *int64 { return &i }