cluster_store_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package etcdserver
  2. import (
  3. "reflect"
  4. "testing"
  5. "time"
  6. etcdErr "github.com/coreos/etcd/error"
  7. "github.com/coreos/etcd/store"
  8. )
  9. func TestClusterStoreAdd(t *testing.T) {
  10. st := &storeRecorder{}
  11. ps := &clusterStore{Store: st}
  12. ps.Add(Member{Name: "node", ID: 1})
  13. wactions := []action{
  14. {
  15. name: "Create",
  16. params: []interface{}{
  17. machineKVPrefix + "1",
  18. false,
  19. `{"ID":1,"Name":"node","PeerURLs":null,"ClientURLs":null}`,
  20. false,
  21. store.Permanent,
  22. },
  23. },
  24. }
  25. if g := st.Action(); !reflect.DeepEqual(g, wactions) {
  26. t.Error("actions = %v, want %v", g, wactions)
  27. }
  28. }
  29. func TestClusterStoreGet(t *testing.T) {
  30. tests := []struct {
  31. mems []Member
  32. wmems []Member
  33. }{
  34. {
  35. []Member{{Name: "node1", ID: 1}},
  36. []Member{{Name: "node1", ID: 1}},
  37. },
  38. {
  39. []Member{},
  40. []Member{},
  41. },
  42. {
  43. []Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
  44. []Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
  45. },
  46. {
  47. []Member{{Name: "node2", ID: 2}, {Name: "node1", ID: 1}},
  48. []Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
  49. },
  50. }
  51. for i, tt := range tests {
  52. c := Cluster{}
  53. err := c.AddSlice(tt.mems)
  54. if err != nil {
  55. t.Error(err)
  56. }
  57. cs := NewClusterStore(&getAllStore{}, c)
  58. if g := cs.Get(); !reflect.DeepEqual(g, c) {
  59. t.Errorf("#%d: mems = %v, want %v", i, g, c)
  60. }
  61. }
  62. }
  63. func TestClusterStoreDelete(t *testing.T) {
  64. st := &storeGetAllDeleteRecorder{}
  65. c := Cluster{}
  66. c.Add(Member{Name: "node", ID: 1})
  67. cs := NewClusterStore(st, c)
  68. cs.Remove(1)
  69. wdeletes := []string{machineKVPrefix + "1"}
  70. if !reflect.DeepEqual(st.deletes, wdeletes) {
  71. t.Error("deletes = %v, want %v", st.deletes, wdeletes)
  72. }
  73. }
  74. // simpleStore implements basic create and get.
  75. type simpleStore struct {
  76. storeRecorder
  77. st map[string]string
  78. }
  79. func (s *simpleStore) Create(key string, _ bool, value string, _ bool, _ time.Time) (*store.Event, error) {
  80. if s.st == nil {
  81. s.st = make(map[string]string)
  82. }
  83. s.st[key] = value
  84. return nil, nil
  85. }
  86. func (s *simpleStore) Get(key string, _, _ bool) (*store.Event, error) {
  87. val, ok := s.st[key]
  88. if !ok {
  89. return nil, etcdErr.NewError(etcdErr.EcodeKeyNotFound, "", 0)
  90. }
  91. ev := &store.Event{Node: &store.NodeExtern{Key: key, Value: stringp(val)}}
  92. return ev, nil
  93. }
  94. // getAllStore inherits simpleStore, and makes Get return all keys.
  95. type getAllStore struct {
  96. simpleStore
  97. }
  98. func (s *getAllStore) Get(_ string, _, _ bool) (*store.Event, error) {
  99. nodes := make([]*store.NodeExtern, 0)
  100. for k, v := range s.st {
  101. nodes = append(nodes, &store.NodeExtern{Key: k, Value: stringp(v)})
  102. }
  103. return &store.Event{Node: &store.NodeExtern{Nodes: nodes}}, nil
  104. }
  105. type storeDeleteRecorder struct {
  106. storeRecorder
  107. deletes []string
  108. }
  109. func (s *storeDeleteRecorder) Delete(key string, _, _ bool) (*store.Event, error) {
  110. s.deletes = append(s.deletes, key)
  111. return nil, nil
  112. }
  113. type storeGetAllDeleteRecorder struct {
  114. getAllStore
  115. deletes []string
  116. }
  117. func (s *storeGetAllDeleteRecorder) Delete(key string, _, _ bool) (*store.Event, error) {
  118. s.deletes = append(s.deletes, key)
  119. return nil, nil
  120. }