public void Tload_same_address_same_index_different_values_restore(int snapshot) { Context ctx = new(); StorageProvider provider = BuildStorageProvider(ctx); Snapshot.Storage[] snapshots = new Snapshot.Storage[4]; snapshots[0] = ((IStorageProvider)provider).TakeSnapshot(); provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[1]); snapshots[1] = ((IStorageProvider)provider).TakeSnapshot(); provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[2]); snapshots[2] = ((IStorageProvider)provider).TakeSnapshot(); provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[3]); snapshots[3] = ((IStorageProvider)provider).TakeSnapshot(); Assert.AreEqual(snapshots[snapshot + 1].TransientStorageSnapshot, snapshot); // Persistent storage is unimpacted by transient storage Assert.AreEqual(snapshots[snapshot + 1].PersistentStorageSnapshot, -1); provider.Restore(snapshots[snapshot + 1]); Assert.AreEqual(_values[snapshot + 1], provider.GetTransientState(new StorageCell(ctx.Address1, 1))); }
public void Persistent_state_restores_independent_of_transient_state(int snapshot) { Context ctx = new(); StorageProvider provider = BuildStorageProvider(ctx); Snapshot.Storage[] snapshots = new Snapshot.Storage[4]; // No updates snapshots[0] = ((IStorageProvider)provider).TakeSnapshot(); // Only update persistent provider.Set(new StorageCell(ctx.Address1, 1), _values[1]); snapshots[1] = ((IStorageProvider)provider).TakeSnapshot(); // Update both provider.Set(new StorageCell(ctx.Address1, 1), _values[2]); provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[9]); snapshots[2] = ((IStorageProvider)provider).TakeSnapshot(); // Only update transient provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[8]); snapshots[3] = ((IStorageProvider)provider).TakeSnapshot(); provider.Restore(snapshots[snapshot + 1]); // Since we didn't update persistent on the 3rd snapshot if (snapshot == 2) { snapshot--; } snapshots.Should().Equal( Snapshot.Storage.Empty, new Snapshot.Storage(0, Snapshot.EmptyPosition), new Snapshot.Storage(1, 0), new Snapshot.Storage(1, 1)); _values[snapshot + 1].Should().BeEquivalentTo(provider.Get(new StorageCell(ctx.Address1, 1))); }
public void Restore(Snapshot.Storage snapshot) { _persistentStorageProvider.Restore(snapshot.PersistentStorageSnapshot); _transientStorageProvider.Restore(snapshot.TransientStorageSnapshot); }
public Snapshot TakeSnapshot(bool newTransactionStart = false) { Snapshot.Storage storageSnapshot = StorageProvider.TakeSnapshot(newTransactionStart); return(new (StateProvider.TakeSnapshot(), storageSnapshot)); }