public void BasicCacheActionElementCount_Ok()
        {
            //Arrange
            string cacheName = "CacheForTest";
            ICacheManager cacheManager = new CacheManager(cacheName);

            //Act
            var result = cacheManager.ElementsCount();

            //Assert
            Assert.IsTrue(result == 0, "Just created cache should have 0 elements");
        }
        public void BasicCacheActionGetExisting_Ok()
        {
            //Arrange
            string cacheName = "CacheForTest";
            ICacheManager cacheManager = new CacheManager(cacheName);
            var dummyValue = DummyObject.GetAnInstance();

            //Act
            cacheManager.Set(dummyValue);
            var result = cacheManager.Get(dummyValue.GetUniqueHash());

            //Assert
            Assert.IsNotNull(result, "Existing key should not return null value");
            Assert.IsTrue(dummyValue.Equals(result), "Objects are not the same");
        }
        public void DeleteWithSyncOn2LevelsCache_Ok()
        {
            //Arrange
            var level2CacheMock = new Mock<ICacheManager>();
            ICacheManager cacheManager = new CacheManager("CacheForTest", masterCache: level2CacheMock.Object);

            //Act
            cacheManager.Delete(string.Empty, SyncMode.Sync);

            //Assert
            level2CacheMock.Verify(x => x.Set(It.IsAny<CacheableEntity>(), It.IsAny<SyncMode>()), Times.Never);
            level2CacheMock.Verify(x => x.Get(It.IsAny<string>(), It.IsAny<SyncMode>()), Times.Never);
            level2CacheMock.Verify(x => x.Delete(It.IsAny<string>(), It.IsAny<SyncMode>()), Times.Once);
            level2CacheMock.Verify(x => x.ClearCache(), Times.Never);
            level2CacheMock.Verify(x => x.ElementsCount(), Times.Never);
        }
        public void BasicCacheActionDelete_Ok()
        {
            //Arrange
            string cacheName = "CacheForTest";
            ICacheManager cacheManager = new CacheManager(cacheName);
            var dummyValue = DummyObject.GetAnInstance();

            //Act
            cacheManager.Set(dummyValue);
            var totalElementsBeforeDelete = cacheManager.ElementsCount();

            cacheManager.Delete(dummyValue.GetUniqueHash());
            var totalElementsAfterDelete = cacheManager.ElementsCount();

            //Assert
            Assert.IsTrue(totalElementsBeforeDelete == 1, "We should have just one element within the cache");
            Assert.IsTrue(totalElementsAfterDelete == 0, "We should have zero elements within the cache");
        }
        static void Main(string[] args)
        {
            ChannelFactory<ICacheManager> channelFactory = new ChannelFactory<ICacheManager>("*");
            ICacheManager masterCache = channelFactory.CreateChannel();

            IPersistenceEngine persistenceEngine = new XmlFilePersistenceEngine(@".\CacheContent\");

            ICacheManager cacheManager = new CacheManager("LocalCache", persistenceEngine, masterCache);

            var engine_A = new Engine() { Id = 1, Description = "This is the engine A" };

            cacheManager.Set(engine_A, SyncMode.SyncParent);
            var getResult_1 = cacheManager.Get(engine_A.GetUniqueHash());

            cacheManager.Delete(engine_A.GetUniqueHash());
            var getResult_3 = cacheManager.Get(engine_A.GetUniqueHash());

            var getResult_5 = cacheManager.Get(engine_A.GetUniqueHash(), SyncMode.SyncParent);
            var getResult_6 = cacheManager.Get(engine_A.GetUniqueHash());
        }
        public void DeleteWithParentSyncOn3LevelsCache_Ok()
        {
            //Arrange
            var level3CacheMock = new Mock<ICacheManager>();
            ICacheManager level2Cache = new CacheManager("CacheForTestLevel2", masterCache: level3CacheMock.Object);
            ICacheManager level1Cache = new CacheManager("CacheForTestLevel2", masterCache: level2Cache);
            var dummyValue = DummyObject.GetAnInstance();
            level1Cache.Set(dummyValue);
            level2Cache.Set(dummyValue);

            //Act
            level1Cache.Delete(dummyValue.GetUniqueHash(), SyncMode.SyncParent);

            //Assert
            Assert.IsTrue(level2Cache.ElementsCount() == 0, "Parent sync should delete the value from level 2 cache");
            Assert.IsTrue(level1Cache.ElementsCount() == 0, "Parent sync should delte the value from level 1 cache");

            level3CacheMock.Verify(x => x.Set(It.IsAny<CacheableEntity>(), It.IsAny<SyncMode>()), Times.Never);
            level3CacheMock.Verify(x => x.Get(It.IsAny<string>(), It.IsAny<SyncMode>()), Times.Never);
            level3CacheMock.Verify(x => x.Delete(It.IsAny<string>(), It.IsAny<SyncMode>()), Times.Never);
            level3CacheMock.Verify(x => x.ClearCache(), Times.Never);
            level3CacheMock.Verify(x => x.ElementsCount(), Times.Never);
        }
        public void BasicCacheActionGetNonExisting_Ok()
        {
            //Arrange
            string cacheName = "CacheForTest";
            ICacheManager cacheManager = new CacheManager(cacheName);

            //Act
            var result = cacheManager.Get("NonExisitingKey");

            //Assert
            Assert.IsNull(result, "Non existing key should return null value");
        }
        public void BasicCacheCreation_Ok()
        {
            //Arrange
            string cacheName = "CacheForTest";
            ICacheManager cacheManager = new CacheManager(cacheName);

            //Act

            //Assert
            Assert.IsTrue((cacheManager as CacheManager).CacheName == cacheName, "Name was not properly set");
            Assert.IsFalse((cacheManager as CacheManager).IsSlaveCache, "Cache was not marked as expected (should not be a slave cache since we didn't provide a master cache)");
        }
        public void BasicCacheActionSet_Ok()
        {
            //Arrange
            string cacheName = "CacheForTest";
            ICacheManager cacheManager = new CacheManager(cacheName);
            var dummyValue = DummyObject.GetAnInstance();

            //Act
            cacheManager.Set(dummyValue);
            var totalElements = cacheManager.ElementsCount();

            //Assert
            Assert.IsTrue(totalElements == 1, "We should have just one element within the cache");
        }
        public void SetWithoutSyncOn2LevelsCache_Ok()
        {
            //Arrange
            var level2CacheMock = new Mock<ICacheManager>();
            ICacheManager cacheManager = new CacheManager("CacheForTest", masterCache: level2CacheMock.Object);
            var dummyValue = DummyObject.GetAnInstance();

            //Act
            cacheManager.Set(dummyValue, SyncMode.NoSync);

            //Assert
            level2CacheMock.Verify(x => x.Get(It.IsAny<string>(), It.IsAny<SyncMode>()), Times.Never);
            level2CacheMock.Verify(x => x.Set(It.IsAny<CacheableEntity>(), It.IsAny<SyncMode>()), Times.Never);
            level2CacheMock.Verify(x => x.Delete(It.IsAny<string>(), It.IsAny<SyncMode>()), Times.Never);
            level2CacheMock.Verify(x => x.ClearCache(), Times.Never);
            level2CacheMock.Verify(x => x.ElementsCount(), Times.Never);
        }
        public void GetWithParentSyncOn3LevelsCache_Ok()
        {
            //Arrange
            var level3CacheMock = new Mock<ICacheManager>();
            ICacheManager level2Cache = new CacheManager("CacheForTestLevel2", masterCache: level3CacheMock.Object);
            ICacheManager level1Cache = new CacheManager("CacheForTestLevel2", masterCache: level2Cache);
            var dummyValue = DummyObject.GetAnInstance();
            level2Cache.Set(dummyValue);

            //Act
            var result = level1Cache.Get(dummyValue.GetUniqueHash(), SyncMode.SyncParent);

            //Assert
            Assert.IsTrue(level2Cache.ElementsCount() == 1, "Parent sync should should keep value unchanged");
            Assert.IsNotNull(result, "REsult should not be null");
            Assert.IsTrue(dummyValue.Equals(dummyValue), "Retrieved value should be the same one we set on lvl 2 cache");

            level3CacheMock.Verify(x => x.Set(It.IsAny<CacheableEntity>(), It.IsAny<SyncMode>()), Times.Never);
            level3CacheMock.Verify(x => x.Get(It.IsAny<string>(), It.IsAny<SyncMode>()), Times.Never);
            level3CacheMock.Verify(x => x.Delete(It.IsAny<string>(), It.IsAny<SyncMode>()), Times.Never);
            level3CacheMock.Verify(x => x.ClearCache(), Times.Never);
            level3CacheMock.Verify(x => x.ElementsCount(), Times.Never);
        }