mirror of https://github.com/status-im/consul.git
consul: Testing FSM application of KVS commands
This commit is contained in:
parent
c31232fb70
commit
6ca5c7c49d
|
@ -322,6 +322,10 @@ func TestFSM_SnapshotRestore(t *testing.T) {
|
||||||
Status: structs.HealthPassing,
|
Status: structs.HealthPassing,
|
||||||
ServiceID: "web",
|
ServiceID: "web",
|
||||||
})
|
})
|
||||||
|
fsm.state.KVSSet(8, &structs.DirEntry{
|
||||||
|
Key: "/test",
|
||||||
|
Value: []byte("foo"),
|
||||||
|
})
|
||||||
|
|
||||||
// Snapshot
|
// Snapshot
|
||||||
snap, err := fsm.Snapshot()
|
snap, err := fsm.Snapshot()
|
||||||
|
@ -370,4 +374,198 @@ func TestFSM_SnapshotRestore(t *testing.T) {
|
||||||
if len(checks) != 1 {
|
if len(checks) != 1 {
|
||||||
t.Fatalf("Bad: %v", checks)
|
t.Fatalf("Bad: %v", checks)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verify key is set
|
||||||
|
_, d, err := fsm.state.KVSGet("/test")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if string(d.Value) != "foo" {
|
||||||
|
t.Fatalf("bad: %v", d)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFSM_KVSSet(t *testing.T) {
|
||||||
|
fsm, err := NewFSM(os.Stderr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
defer fsm.Close()
|
||||||
|
|
||||||
|
req := structs.KVSRequest{
|
||||||
|
Datacenter: "dc1",
|
||||||
|
Op: structs.KVSSet,
|
||||||
|
DirEnt: structs.DirEntry{
|
||||||
|
Key: "/test/path",
|
||||||
|
Flags: 0,
|
||||||
|
Value: []byte("test"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
buf, err := structs.Encode(structs.KVSRequestType, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
resp := fsm.Apply(makeLog(buf))
|
||||||
|
if resp != nil {
|
||||||
|
t.Fatalf("resp: %v", resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify key is set
|
||||||
|
_, d, err := fsm.state.KVSGet("/test/path")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if d == nil {
|
||||||
|
t.Fatalf("missing")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFSM_KVSDelete(t *testing.T) {
|
||||||
|
fsm, err := NewFSM(os.Stderr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
defer fsm.Close()
|
||||||
|
|
||||||
|
req := structs.KVSRequest{
|
||||||
|
Datacenter: "dc1",
|
||||||
|
Op: structs.KVSSet,
|
||||||
|
DirEnt: structs.DirEntry{
|
||||||
|
Key: "/test/path",
|
||||||
|
Flags: 0,
|
||||||
|
Value: []byte("test"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
buf, err := structs.Encode(structs.KVSRequestType, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
resp := fsm.Apply(makeLog(buf))
|
||||||
|
if resp != nil {
|
||||||
|
t.Fatalf("resp: %v", resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the delete
|
||||||
|
req.Op = structs.KVSDelete
|
||||||
|
buf, err = structs.Encode(structs.KVSRequestType, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
resp = fsm.Apply(makeLog(buf))
|
||||||
|
if resp != nil {
|
||||||
|
t.Fatalf("resp: %v", resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify key is not set
|
||||||
|
_, d, err := fsm.state.KVSGet("/test/path")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if d != nil {
|
||||||
|
t.Fatalf("key present")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFSM_KVSDeleteTree(t *testing.T) {
|
||||||
|
fsm, err := NewFSM(os.Stderr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
defer fsm.Close()
|
||||||
|
|
||||||
|
req := structs.KVSRequest{
|
||||||
|
Datacenter: "dc1",
|
||||||
|
Op: structs.KVSSet,
|
||||||
|
DirEnt: structs.DirEntry{
|
||||||
|
Key: "/test/path",
|
||||||
|
Flags: 0,
|
||||||
|
Value: []byte("test"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
buf, err := structs.Encode(structs.KVSRequestType, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
resp := fsm.Apply(makeLog(buf))
|
||||||
|
if resp != nil {
|
||||||
|
t.Fatalf("resp: %v", resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the delete tree
|
||||||
|
req.Op = structs.KVSDeleteTree
|
||||||
|
req.DirEnt.Key = "/test"
|
||||||
|
buf, err = structs.Encode(structs.KVSRequestType, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
resp = fsm.Apply(makeLog(buf))
|
||||||
|
if resp != nil {
|
||||||
|
t.Fatalf("resp: %v", resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify key is not set
|
||||||
|
_, d, err := fsm.state.KVSGet("/test/path")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if d != nil {
|
||||||
|
t.Fatalf("key present")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFSM_KVSCheckAndSet(t *testing.T) {
|
||||||
|
fsm, err := NewFSM(os.Stderr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
defer fsm.Close()
|
||||||
|
|
||||||
|
req := structs.KVSRequest{
|
||||||
|
Datacenter: "dc1",
|
||||||
|
Op: structs.KVSSet,
|
||||||
|
DirEnt: structs.DirEntry{
|
||||||
|
Key: "/test/path",
|
||||||
|
Flags: 0,
|
||||||
|
Value: []byte("test"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
buf, err := structs.Encode(structs.KVSRequestType, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
resp := fsm.Apply(makeLog(buf))
|
||||||
|
if resp != nil {
|
||||||
|
t.Fatalf("resp: %v", resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify key is set
|
||||||
|
_, d, err := fsm.state.KVSGet("/test/path")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if d == nil {
|
||||||
|
t.Fatalf("key missing")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the check-and-set
|
||||||
|
req.Op = structs.KVSCAS
|
||||||
|
req.DirEnt.ModifyIndex = d.ModifyIndex
|
||||||
|
req.DirEnt.Value = []byte("zip")
|
||||||
|
buf, err = structs.Encode(structs.KVSRequestType, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
resp = fsm.Apply(makeLog(buf))
|
||||||
|
if resp.(bool) != true {
|
||||||
|
t.Fatalf("resp: %v", resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify key is updated
|
||||||
|
_, d, err = fsm.state.KVSGet("/test/path")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if string(d.Value) != "zip" {
|
||||||
|
t.Fatalf("bad: %v", d)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,8 +197,9 @@ const (
|
||||||
|
|
||||||
// KVSRequest is used to operate on the Key-Value store
|
// KVSRequest is used to operate on the Key-Value store
|
||||||
type KVSRequest struct {
|
type KVSRequest struct {
|
||||||
Op KVSOp // Which operation are we performing
|
Datacenter string
|
||||||
DirEnt DirEntry // Which directory entry
|
Op KVSOp // Which operation are we performing
|
||||||
|
DirEnt DirEntry // Which directory entry
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode is used to decode a MsgPack encoded object
|
// Decode is used to decode a MsgPack encoded object
|
||||||
|
|
Loading…
Reference in New Issue