In Console application, I can successfully get a call back from cache cluster in case an item is added or removed from the cache.
How can I execute the same test in Test Driven environment. When I write the test case, I do not get the OnCacheChange to fire..
Please help.
Thanks..
Following code works in Console application...
static void Main(string[] args)
{
dtStart = DateTime.Now;
dtEnd = DateTime.MinValue;
string line;
var factory = new DataCacheFactory();
var key = "mycachekey1";
var cache = factory.GetCache("default");
var d = cache.AddCacheLevelCallback(DataCacheOperations.AddItem | DataCacheOperations.RemoveItem | DataCacheOperations.ReplaceItem, OnCacheChange);
Console.WriteLine("Cache Name = {0} : DelegateId = {1}",d.CacheName,d.DelegateId);
var obj = cache[key];
if (obj == null)
{
Console.WriteLine("data was not cached.");
Console.WriteLine("Enter your data to be cached.");
line = Console.ReadLine();
cache.Add(key, line);
}
Console.WriteLine("getting data from cache: {0}", cache[key]);
Console.WriteLine("type yes to remove data for cache key {0} : ", key);
line = Console.ReadLine();
if (line.ToString().Length > 0)
{
cache.Remove(key);
Console.WriteLine("cache removed");
Console.ReadLine();
}
}
static void OnCacheChange(string cacheName, string region, string key, DataCacheItemVersion itemVersion, DataCacheOperations operationId, DataCacheNotificationDescriptor notificationDescriptor)
{
dtEnd = DateTime.Now;
TimeSpan timeSpan = dtEnd - dtStart;
Console.WriteLine("Event to be fired in seconds = {0}", timeSpan.Seconds);
Console.WriteLine("A cache-level notification has been triggered. Following are the details:");
Console.WriteLine("Cache: " + cacheName);
Console.WriteLine("Region: " + region);
Console.WriteLine("Key: " + key);
Console.WriteLine("Operation: " + operationId.ToString());
Console.WriteLine("Notification Description: " + notificationDescriptor.DelegateId);
Console.WriteLine("Finished executing the cache notification callback.");
}
Following TestMethod is not able to fire the OnCacheChange event.
[TestMethod]
public void CacheCallBackFunctionTest()
{
_eventFired = false;
_startDateTime = DateTime.Now;
var key = "mycachekey2";
var cache = CachingManager.CacheFactory().GetCache("default");
cache.AddCacheLevelCallback(DataCacheOperations.AddItem | DataCacheOperations.RemoveItem | DataCacheOperations.ReplaceItem, OnCacheChange);
cache.Add(key, "my value 1");
cache.Remove(key);
System.Threading.Thread.Sleep(10000);
Assert.IsTrue(_eventFired);
}
It's not clear from the scope of your question that the test callback is actually touching _eventFired
. This should work, however:
bool eventFired = false;
var reset = new System.Threading.ManualResetEvent(true);
cache.AddCacheLevelCallback(DataCacheOperations.AddItem | DataCacheOperations.RemoveItem,
(cacheName, region, key, itemVersion, operationId, notificationDescriptor) => {
eventFired = true;
reset.Set();
});
cache.Add(key, "my value 1");
if (!reset.WaitOne(TimeSpan.FromSeconds(10)))
{
throw new Exception("Didn't receive cache callback after 10 seconds");
}
Assert.IsTrue(eventFired);
Above I wrote the callback inline as a lambda, so that it's clear the _eventFired
gets updated on the callback. I also used a ManualResetEvent
, so that the test thread proceeds when the callback is fired, rather than waiting a hard-coded 10 seconds.