Question

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);
    }
Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top