etcd/etcdserver/cluster_store_test.go
Brandon Philips 5e3fd6ee3f etcdserver: introduce the cluster and member
This introduces two new concepts: the cluster and the member.

Members are logical etcd instances that have a name, raft ID, and a list
of peer and client addresses.

A cluster is made up of a list of members.
2014-09-25 18:04:10 -07:00

116 lines
2.6 KiB
Go

package etcdserver
import (
"reflect"
"testing"
"time"
etcdErr "github.com/coreos/etcd/error"
"github.com/coreos/etcd/store"
)
func TestClusterStoreGet(t *testing.T) {
tests := []struct {
mems []Member
wmems []Member
}{
{
[]Member{{Name: "node1", ID: 1}},
[]Member{{Name: "node1", ID: 1}},
},
{
[]Member{},
[]Member{},
},
{
[]Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
[]Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
},
{
[]Member{{Name: "node2", ID: 2}, {Name: "node1", ID: 1}},
[]Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
},
}
for i, tt := range tests {
c := Cluster{}
err := c.AddSlice(tt.mems)
if err != nil {
t.Error(err)
}
cs := NewClusterStore(&getAllStore{}, c)
if g := cs.Get(); !reflect.DeepEqual(g, c) {
t.Errorf("#%d: mems = %v, want %v", i, g, c)
}
}
}
func TestClusterStoreDelete(t *testing.T) {
st := &storeGetAllDeleteRecorder{}
c := Cluster{}
c.Add(Member{Name: "node", ID: 1})
cs := NewClusterStore(st, c)
cs.Delete(1)
wdeletes := []string{machineKVPrefix + "1"}
if !reflect.DeepEqual(st.deletes, wdeletes) {
t.Error("deletes = %v, want %v", st.deletes, wdeletes)
}
}
// simpleStore implements basic create and get.
type simpleStore struct {
storeRecorder
st map[string]string
}
func (s *simpleStore) Create(key string, _ bool, value string, _ bool, _ time.Time) (*store.Event, error) {
if s.st == nil {
s.st = make(map[string]string)
}
s.st[key] = value
return nil, nil
}
func (s *simpleStore) Get(key string, _, _ bool) (*store.Event, error) {
val, ok := s.st[key]
if !ok {
return nil, etcdErr.NewError(etcdErr.EcodeKeyNotFound, "", 0)
}
ev := &store.Event{Node: &store.NodeExtern{Key: key, Value: stringp(val)}}
return ev, nil
}
// getAllStore inherits simpleStore, and makes Get return all keys.
type getAllStore struct {
simpleStore
}
func (s *getAllStore) Get(_ string, _, _ bool) (*store.Event, error) {
nodes := make([]*store.NodeExtern, 0)
for k, v := range s.st {
nodes = append(nodes, &store.NodeExtern{Key: k, Value: stringp(v)})
}
return &store.Event{Node: &store.NodeExtern{Nodes: nodes}}, nil
}
type storeDeleteRecorder struct {
storeRecorder
deletes []string
}
func (s *storeDeleteRecorder) Delete(key string, _, _ bool) (*store.Event, error) {
s.deletes = append(s.deletes, key)
return nil, nil
}
type storeGetAllDeleteRecorder struct {
getAllStore
deletes []string
}
func (s *storeGetAllDeleteRecorder) Delete(key string, _, _ bool) (*store.Event, error) {
s.deletes = append(s.deletes, key)
return nil, nil
}