public async Task ClearCacheTest1Async() { var propertyManager = new MockPropertyManagerWrapper { SubmitPropertyBatchAsyncFunc = Workflow3 }; Guid activityId = Guid.NewGuid(); IVersionedPropertyStore versionedPropertyStore = await VersionedPropertyStore.CreateAsync( activityId, traceType, defaultStoreName, propertyManager, retryPolicyFactory).ConfigureAwait(false); IVersionedKeyValue vkv = await versionedPropertyStore.GetValueAsync(activityId, "A").ConfigureAwait(false); VerifyVersionedKeyValue(vkv, "Apple", 2, 1, workflow3Counter); IVersionedKeyValue vkv2 = await versionedPropertyStore.GetValueAsync(activityId, "A").ConfigureAwait(false); // verify that the counter hasn't been incremented since the actual property manager hasn't been invoked // but the value has been obtained from the cache VerifyVersionedKeyValue(vkv2, "Apple", 2, 1, workflow3Counter); versionedPropertyStore.ClearCache(); IVersionedKeyValue vkv3 = await versionedPropertyStore.GetValueAsync(activityId, "A").ConfigureAwait(false); // verify that the counter has been incremented since the actual property manager has been invoked // since the value has been cleared from the cache VerifyVersionedKeyValue(vkv3, "Apple", 2, 2, workflow3Counter); Assert.AreEqual(workflow3Counter, 2); }
public async Task UpdateValueAsyncTest1Async() { var propertyManager = new MockPropertyManagerWrapper { SubmitPropertyBatchAsyncFunc = Workflow2 }; Guid activityId = Guid.NewGuid(); IVersionedPropertyStore versionedPropertyStore = await VersionedPropertyStore.CreateAsync( activityId, traceType, defaultStoreName, propertyManager, retryPolicyFactory).ConfigureAwait(false); await versionedPropertyStore.UpdateValueAsync(activityId, "A", "Apple").ConfigureAwait(false); IVersionedKeyValue vkv = await versionedPropertyStore.GetValueAsync(activityId, "A"); // Cache is updated correctly after UpdateValueAsync so hitting remote store is not needed VerifyVersionedKeyValue(vkv, "Apple", 0, 1, workflow2Counter); // now, get from the remote store. (workflow2 is modified to send appropriate return values) vkv = await versionedPropertyStore.GetValueAsync(activityId, "A", false); VerifyVersionedKeyValue(vkv, "Antelope", 25, 2, workflow2Counter); vkv = await versionedPropertyStore.GetValueAsync(activityId, "A"); // verify cache is updated correctly VerifyVersionedKeyValue(vkv, "Antelope", 25, 2, workflow2Counter); }
private static void VerifyVersionedKeyValue(IVersionedKeyValue vkv, string value, long version, int expectedCounterValue, int actualCounterValue) { Assert.IsNotNull(vkv); Assert.AreEqual(vkv.Value, value); Assert.AreEqual(vkv.Version, version); Assert.AreEqual(expectedCounterValue, actualCounterValue); }
private IVersionedKeyValue UpdateCache(Guid activityId, IVersionedKeyValue vkv) { lock (locker) { if (cachedProperties.ContainsKey(vkv.Key)) { var existingVkv = cachedProperties[vkv.Key]; if (existingVkv.Version >= vkv.Version) { traceType.WriteWarning( "UpdateCache ignored for store name '{0}'. Current local cache data is newer than data to be updated. Current local cache data: {1}{2}Data to be updated: {3}{4}ActivityId: {5}", storeName, existingVkv, Environment.NewLine, vkv, Environment.NewLine, activityId); return(existingVkv); } } cachedProperties[vkv.Key] = vkv; return(vkv); } }
public async Task GetValueAsyncTest1Async() { var propertyManager = new MockPropertyManagerWrapper { SubmitPropertyBatchAsyncFunc = Workflow1 }; Guid activityId = Guid.NewGuid(); IVersionedPropertyStore versionedPropertyStore = await VersionedPropertyStore.CreateAsync( activityId, traceType, defaultStoreName, propertyManager, retryPolicyFactory).ConfigureAwait(false); IVersionedKeyValue vkv = await versionedPropertyStore.GetValueAsync(activityId, "A").ConfigureAwait(false); VerifyVersionedKeyValue(vkv, "Apple", 2, 1, workflow1Counter); vkv = await versionedPropertyStore.GetValueAsync(activityId, "A").ConfigureAwait(false); // Verifying that remote store is not hit now and data is fetched from cache VerifyVersionedKeyValue(vkv, "Apple", 2, 1, workflow1Counter); }