private void TestRollbackTransaction(ITestStorageProvider provider)
{
var fakeHeaders = new FakeHeaders();
var chainedHeader0 = fakeHeaders.GenesisChained();
var chainedHeader1 = fakeHeaders.NextChained();
var chainedHeader2 = fakeHeaders.NextChained();
var unspentTx = new UnspentTx(txHash: UInt256.Zero, blockIndex: 0, txIndex: 0, outputStates: new OutputStates(1, OutputState.Spent));
var spentTxes = BlockSpentTxes.CreateRange(new[] { unspentTx.ToSpentTx() });
using (var storageManager = provider.OpenStorageManager())
using (var handle = storageManager.OpenChainStateCursor())
{
var chainStateCursor = handle.Item;
// begin transaction
chainStateCursor.BeginTransaction();
// add header 0
chainStateCursor.ChainTip = chainedHeader0;
// verify chain
Assert.AreEqual(chainedHeader0, chainStateCursor.ChainTip);
// add unspent tx
chainStateCursor.TryAddUnspentTx(unspentTx);
chainStateCursor.UnspentTxCount++;
// verify unspent tx
Assert.IsTrue(chainStateCursor.ContainsUnspentTx(unspentTx.TxHash));
Assert.AreEqual(1, chainStateCursor.UnspentTxCount);
// add spent txes
chainStateCursor.TryAddBlockSpentTxes(0, spentTxes);
// verify spent txes
BlockSpentTxes actualSpentTxes;
Assert.IsTrue(chainStateCursor.TryGetBlockSpentTxes(0, out actualSpentTxes));
CollectionAssert.AreEqual(spentTxes.ToList(), actualSpentTxes.ToList());
// rollback transaction
chainStateCursor.RollbackTransaction();
chainStateCursor.BeginTransaction();
// verify chain
Assert.IsNull(chainStateCursor.ChainTip);
// verify unspent tx
Assert.IsFalse(chainStateCursor.ContainsUnspentTx(unspentTx.TxHash));
Assert.AreEqual(0, chainStateCursor.UnspentTxCount);
// verify spent txes
Assert.IsFalse(chainStateCursor.TryGetBlockSpentTxes(0, out actualSpentTxes));
chainStateCursor.RollbackTransaction();
}
}