@@ -24,6 +24,7 @@ import (
24
24
25
25
"github.com/hyperledger/fabric/common/flogging"
26
26
"github.com/spf13/viper"
27
+ "github.com/stretchr/testify/assert"
27
28
)
28
29
29
30
func TestMockStateRangeQueryIterator (t * testing.T ) {
@@ -235,6 +236,64 @@ func TestGetTxTimestamp(t *testing.T) {
235
236
stub .MockTransactionEnd ("init" )
236
237
}
237
238
239
+ // TestPutEmptyState confirms that setting a key value to empty or nil in the mock state deletes the key
240
+ // instead of storing an empty key.
241
+ func TestPutEmptyState (t * testing.T ) {
242
+ stub := NewMockStub ("FAB-12545" , nil )
243
+
244
+ // Put an empty and nil state value
245
+ stub .MockTransactionStart ("1" )
246
+ err := stub .PutState ("empty" , []byte {})
247
+ assert .NoError (t , err )
248
+ err = stub .PutState ("nil" , nil )
249
+ assert .NoError (t , err )
250
+ stub .MockTransactionEnd ("1" )
251
+
252
+ // Confirm both are nil
253
+ stub .MockTransactionStart ("2" )
254
+ val , err := stub .GetState ("empty" )
255
+ assert .NoError (t , err )
256
+ assert .Nil (t , val )
257
+ val , err = stub .GetState ("nil" )
258
+ assert .NoError (t , err )
259
+ assert .Nil (t , val )
260
+ // Add a value to both empty and nil
261
+ err = stub .PutState ("empty" , []byte {0 })
262
+ assert .NoError (t , err )
263
+ err = stub .PutState ("nil" , []byte {0 })
264
+ assert .NoError (t , err )
265
+ stub .MockTransactionEnd ("2" )
266
+
267
+ // Confirm the value is in both
268
+ stub .MockTransactionStart ("3" )
269
+ val , err = stub .GetState ("empty" )
270
+ assert .NoError (t , err )
271
+ assert .Equal (t , val , []byte {0 })
272
+ val , err = stub .GetState ("nil" )
273
+ assert .NoError (t , err )
274
+ assert .Equal (t , val , []byte {0 })
275
+ stub .MockTransactionEnd ("3" )
276
+
277
+ // Set both back to empty / nil
278
+ stub .MockTransactionStart ("4" )
279
+ err = stub .PutState ("empty" , []byte {})
280
+ assert .NoError (t , err )
281
+ err = stub .PutState ("nil" , nil )
282
+ assert .NoError (t , err )
283
+ stub .MockTransactionEnd ("4" )
284
+
285
+ // Confirm both are nil
286
+ stub .MockTransactionStart ("5" )
287
+ val , err = stub .GetState ("empty" )
288
+ assert .NoError (t , err )
289
+ assert .Nil (t , val )
290
+ val , err = stub .GetState ("nil" )
291
+ assert .NoError (t , err )
292
+ assert .Nil (t , val )
293
+ stub .MockTransactionEnd ("5" )
294
+
295
+ }
296
+
238
297
//TestMockMock clearly cheating for coverage... but not. Mock should
239
298
//be tucked away under common/mocks package which is not
240
299
//included for coverage. Moving mockstub to another package
0 commit comments