cluster_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package etcdserver
  2. import (
  3. "reflect"
  4. "testing"
  5. )
  6. func TestClusterFind(t *testing.T) {
  7. tests := []struct {
  8. id int64
  9. name string
  10. mems []Member
  11. match bool
  12. }{
  13. {
  14. 1,
  15. "node1",
  16. []Member{{Name: "node1", ID: 1}},
  17. true,
  18. },
  19. {
  20. 2,
  21. "foobar",
  22. []Member{},
  23. false,
  24. },
  25. {
  26. 2,
  27. "node2",
  28. []Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
  29. true,
  30. },
  31. {
  32. 3,
  33. "node3",
  34. []Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
  35. false,
  36. },
  37. }
  38. for i, tt := range tests {
  39. c := Cluster{}
  40. c.AddSlice(tt.mems)
  41. m := c.FindName(tt.name)
  42. if m == nil && !tt.match {
  43. continue
  44. }
  45. if m == nil && tt.match {
  46. t.Errorf("#%d: expected match got empty", i)
  47. }
  48. if m.Name != tt.name && tt.match {
  49. t.Errorf("#%d: got = %v, want %v", i, m.Name, tt.name)
  50. }
  51. }
  52. for i, tt := range tests {
  53. c := Cluster{}
  54. c.AddSlice(tt.mems)
  55. m := c.FindID(tt.id)
  56. if m == nil && !tt.match {
  57. continue
  58. }
  59. if m == nil && tt.match {
  60. t.Errorf("#%d: expected match got empty", i)
  61. }
  62. if m.ID != tt.id && tt.match {
  63. t.Errorf("#%d: got = %v, want %v", i, m.Name, tt.id)
  64. }
  65. }
  66. }
  67. func TestClusterSet(t *testing.T) {
  68. tests := []struct {
  69. f string
  70. mems []Member
  71. parse bool
  72. }{
  73. {
  74. "mem1=10.0.0.1:2379,mem1=128.193.4.20:2379,mem2=10.0.0.2:2379,default=127.0.0.1:2379",
  75. []Member{
  76. {ID: 3736794188555456841, Name: "mem1", PeerURLs: []string{"10.0.0.1:2379", "128.193.4.20:2379"}},
  77. {ID: 5674507346857578431, Name: "mem2", PeerURLs: []string{"10.0.0.2:2379"}},
  78. {ID: 2676999861503984872, Name: "default", PeerURLs: []string{"127.0.0.1:2379"}},
  79. },
  80. true,
  81. },
  82. }
  83. for i, tt := range tests {
  84. c := Cluster{}
  85. err := c.AddSlice(tt.mems)
  86. if err != nil {
  87. t.Error(err)
  88. }
  89. g := Cluster{}
  90. g.Set(tt.f)
  91. if g.String() != c.String() {
  92. t.Errorf("#%d: set = %v, want %v", i, g, c)
  93. }
  94. }
  95. }
  96. func TestClusterSetBad(t *testing.T) {
  97. tests := []string{
  98. "mem1=,mem2=128.193.4.20:2379,mem3=10.0.0.2:2379",
  99. "mem1,mem2=128.193.4.20:2379,mem3=10.0.0.2:2379",
  100. // TODO(philips): anyone know of a 64 bit sha1 hash collision
  101. // "06b2f82fd81b2c20=128.193.4.20:2379,02c60cb75083ceef=128.193.4.20:2379",
  102. }
  103. for i, tt := range tests {
  104. g := Cluster{}
  105. err := g.Set(tt)
  106. if err == nil {
  107. t.Errorf("#%d: set = %v, want err", i, tt)
  108. }
  109. }
  110. }
  111. func TestClusterAddBad(t *testing.T) {
  112. tests := []struct {
  113. mems []Member
  114. }{
  115. {
  116. []Member{
  117. {ID: 1, Name: "mem1"},
  118. {ID: 1, Name: "mem2"},
  119. },
  120. },
  121. }
  122. c := &Cluster{}
  123. c.Add(Member{ID: 1, Name: "mem1"})
  124. for i, tt := range tests {
  125. for _, m := range tt.mems {
  126. err := c.Add(m)
  127. if err == nil {
  128. t.Errorf("#%d: set = %v, want err", i, m)
  129. }
  130. }
  131. }
  132. }
  133. func TestClusterPeerURLs(t *testing.T) {
  134. tests := []struct {
  135. mems []Member
  136. wurls []string
  137. }{
  138. // single peer with a single address
  139. {
  140. mems: []Member{
  141. {ID: 1, PeerURLs: []string{"192.0.2.1"}},
  142. },
  143. wurls: []string{"http://192.0.2.1"},
  144. },
  145. // single peer with a single address with a port
  146. {
  147. mems: []Member{
  148. {ID: 1, PeerURLs: []string{"192.0.2.1:8001"}},
  149. },
  150. wurls: []string{"http://192.0.2.1:8001"},
  151. },
  152. // several members explicitly unsorted
  153. {
  154. mems: []Member{
  155. {ID: 2, PeerURLs: []string{"192.0.2.3", "192.0.2.4"}},
  156. {ID: 3, PeerURLs: []string{"192.0.2.5", "192.0.2.6"}},
  157. {ID: 1, PeerURLs: []string{"192.0.2.1", "192.0.2.2"}},
  158. },
  159. wurls: []string{"http://192.0.2.1", "http://192.0.2.2", "http://192.0.2.3", "http://192.0.2.4", "http://192.0.2.5", "http://192.0.2.6"},
  160. },
  161. // no members
  162. {
  163. mems: []Member{},
  164. wurls: []string{},
  165. },
  166. // peer with no peer urls
  167. {
  168. mems: []Member{
  169. {ID: 3, PeerURLs: []string{}},
  170. },
  171. wurls: []string{},
  172. },
  173. }
  174. for i, tt := range tests {
  175. c := Cluster{}
  176. if err := c.AddSlice(tt.mems); err != nil {
  177. t.Errorf("AddSlice error: %v", err)
  178. continue
  179. }
  180. urls := c.PeerURLs()
  181. if !reflect.DeepEqual(urls, tt.wurls) {
  182. t.Errorf("#%d: PeerURLs = %v, want %v", i, urls, tt.wurls)
  183. }
  184. }
  185. }
  186. func TestClusterClientURLs(t *testing.T) {
  187. tests := []struct {
  188. mems []Member
  189. wurls []string
  190. }{
  191. // single peer with a single address
  192. {
  193. mems: []Member{
  194. {ID: 1, ClientURLs: []string{"192.0.2.1"}},
  195. },
  196. wurls: []string{"http://192.0.2.1"},
  197. },
  198. // single peer with a single address with a port
  199. {
  200. mems: []Member{
  201. {ID: 1, ClientURLs: []string{"192.0.2.1:8001"}},
  202. },
  203. wurls: []string{"http://192.0.2.1:8001"},
  204. },
  205. // several members explicitly unsorted
  206. {
  207. mems: []Member{
  208. {ID: 2, ClientURLs: []string{"192.0.2.3", "192.0.2.4"}},
  209. {ID: 3, ClientURLs: []string{"192.0.2.5", "192.0.2.6"}},
  210. {ID: 1, ClientURLs: []string{"192.0.2.1", "192.0.2.2"}},
  211. },
  212. wurls: []string{"http://192.0.2.1", "http://192.0.2.2", "http://192.0.2.3", "http://192.0.2.4", "http://192.0.2.5", "http://192.0.2.6"},
  213. },
  214. // no members
  215. {
  216. mems: []Member{},
  217. wurls: []string{},
  218. },
  219. // peer with no client urls
  220. {
  221. mems: []Member{
  222. {ID: 3, ClientURLs: []string{}},
  223. },
  224. wurls: []string{},
  225. },
  226. }
  227. for i, tt := range tests {
  228. c := Cluster{}
  229. if err := c.AddSlice(tt.mems); err != nil {
  230. t.Errorf("AddSlice error: %v", err)
  231. continue
  232. }
  233. urls := c.ClientURLs()
  234. if !reflect.DeepEqual(urls, tt.wurls) {
  235. t.Errorf("#%d: ClientURLs = %v, want %v", i, urls, tt.wurls)
  236. }
  237. }
  238. }