@@ -2,6 +2,8 @@ package physical
2
2
3
3
import (
4
4
"fmt"
5
+ "reflect"
6
+ "sort"
5
7
"testing"
6
8
7
9
radix "github.com/armon/go-radix"
@@ -82,3 +84,171 @@ func TestPseudo_Basic(t *testing.T) {
82
84
testBackend (t , p )
83
85
testBackend_ListPrefix (t , p )
84
86
}
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\n got\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\n got\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