cluster_store_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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 TestClusterStoreGet(t *testing.T) {
  10. tests := []struct {
  11. mems []Member
  12. wmems []Member
  13. }{
  14. {
  15. []Member{{Name: "node1", ID: 1}},
  16. []Member{{Name: "node1", ID: 1}},
  17. },
  18. {
  19. []Member{},
  20. []Member{},
  21. },
  22. {
  23. []Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
  24. []Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
  25. },
  26. {
  27. []Member{{Name: "node2", ID: 2}, {Name: "node1", ID: 1}},
  28. []Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
  29. },
  30. }
  31. for i, tt := range tests {
  32. c := Cluster{}
  33. err := c.AddSlice(tt.mems)
  34. if err != nil {
  35. t.Error(err)
  36. }
  37. cs := NewClusterStore(&getAllStore{}, c)
  38. if g := cs.Get(); !reflect.DeepEqual(g, c) {
  39. t.Errorf("#%d: mems = %v, want %v", i, g, c)
  40. }
  41. }
  42. }
  43. func TestClusterStoreDelete(t *testing.T) {
  44. st := &storeGetAllDeleteRecorder{}
  45. c := Cluster{}
  46. c.Add(Member{Name: "node", ID: 1})
  47. cs := NewClusterStore(st, c)
  48. cs.Delete(1)
  49. wdeletes := []string{machineKVPrefix + "1"}
  50. if !reflect.DeepEqual(st.deletes, wdeletes) {
  51. t.Error("deletes = %v, want %v", st.deletes, wdeletes)
  52. }
  53. }
  54. // simpleStore implements basic create and get.
  55. type simpleStore struct {
  56. storeRecorder
  57. st map[string]string
  58. }
  59. func (s *simpleStore) Create(key string, _ bool, value string, _ bool, _ time.Time) (*store.Event, error) {
  60. if s.st == nil {
  61. s.st = make(map[string]string)
  62. }
  63. s.st[key] = value
  64. return nil, nil
  65. }
  66. func (s *simpleStore) Get(key string, _, _ bool) (*store.Event, error) {
  67. val, ok := s.st[key]
  68. if !ok {
  69. return nil, etcdErr.NewError(etcdErr.EcodeKeyNotFound, "", 0)
  70. }
  71. ev := &store.Event{Node: &store.NodeExtern{Key: key, Value: stringp(val)}}
  72. return ev, nil
  73. }
  74. // getAllStore inherits simpleStore, and makes Get return all keys.
  75. type getAllStore struct {
  76. simpleStore
  77. }
  78. func (s *getAllStore) Get(_ string, _, _ bool) (*store.Event, error) {
  79. nodes := make([]*store.NodeExtern, 0)
  80. for k, v := range s.st {
  81. nodes = append(nodes, &store.NodeExtern{Key: k, Value: stringp(v)})
  82. }
  83. return &store.Event{Node: &store.NodeExtern{Nodes: nodes}}, nil
  84. }
  85. type storeDeleteRecorder struct {
  86. storeRecorder
  87. deletes []string
  88. }
  89. func (s *storeDeleteRecorder) Delete(key string, _, _ bool) (*store.Event, error) {
  90. s.deletes = append(s.deletes, key)
  91. return nil, nil
  92. }
  93. type storeGetAllDeleteRecorder struct {
  94. getAllStore
  95. deletes []string
  96. }
  97. func (s *storeGetAllDeleteRecorder) Delete(key string, _, _ bool) (*store.Event, error) {
  98. s.deletes = append(s.deletes, key)
  99. return nil, nil
  100. }