Skip to content

Commit a142bde

Browse files
committed
Add pseudo transactional test
1 parent c6721d2 commit a142bde

File tree

2 files changed

+171
-1
lines changed

2 files changed

+171
-1
lines changed

physical/transactions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,5 +117,5 @@ TxnWalk:
117117
}
118118
}
119119

120-
return nil
120+
return
121121
}

physical/transactions_test.go

+170
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package physical
22

33
import (
44
"fmt"
5+
"reflect"
6+
"sort"
57
"testing"
68

79
radix "github.com/armon/go-radix"
@@ -82,3 +84,171 @@ func TestPseudo_Basic(t *testing.T) {
8284
testBackend(t, p)
8385
testBackend_ListPrefix(t, p)
8486
}
87+
88+
func TestPseudo_SuccessfulTransaction(t *testing.T) {
89+
logger := logformat.NewVaultLogger(log.LevelTrace)
90+
p := newFaultyPseudo(logger, nil)
91+
92+
txns := setupPseudo(p, t)
93+
94+
if err := p.Transaction(txns); err != nil {
95+
t.Fatal(err)
96+
}
97+
98+
keys, err := p.List("")
99+
if err != nil {
100+
t.Fatal(err)
101+
}
102+
103+
expected := []string{"foo", "zip"}
104+
105+
sort.Strings(keys)
106+
sort.Strings(expected)
107+
if !reflect.DeepEqual(keys, expected) {
108+
t.Fatalf("mismatch: expected\n%#v\ngot\n%#v\n", expected, keys)
109+
}
110+
111+
entry, err := p.Get("foo")
112+
if err != nil {
113+
t.Fatal(err)
114+
}
115+
if entry == nil {
116+
t.Fatal("got nil entry")
117+
}
118+
if entry.Value == nil {
119+
t.Fatal("got nil value")
120+
}
121+
if string(entry.Value) != "bar3" {
122+
t.Fatal("updates did not apply correctly")
123+
}
124+
125+
entry, err = p.Get("zip")
126+
if err != nil {
127+
t.Fatal(err)
128+
}
129+
if entry == nil {
130+
t.Fatal("got nil entry")
131+
}
132+
if entry.Value == nil {
133+
t.Fatal("got nil value")
134+
}
135+
if string(entry.Value) != "zap3" {
136+
t.Fatal("updates did not apply correctly")
137+
}
138+
}
139+
140+
func TestPseudo_FailedTransaction(t *testing.T) {
141+
logger := logformat.NewVaultLogger(log.LevelTrace)
142+
p := newFaultyPseudo(logger, []string{"zip"})
143+
144+
txns := setupPseudo(p, t)
145+
146+
if err := p.Transaction(txns); err == nil {
147+
t.Fatal("expected error during transaction")
148+
}
149+
150+
keys, err := p.List("")
151+
if err != nil {
152+
t.Fatal(err)
153+
}
154+
155+
expected := []string{"foo", "zip", "deleteme", "deleteme2"}
156+
157+
sort.Strings(keys)
158+
sort.Strings(expected)
159+
if !reflect.DeepEqual(keys, expected) {
160+
t.Fatalf("mismatch: expected\n%#v\ngot\n%#v\n", expected, keys)
161+
}
162+
163+
entry, err := p.Get("foo")
164+
if err != nil {
165+
t.Fatal(err)
166+
}
167+
if entry == nil {
168+
t.Fatal("got nil entry")
169+
}
170+
if entry.Value == nil {
171+
t.Fatal("got nil value")
172+
}
173+
if string(entry.Value) != "bar" {
174+
t.Fatal("values did not rollback correctly")
175+
}
176+
177+
entry, err = p.Get("zip")
178+
if err != nil {
179+
t.Fatal(err)
180+
}
181+
if entry == nil {
182+
t.Fatal("got nil entry")
183+
}
184+
if entry.Value == nil {
185+
t.Fatal("got nil value")
186+
}
187+
if string(entry.Value) != "zap" {
188+
t.Fatal("values did not rollback correctly")
189+
}
190+
}
191+
192+
func setupPseudo(p *faultyPseudo, t *testing.T) []TxnEntry {
193+
// Add a few keys so that we test rollback with deletion
194+
if err := p.Put(&Entry{
195+
Key: "foo",
196+
Value: []byte("bar"),
197+
}); err != nil {
198+
t.Fatal(err)
199+
}
200+
if err := p.Put(&Entry{
201+
Key: "zip",
202+
Value: []byte("zap"),
203+
}); err != nil {
204+
t.Fatal(err)
205+
}
206+
if err := p.Put(&Entry{
207+
Key: "deleteme",
208+
}); err != nil {
209+
t.Fatal(err)
210+
}
211+
if err := p.Put(&Entry{
212+
Key: "deleteme2",
213+
}); err != nil {
214+
t.Fatal(err)
215+
}
216+
217+
txns := []TxnEntry{
218+
TxnEntry{
219+
Operation: PutOperation,
220+
Entry: &Entry{
221+
Key: "foo",
222+
Value: []byte("bar2"),
223+
},
224+
},
225+
TxnEntry{
226+
Operation: DeleteOperation,
227+
Entry: &Entry{
228+
Key: "deleteme",
229+
},
230+
},
231+
TxnEntry{
232+
Operation: PutOperation,
233+
Entry: &Entry{
234+
Key: "foo",
235+
Value: []byte("bar3"),
236+
},
237+
},
238+
TxnEntry{
239+
Operation: DeleteOperation,
240+
Entry: &Entry{
241+
Key: "deleteme2",
242+
},
243+
},
244+
TxnEntry{
245+
Operation: PutOperation,
246+
Entry: &Entry{
247+
Key: "zip",
248+
Value: []byte("zap3"),
249+
},
250+
},
251+
}
252+
253+
return txns
254+
}

0 commit comments

Comments
 (0)