github.com/adnan-c/fabric_e2e_couchdb@v0.6.1-preview.0.20170228180935-21ce6b23cf91/core/ledger/kvledger/kv_ledger_test.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package kvledger 18 19 import ( 20 "fmt" 21 "strconv" 22 "testing" 23 24 "github.com/hyperledger/fabric/common/ledger/testutil" 25 ledgerpackage "github.com/hyperledger/fabric/core/ledger" 26 "github.com/hyperledger/fabric/core/ledger/ledgerconfig" 27 ledgertestutil "github.com/hyperledger/fabric/core/ledger/testutil" 28 "github.com/hyperledger/fabric/protos/common" 29 putils "github.com/hyperledger/fabric/protos/utils" 30 "github.com/stretchr/testify/assert" 31 ) 32 33 func TestKVLedgerBlockStorage(t *testing.T) { 34 env := newTestEnv(t) 35 defer env.cleanup() 36 provider, _ := NewProvider() 37 defer provider.Close() 38 ledger, _ := provider.Create("testLedger") 39 defer ledger.Close() 40 41 bcInfo, _ := ledger.GetBlockchainInfo() 42 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 43 Height: 0, CurrentBlockHash: nil, PreviousBlockHash: nil}) 44 45 simulator, _ := ledger.NewTxSimulator() 46 simulator.SetState("ns1", "key1", []byte("value1")) 47 simulator.SetState("ns1", "key2", []byte("value2")) 48 simulator.SetState("ns1", "key3", []byte("value3")) 49 simulator.Done() 50 simRes, _ := simulator.GetTxSimulationResults() 51 bg := testutil.NewBlockGenerator(t) 52 block0 := bg.NextBlock([][]byte{simRes}, false) 53 ledger.Commit(block0) 54 55 bcInfo, _ = ledger.GetBlockchainInfo() 56 block1Hash := block0.Header.Hash() 57 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 58 Height: 1, CurrentBlockHash: block1Hash, PreviousBlockHash: []byte{}}) 59 60 simulator, _ = ledger.NewTxSimulator() 61 simulator.SetState("ns1", "key1", []byte("value4")) 62 simulator.SetState("ns1", "key2", []byte("value5")) 63 simulator.SetState("ns1", "key3", []byte("value6")) 64 simulator.Done() 65 simRes, _ = simulator.GetTxSimulationResults() 66 block1 := bg.NextBlock([][]byte{simRes}, false) 67 ledger.Commit(block1) 68 69 bcInfo, _ = ledger.GetBlockchainInfo() 70 block2Hash := block1.Header.Hash() 71 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 72 Height: 2, CurrentBlockHash: block2Hash, PreviousBlockHash: block0.Header.Hash()}) 73 74 b0, _ := ledger.GetBlockByHash(block1Hash) 75 testutil.AssertEquals(t, b0, block0) 76 77 b1, _ := ledger.GetBlockByHash(block2Hash) 78 testutil.AssertEquals(t, b1, block1) 79 80 b0, _ = ledger.GetBlockByNumber(0) 81 testutil.AssertEquals(t, b0, block0) 82 83 b1, _ = ledger.GetBlockByNumber(1) 84 testutil.AssertEquals(t, b1, block1) 85 86 // get the tran id from the 2nd block, then use it to test GetTransactionByID() 87 txEnvBytes2 := block1.Data.Data[0] 88 txEnv2, err := putils.GetEnvelopeFromBlock(txEnvBytes2) 89 testutil.AssertNoError(t, err, "Error upon GetEnvelopeFromBlock") 90 payload2, err := putils.GetPayload(txEnv2) 91 testutil.AssertNoError(t, err, "Error upon GetPayload") 92 chdr, err := putils.UnmarshalChannelHeader(payload2.Header.ChannelHeader) 93 testutil.AssertNoError(t, err, "Error upon GetChannelHeaderFromBytes") 94 txID2 := chdr.TxId 95 processedTran2, err := ledger.GetTransactionByID(txID2) 96 testutil.AssertNoError(t, err, "Error upon GetTransactionByID") 97 // get the tran envelope from the retrieved ProcessedTransaction 98 retrievedTxEnv2 := processedTran2.TransactionEnvelope 99 testutil.AssertEquals(t, retrievedTxEnv2, txEnv2) 100 101 } 102 103 func TestKVLedgerDBRecovery(t *testing.T) { 104 ledgertestutil.SetupCoreYAMLConfig("./../../../peer") 105 env := newTestEnv(t) 106 defer env.cleanup() 107 provider, _ := NewProvider() 108 defer provider.Close() 109 ledger, _ := provider.Create("testLedger") 110 defer ledger.Close() 111 112 bcInfo, err := ledger.GetBlockchainInfo() 113 testutil.AssertNoError(t, err, "") 114 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 115 Height: 0, CurrentBlockHash: nil, PreviousBlockHash: nil}) 116 //creating and committing the first block 117 simulator, _ := ledger.NewTxSimulator() 118 //simulating a transaction 119 simulator.SetState("ns1", "key1", []byte("value1.1")) 120 simulator.SetState("ns1", "key2", []byte("value2.1")) 121 simulator.SetState("ns1", "key3", []byte("value3.1")) 122 simulator.Done() 123 simRes, _ := simulator.GetTxSimulationResults() 124 //generating a block based on the simulation result 125 bg := testutil.NewBlockGenerator(t) 126 block1 := bg.NextBlock([][]byte{simRes}, false) 127 //performing validation of read and write set to find valid transactions 128 ledger.Commit(block1) 129 bcInfo, _ = ledger.GetBlockchainInfo() 130 block1Hash := block1.Header.Hash() 131 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 132 Height: 1, CurrentBlockHash: block1Hash, PreviousBlockHash: []byte{}}) 133 134 //====================================================================================== 135 //SCENARIO 1: peer fails before committing the second block to state DB 136 //and history DB (if exist) 137 //====================================================================================== 138 simulator, _ = ledger.NewTxSimulator() 139 //simulating transaction 140 simulator.SetState("ns1", "key1", []byte("value1.2")) 141 simulator.SetState("ns1", "key2", []byte("value2.2")) 142 simulator.SetState("ns1", "key3", []byte("value3.2")) 143 simulator.Done() 144 simRes, _ = simulator.GetTxSimulationResults() 145 //generating a block based on the simulation result 146 block2 := bg.NextBlock([][]byte{simRes}, false) 147 148 //performing validation of read and write set to find valid transactions 149 ledger.(*kvLedger).txtmgmt.ValidateAndPrepare(block2, true) 150 //writing the validated block to block storage but not committing the transaction 151 //to state DB and history DB (if exist) 152 err = ledger.(*kvLedger).blockStore.AddBlock(block2) 153 154 //assume that peer fails here before committing the transaction 155 assert.NoError(t, err) 156 157 bcInfo, _ = ledger.GetBlockchainInfo() 158 block2Hash := block2.Header.Hash() 159 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 160 Height: 2, CurrentBlockHash: block2Hash, PreviousBlockHash: block1.Header.Hash()}) 161 162 simulator, _ = ledger.NewTxSimulator() 163 value, _ := simulator.GetState("ns1", "key1") 164 //value for 'key1' should be 'value1' as the last commit failed 165 testutil.AssertEquals(t, value, []byte("value1.1")) 166 value, _ = simulator.GetState("ns1", "key2") 167 //value for 'key2' should be 'value2' as the last commit failed 168 testutil.AssertEquals(t, value, []byte("value2.1")) 169 value, _ = simulator.GetState("ns1", "key3") 170 //value for 'key3' should be 'value3' as the last commit failed 171 testutil.AssertEquals(t, value, []byte("value3.1")) 172 //savepoint in state DB should 0 as the last commit failed 173 stateDBSavepoint, _ := ledger.(*kvLedger).txtmgmt.GetLastSavepoint() 174 testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(0)) 175 176 if ledgerconfig.IsHistoryDBEnabled() == true { 177 qhistory, _ := ledger.NewHistoryQueryExecutor() 178 itr, _ := qhistory.GetHistoryForKey("ns1", "key1") 179 count := 0 180 for { 181 kmod, err := itr.Next() 182 testutil.AssertNoError(t, err, "Error upon Next()") 183 if kmod == nil { 184 break 185 } 186 retrievedValue := kmod.(*ledgerpackage.KeyModification).Value 187 count++ 188 expectedValue := []byte("value1." + strconv.Itoa(count)) 189 testutil.AssertEquals(t, retrievedValue, expectedValue) 190 } 191 testutil.AssertEquals(t, count, 1) 192 193 //savepoint in history DB should 0 as the last commit failed 194 historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint() 195 testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(0)) 196 } 197 198 simulator.Done() 199 ledger.Close() 200 provider.Close() 201 202 //we assume here that the peer comes online and calls NewKVLedger to get a handler for the ledger 203 //State DB should be recovered before returning from NewKVLedger call 204 provider, _ = NewProvider() 205 ledger, _ = provider.Open("testLedger") 206 207 simulator, _ = ledger.NewTxSimulator() 208 value, _ = simulator.GetState("ns1", "key1") 209 //value for 'key1' should be 'value4' after recovery 210 testutil.AssertEquals(t, value, []byte("value1.2")) 211 value, _ = simulator.GetState("ns1", "key2") 212 //value for 'key2' should be 'value5' after recovery 213 testutil.AssertEquals(t, value, []byte("value2.2")) 214 value, _ = simulator.GetState("ns1", "key3") 215 //value for 'key3' should be 'value6' after recovery 216 testutil.AssertEquals(t, value, []byte("value3.2")) 217 //savepoint in state DB should 2 after recovery 218 stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint() 219 testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(1)) 220 221 if ledgerconfig.IsHistoryDBEnabled() == true { 222 qhistory, _ := ledger.NewHistoryQueryExecutor() 223 itr, _ := qhistory.GetHistoryForKey("ns1", "key1") 224 count := 0 225 for { 226 kmod, err := itr.Next() 227 testutil.AssertNoError(t, err, "Error upon Next()") 228 if kmod == nil { 229 break 230 } 231 retrievedValue := kmod.(*ledgerpackage.KeyModification).Value 232 count++ 233 expectedValue := []byte("value1." + strconv.Itoa(count)) 234 testutil.AssertEquals(t, retrievedValue, expectedValue) 235 } 236 testutil.AssertEquals(t, count, 2) 237 238 //savepoint in history DB should 2 after recovery 239 historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint() 240 testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(1)) 241 } 242 243 simulator.Done() 244 245 //====================================================================================== 246 //SCENARIO 2: peer fails after committing the third block to state DB 247 //but before committing to history DB (if exist) 248 //====================================================================================== 249 250 simulator, _ = ledger.NewTxSimulator() 251 //simulating transaction 252 simulator.SetState("ns1", "key1", []byte("value1.3")) 253 simulator.SetState("ns1", "key2", []byte("value2.3")) 254 simulator.SetState("ns1", "key3", []byte("value3.3")) 255 simulator.Done() 256 simRes, _ = simulator.GetTxSimulationResults() 257 //generating a block based on the simulation result 258 block3 := bg.NextBlock([][]byte{simRes}, false) 259 //performing validation of read and write set to find valid transactions 260 ledger.(*kvLedger).txtmgmt.ValidateAndPrepare(block3, true) 261 //writing the validated block to block storage 262 err = ledger.(*kvLedger).blockStore.AddBlock(block3) 263 //committing the transaction to state DB 264 err = ledger.(*kvLedger).txtmgmt.Commit() 265 //assume that peer fails here after committing the transaction to state DB but before 266 //history DB 267 assert.NoError(t, err) 268 269 bcInfo, _ = ledger.GetBlockchainInfo() 270 block3Hash := block3.Header.Hash() 271 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 272 Height: 3, CurrentBlockHash: block3Hash, PreviousBlockHash: block2.Header.Hash()}) 273 274 simulator, _ = ledger.NewTxSimulator() 275 value, _ = simulator.GetState("ns1", "key1") 276 //value for 'key1' should be 'value7' 277 testutil.AssertEquals(t, value, []byte("value1.3")) 278 value, _ = simulator.GetState("ns1", "key2") 279 //value for 'key2' should be 'value8' 280 testutil.AssertEquals(t, value, []byte("value2.3")) 281 value, _ = simulator.GetState("ns1", "key3") 282 //value for 'key3' should be 'value9' 283 testutil.AssertEquals(t, value, []byte("value3.3")) 284 //savepoint in state DB should 3 285 stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint() 286 testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(2)) 287 288 if ledgerconfig.IsHistoryDBEnabled() == true { 289 qhistory, _ := ledger.NewHistoryQueryExecutor() 290 itr, _ := qhistory.GetHistoryForKey("ns1", "key1") 291 count := 0 292 for { 293 kmod, err := itr.Next() 294 testutil.AssertNoError(t, err, "Error upon Next()") 295 if kmod == nil { 296 break 297 } 298 retrievedValue := kmod.(*ledgerpackage.KeyModification).Value 299 count++ 300 expectedValue := []byte("value1." + strconv.Itoa(count)) 301 testutil.AssertEquals(t, retrievedValue, expectedValue) 302 } 303 testutil.AssertEquals(t, count, 2) 304 305 //savepoint in history DB should 2 as the last commit failed 306 historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint() 307 testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(1)) 308 } 309 simulator.Done() 310 ledger.Close() 311 provider.Close() 312 313 //we assume here that the peer comes online and calls NewKVLedger to get a handler for the ledger 314 //history DB should be recovered before returning from NewKVLedger call 315 provider, _ = NewProvider() 316 ledger, _ = provider.Open("testLedger") 317 simulator, _ = ledger.NewTxSimulator() 318 stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint() 319 testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(2)) 320 321 if ledgerconfig.IsHistoryDBEnabled() == true { 322 qhistory, _ := ledger.NewHistoryQueryExecutor() 323 itr, _ := qhistory.GetHistoryForKey("ns1", "key1") 324 count := 0 325 for { 326 kmod, err := itr.Next() 327 testutil.AssertNoError(t, err, "Error upon Next()") 328 if kmod == nil { 329 break 330 } 331 retrievedValue := kmod.(*ledgerpackage.KeyModification).Value 332 count++ 333 expectedValue := []byte("value1." + strconv.Itoa(count)) 334 testutil.AssertEquals(t, retrievedValue, expectedValue) 335 } 336 testutil.AssertEquals(t, count, 3) 337 338 //savepoint in history DB should 3 after recovery 339 historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint() 340 testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(2)) 341 } 342 simulator.Done() 343 344 //Rare scenario 345 346 //====================================================================================== 347 //SCENARIO 3: peer fails after committing the fourth block to history DB (if exist) 348 //but before committing to state DB 349 //====================================================================================== 350 simulator, _ = ledger.NewTxSimulator() 351 //simulating transaction 352 simulator.SetState("ns1", "key1", []byte("value1.4")) 353 simulator.SetState("ns1", "key2", []byte("value2.4")) 354 simulator.SetState("ns1", "key3", []byte("value3.4")) 355 simulator.Done() 356 simRes, _ = simulator.GetTxSimulationResults() 357 //generating a block based on the simulation result 358 block4 := bg.NextBlock([][]byte{simRes}, false) 359 //performing validation of read and write set to find valid transactions 360 ledger.(*kvLedger).txtmgmt.ValidateAndPrepare(block4, true) 361 //writing the validated block to block storage but fails to commit to state DB but 362 //successfully commits to history DB (if exists) 363 err = ledger.(*kvLedger).blockStore.AddBlock(block4) 364 if ledgerconfig.IsHistoryDBEnabled() == true { 365 err = ledger.(*kvLedger).historyDB.Commit(block4) 366 } 367 assert.NoError(t, err) 368 369 bcInfo, _ = ledger.GetBlockchainInfo() 370 block4Hash := block4.Header.Hash() 371 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 372 Height: 4, CurrentBlockHash: block4Hash, PreviousBlockHash: block3.Header.Hash()}) 373 374 simulator, _ = ledger.NewTxSimulator() 375 value, _ = simulator.GetState("ns1", "key1") 376 //value for 'key1' should be 'value7' as the last commit to State DB failed 377 testutil.AssertEquals(t, value, []byte("value1.3")) 378 value, _ = simulator.GetState("ns1", "key2") 379 //value for 'key2' should be 'value8' as the last commit to State DB failed 380 testutil.AssertEquals(t, value, []byte("value2.3")) 381 value, _ = simulator.GetState("ns1", "key3") 382 //value for 'key3' should be 'value9' as the last commit to State DB failed 383 testutil.AssertEquals(t, value, []byte("value3.3")) 384 //savepoint in state DB should 3 as the last commit failed 385 stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint() 386 testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(2)) 387 388 if ledgerconfig.IsHistoryDBEnabled() == true { 389 qhistory, _ := ledger.NewHistoryQueryExecutor() 390 itr, _ := qhistory.GetHistoryForKey("ns1", "key1") 391 count := 0 392 for { 393 kmod, err := itr.Next() 394 testutil.AssertNoError(t, err, "Error upon Next()") 395 if kmod == nil { 396 break 397 } 398 retrievedValue := kmod.(*ledgerpackage.KeyModification).Value 399 count++ 400 expectedValue := []byte("value1." + strconv.Itoa(count)) 401 testutil.AssertEquals(t, retrievedValue, expectedValue) 402 } 403 testutil.AssertEquals(t, count, 4) 404 //savepoint in history DB should 4 405 historyDBSavepoint, _ := ledger.(*kvLedger).historyDB.GetLastSavepoint() 406 testutil.AssertEquals(t, historyDBSavepoint.BlockNum, uint64(3)) 407 } 408 simulator.Done() 409 ledger.Close() 410 provider.Close() 411 412 //we assume here that the peer comes online and calls NewKVLedger to get a handler for the ledger 413 //state DB should be recovered before returning from NewKVLedger call 414 provider, _ = NewProvider() 415 ledger, _ = provider.Open("testLedger") 416 simulator, _ = ledger.NewTxSimulator() 417 value, _ = simulator.GetState("ns1", "key1") 418 //value for 'key1' should be 'value10' after state DB recovery 419 testutil.AssertEquals(t, value, []byte("value1.4")) 420 value, _ = simulator.GetState("ns1", "key2") 421 //value for 'key2' should be 'value11' after state DB recovery 422 testutil.AssertEquals(t, value, []byte("value2.4")) 423 value, _ = simulator.GetState("ns1", "key3") 424 //value for 'key3' should be 'value12' after state DB recovery 425 testutil.AssertEquals(t, value, []byte("value3.4")) 426 //savepoint in state DB should 4 after the recovery 427 stateDBSavepoint, _ = ledger.(*kvLedger).txtmgmt.GetLastSavepoint() 428 testutil.AssertEquals(t, stateDBSavepoint.BlockNum, uint64(3)) 429 simulator.Done() 430 } 431 432 func TestLedgerWithCouchDbEnabledWithBinaryAndJSONData(t *testing.T) { 433 434 //call a helper method to load the core.yaml 435 ledgertestutil.SetupCoreYAMLConfig("./../../../peer") 436 437 logger.Debugf("TestLedgerWithCouchDbEnabledWithBinaryAndJSONData IsCouchDBEnabled()value: %v , IsHistoryDBEnabled()value: %v\n", 438 ledgerconfig.IsCouchDBEnabled(), ledgerconfig.IsHistoryDBEnabled()) 439 440 env := newTestEnv(t) 441 defer env.cleanup() 442 provider, _ := NewProvider() 443 defer provider.Close() 444 ledger, _ := provider.Create("testLedger") 445 defer ledger.Close() 446 447 bcInfo, _ := ledger.GetBlockchainInfo() 448 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 449 Height: 0, CurrentBlockHash: nil, PreviousBlockHash: nil}) 450 451 simulator, _ := ledger.NewTxSimulator() 452 simulator.SetState("ns1", "key4", []byte("value1")) 453 simulator.SetState("ns1", "key5", []byte("value2")) 454 simulator.SetState("ns1", "key6", []byte("{\"shipmentID\":\"161003PKC7300\",\"customsInvoice\":{\"methodOfTransport\":\"GROUND\",\"invoiceNumber\":\"00091622\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}")) 455 simulator.SetState("ns1", "key7", []byte("{\"shipmentID\":\"161003PKC7600\",\"customsInvoice\":{\"methodOfTransport\":\"AIR MAYBE\",\"invoiceNumber\":\"00091624\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}")) 456 simulator.Done() 457 simRes, _ := simulator.GetTxSimulationResults() 458 bg := testutil.NewBlockGenerator(t) 459 block1 := bg.NextBlock([][]byte{simRes}, false) 460 461 ledger.Commit(block1) 462 463 bcInfo, _ = ledger.GetBlockchainInfo() 464 block1Hash := block1.Header.Hash() 465 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 466 Height: 1, CurrentBlockHash: block1Hash, PreviousBlockHash: []byte{}}) 467 468 simulationResults := [][]byte{} 469 simulator, _ = ledger.NewTxSimulator() 470 simulator.SetState("ns1", "key4", []byte("value3")) 471 simulator.SetState("ns1", "key5", []byte("{\"shipmentID\":\"161003PKC7500\",\"customsInvoice\":{\"methodOfTransport\":\"AIR FREIGHT\",\"invoiceNumber\":\"00091623\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}")) 472 simulator.SetState("ns1", "key6", []byte("value4")) 473 simulator.SetState("ns1", "key7", []byte("{\"shipmentID\":\"161003PKC7600\",\"customsInvoice\":{\"methodOfTransport\":\"GROUND\",\"invoiceNumber\":\"00091624\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}")) 474 simulator.SetState("ns1", "key8", []byte("{\"shipmentID\":\"161003PKC7700\",\"customsInvoice\":{\"methodOfTransport\":\"SHIP\",\"invoiceNumber\":\"00091625\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}")) 475 simulator.Done() 476 simRes, _ = simulator.GetTxSimulationResults() 477 simulationResults = append(simulationResults, simRes) 478 //add a 2nd transaction 479 simulator2, _ := ledger.NewTxSimulator() 480 simulator2.SetState("ns1", "key7", []byte("{\"shipmentID\":\"161003PKC7600\",\"customsInvoice\":{\"methodOfTransport\":\"TRAIN\",\"invoiceNumber\":\"00091624\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}")) 481 simulator2.SetState("ns1", "key9", []byte("value5")) 482 simulator2.SetState("ns1", "key10", []byte("{\"shipmentID\":\"261003PKC8000\",\"customsInvoice\":{\"methodOfTransport\":\"DONKEY\",\"invoiceNumber\":\"00091626\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}")) 483 simulator2.Done() 484 simRes2, _ := simulator2.GetTxSimulationResults() 485 simulationResults = append(simulationResults, simRes2) 486 487 block2 := bg.NextBlock(simulationResults, false) 488 ledger.Commit(block2) 489 490 bcInfo, _ = ledger.GetBlockchainInfo() 491 block2Hash := block2.Header.Hash() 492 testutil.AssertEquals(t, bcInfo, &common.BlockchainInfo{ 493 Height: 2, CurrentBlockHash: block2Hash, PreviousBlockHash: block1.Header.Hash()}) 494 495 b1, _ := ledger.GetBlockByHash(block1Hash) 496 testutil.AssertEquals(t, b1, block1) 497 498 b2, _ := ledger.GetBlockByHash(block2Hash) 499 testutil.AssertEquals(t, b2, block2) 500 501 b1, _ = ledger.GetBlockByNumber(0) 502 testutil.AssertEquals(t, b1, block1) 503 504 b2, _ = ledger.GetBlockByNumber(1) 505 testutil.AssertEquals(t, b2, block2) 506 507 //Similar test has been pushed down to historyleveldb_test.go as well 508 if ledgerconfig.IsHistoryDBEnabled() == true { 509 logger.Debugf("History is enabled\n") 510 qhistory, err := ledger.NewHistoryQueryExecutor() 511 testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to retrieve history database executor")) 512 513 itr, err2 := qhistory.GetHistoryForKey("ns1", "key7") 514 testutil.AssertNoError(t, err2, fmt.Sprintf("Error upon GetHistoryForKey")) 515 516 var retrievedValue []byte 517 count := 0 518 for { 519 kmod, _ := itr.Next() 520 if kmod == nil { 521 break 522 } 523 retrievedValue = kmod.(*ledgerpackage.KeyModification).Value 524 count++ 525 } 526 testutil.AssertEquals(t, count, 3) 527 // test the last value in the history matches the last value set for key7 528 expectedValue := []byte("{\"shipmentID\":\"161003PKC7600\",\"customsInvoice\":{\"methodOfTransport\":\"TRAIN\",\"invoiceNumber\":\"00091624\"},\"weightUnitOfMeasure\":\"KGM\",\"volumeUnitOfMeasure\": \"CO\",\"dimensionUnitOfMeasure\":\"CM\",\"currency\":\"USD\"}") 529 testutil.AssertEquals(t, retrievedValue, expectedValue) 530 531 } 532 }