protected async Task _createObjectTest(IStateStorageProvider stateStorageProvider)
        {
            var stateStoreEntryKey = Guid.NewGuid().ToString("D");
            var newStateStoreEntry = stateStorageProvider.CreateNewEntry(TestStateNamespace, stateStoreEntryKey);

            var newState = new StateTestsPocoState()
            {
                Id = Guid.NewGuid().ToString("D"), Nested = new StateTestsNestedPocoState {
                    NestedId = Guid.NewGuid().ToString("D")
                }
            };

            newStateStoreEntry.SetValue(newState);

            await stateStorageProvider.Save(newStateStoreEntry);

            var loadedStateStoreEntry = await stateStorageProvider.Load(TestStateNamespace, stateStoreEntryKey);

            Assert.IsNotNull(loadedStateStoreEntry);

            var loadedState = newStateStoreEntry.GetValue <StateTestsPocoState>();

            Assert.IsNotNull(loadedState);

            Assert.AreEqual(newState.Id, loadedState.Id);

            Assert.IsNotNull(loadedState.Nested);

            Assert.AreEqual(newState.Nested.NestedId, loadedState.Nested.NestedId);
        }
        protected async Task _deleteObjectTest(IStateStorageProvider stateStorageProvider)
        {
            var stateStoreEntryKey = Guid.NewGuid().ToString("D");

            var stateStoreEntry = stateStorageProvider.CreateNewEntry(TestStateNamespace, stateStoreEntryKey);
            var state           = new StateTestsPocoState()
            {
                Id = "1", Count = 1
            };

            stateStoreEntry.SetValue(state);

            //first write should work
            await stateStorageProvider.Save(stateStoreEntry);

            var loadedStateStoreEntry = await stateStorageProvider.Load(TestStateNamespace, stateStoreEntryKey);

            var loadedState = loadedStateStoreEntry.GetValue <StateTestsPocoState>();

            Assert.AreEqual(state.Count, loadedState.Count);

            await stateStorageProvider.Delete(TestStateNamespace, stateStoreEntryKey);

            var reloadedStateStoreEntry = await stateStorageProvider.Load(TestStateNamespace, stateStoreEntryKey);

            Assert.IsNull(reloadedStateStoreEntry, "Did not expect to find the state store entry that was just deleted.");
        }
        protected async Task _handleCrazyKeys(IStateStorageProvider stateStorageProvider)
        {
            var stateStoreEntryKey = $"{Guid.NewGuid().ToString("N")}-!@#$%^&*()~/\\><,.?';\"`~";
            var stateStoreEntry    = stateStorageProvider.CreateNewEntry(TestStateNamespace, stateStoreEntryKey);

            var state = new StateTestsPocoState()
            {
                Id = Guid.NewGuid().ToString("D")
            };

            stateStoreEntry.SetValue(state);

            await stateStorageProvider.Save(stateStoreEntry);

            var loadedStateStoreEntry = await stateStorageProvider.Load(TestStateNamespace, stateStoreEntryKey);

            Assert.IsNotNull(loadedStateStoreEntry);

            var loadedState = loadedStateStoreEntry.GetValue <StateTestsPocoState>();

            Assert.IsNotNull(loadedState);

            Assert.AreEqual(state.Id, loadedState.Id);
        }
        protected async Task _updateObjectTest(IStateStorageProvider stateStorageProvider)
        {
            var stateStoreEntryKey = Guid.NewGuid().ToString("D");
            var stateStoreEntry    = stateStorageProvider.CreateNewEntry(TestStateNamespace, stateStoreEntryKey);


            var originalState = new StateTestsPocoState()
            {
                Id = Guid.NewGuid().ToString("D"), Count = 1
            };

            stateStoreEntry.SetValue(originalState);

            //first write should work
            await stateStorageProvider.Save(stateStoreEntry);

            var loadedStateStoreEntry = await stateStorageProvider.Load(TestStateNamespace, stateStoreEntryKey);

            Assert.IsNotNull(loadedStateStoreEntry);

            var loadedState = loadedStateStoreEntry.GetValue <StateTestsPocoState>();

            Assert.IsNotNull(loadedState);

            loadedState.Count++;

            await stateStorageProvider.Save(loadedStateStoreEntry);

            var reloadedStateStoreEntry = await stateStorageProvider.Load(TestStateNamespace, stateStoreEntryKey);

            Assert.IsNotNull(reloadedStateStoreEntry);

            var reloadedState = reloadedStateStoreEntry.GetValue <StateTestsPocoState>();

            Assert.IsNotNull(reloadedState);

            Assert.AreEqual(2, reloadedState.Count);

            reloadedState.Count++;

            await stateStorageProvider.Save(reloadedStateStoreEntry);

            var rereloadedStateStoreEntry = await stateStorageProvider.Load(TestStateNamespace, stateStoreEntryKey);

            var rereloadedState = rereloadedStateStoreEntry.GetValue <StateTestsPocoState>();

            Assert.AreEqual(3, rereloadedState.Count);

            //rereloadedStateStoreEntry.ETag = "*";

            //// write with wildcard etag should work
            //result3.updatePocoItem.Count = 100;
            //result3.updatePocoStoreItem.Count = 100;
            //result3.updatePocoStoreItem.eTag = "*";
            //result3.updateStoreItem.Count = 100;
            //result3.updateStoreItem.eTag = "*";
            //await stateStorageProvider.Write(result3);

            //dynamic result4 = await stateStorageProvider.Read(((StoreItems)storeItems).GetDynamicMemberNames().ToArray());
            //Assert.AreEqual(result3.updatePocoItem.Count, 100, "updatePocoItem.Count should be 100");
            //Assert.AreEqual(result3.updatePocoStoreItem.Count, 100, "updatePocoStoreItem.Count should be 100");
            //Assert.AreEqual(result3.updateStoreItem.Count, 100, "updateStoreItem.Count should be 100");

            //// write with empty etag should not work
            //try
            //{
            //    dynamic storeItemsUpdate = new StoreItems();
            //    storeItemsUpdate.updatePocoStoreItem = FlexObject.Clone(result4.updatePocoStoreItem);
            //    storeItemsUpdate.updatePocoStoreItem.eTag = "";
            //    await stateStorageProvider.Write(result);
            //    Assert.Fail("Should not throw exception on write with pocoStoreItem because of empty etag");
            //}
            //catch
            //{
            //}
            //try
            //{
            //    dynamic storeItemsUpdate = new StoreItems();
            //    storeItemsUpdate.updateStoreItem = FlexObject.Clone(result4.updateStoreItem);
            //    storeItemsUpdate.updateStoreItem.eTag = "";
            //    await stateStorageProvider.Write(result);
            //    Assert.Fail("Should not throw exception on write with storeItem because of empty etag");
            //}
            //catch
            //{
            //}

            //dynamic result5 = await stateStorageProvider.Read(((StoreItems)storeItems).GetDynamicMemberNames().ToArray());
            //Assert.AreEqual(result3.updatePocoItem.Count, 100, "updatePocoItem.Count should be 100");
            //Assert.AreEqual(result3.updatePocoStoreItem.Count, 100, "updatePocoStoreItem.Count should be 100");
            //Assert.AreEqual(result3.updateStoreItem.Count, 100, "updateStoreItem.Count should be 100");
        }