コード例 #1
0
        public void CanNotGetItemAfterExpiration()
        {
            TimedEventMock timedEventMock = null;

            SystemClockMock  clock        = new SystemClockMock();
            TimerFactoryMock timerFactory = new TimerFactoryMock(
                timedEventMockFactory: (interval, runOnce, action) => {
                TimedEventMock result = new TimedEventMock(interval, runOnce, action);
                timedEventMock        = result;

                return(result);
            },
                timerMockFactory: null
                );

            const string key   = "test_key";
            const string value = "test_value";

            clock.UtcNow = DateTime.Now;
            TimeSpan expiration = TimeSpan.FromHours(1);

            using (InMemoryCache <string> cache = new InMemoryCache <string>(clock, timerFactory)) {
                cache.Set(key, value, expiration);

                clock.UtcNow += expiration + TimeSpan.FromSeconds(5);
                timedEventMock.Tick();

                Assert.IsFalse(cache.HasItemWithKey(key), $"Cache contains entry with key '{key}'.");
                Assert.ThrowsException <KeyNotFoundException>(() => cache.Get(key));
            }
        }
コード例 #2
0
        public void CanGetItemBeforeExpiration()
        {
            TimedEventMock timedEventMock = null;

            SystemClockMock  clock        = new SystemClockMock();
            TimerFactoryMock timerFactory = new TimerFactoryMock(
                timedEventMockFactory: (interval, runOnce, action) => {
                TimedEventMock result = new TimedEventMock(interval, runOnce, action);
                timedEventMock        = result;

                return(result);
            },
                timerMockFactory: null
                );

            const string key   = "test_key";
            const string value = "test_value";

            clock.UtcNow = DateTime.Now;
            TimeSpan expiration = TimeSpan.FromHours(1);

            using (InMemoryCache <string> cache = new InMemoryCache <string>(clock, timerFactory)) {
                cache.Set(key, value, expiration);

                clock.UtcNow += expiration - TimeSpan.FromMinutes(30);
                timedEventMock.Tick();

                Assert.IsTrue(cache.HasItemWithKey(key), $"Cache does not contain entry with key '{key}'.");

                string actual = cache.Get(key);

                Assert.AreEqual(value, actual);
            }
        }
コード例 #3
0
        public void CanSetMultipleItems()
        {
            SystemClockMock  clock        = new SystemClockMock();
            TimerFactoryMock timerFactory = new TimerFactoryMock(
                timedEventMockFactory: (x, y, z) => new EmptyDisposable(),
                timerMockFactory: null
                );

            Dictionary <string, string> values = new Dictionary <string, string>()
            {
                ["key1"] = "value1",
                ["key2"] = "value2"
            };

            using (InMemoryCache <string> cache = new InMemoryCache <string>(clock, timerFactory)) {
                foreach (var item in values)
                {
                    cache.Set(item.Key, item.Value, TimeSpan.FromTicks(1));
                }

                foreach (var item in values)
                {
                    Assert.IsTrue(cache.HasItemWithKey(item.Key), $"Cache does not contain entry with key '{item.Key}'.");
                    Assert.AreEqual(item.Value, cache.Get(item.Key));
                }
            }
        }
コード例 #4
0
        public async Task GetRefreshedExpiration_Test()
        {
            var now = await DateTimeOffsetHelper.CreateDateTimeOffsetAsync(2000);

            var systemClock = new SystemClockMock
            {
                UtcNow = now
            };

            var contextCache = await this.CreateContextCacheAsync(systemClock : systemClock);

            var initialExpires = now.AddSeconds(10);

            var cacheEntry = new CacheEntry <DateTimeOffset>
            {
                ExpiresAtTime = initialExpires
            };

            Assert.AreEqual(initialExpires, contextCache.GetRefreshedExpiration(cacheEntry));

            cacheEntry = new CacheEntry <DateTimeOffset>
            {
                ExpiresAtTime = initialExpires,
                SlidingExpirationInSeconds = 60
            };
            Assert.AreEqual(now.AddSeconds(60), contextCache.GetRefreshedExpiration(cacheEntry));

            cacheEntry = new CacheEntry <DateTimeOffset>
            {
                AbsoluteExpiration = now.AddHours(5),
                ExpiresAtTime      = initialExpires
            };
            Assert.AreEqual(initialExpires, contextCache.GetRefreshedExpiration(cacheEntry));

            cacheEntry = new CacheEntry <DateTimeOffset>
            {
                AbsoluteExpiration         = now.AddHours(5),
                ExpiresAtTime              = initialExpires,
                SlidingExpirationInSeconds = 60
            };
            Assert.AreEqual(now.AddSeconds(60), contextCache.GetRefreshedExpiration(cacheEntry));

            cacheEntry = new CacheEntry <DateTimeOffset>
            {
                AbsoluteExpiration         = now.AddSeconds(40),
                ExpiresAtTime              = initialExpires,
                SlidingExpirationInSeconds = 60
            };
            Assert.AreEqual(now.AddSeconds(40), contextCache.GetRefreshedExpiration(cacheEntry));
        }
コード例 #5
0
        public void CanSetItem()
        {
            SystemClockMock  clock        = new SystemClockMock();
            TimerFactoryMock timerFactory = new TimerFactoryMock(
                timedEventMockFactory: (x, y, z) => new EmptyDisposable(),
                timerMockFactory: null
                );

            const string key   = "test_key";
            const string value = "test_value";

            using (InMemoryCache <string> cache = new InMemoryCache <string>(clock, timerFactory)) {
                cache.Set(key, value, TimeSpan.FromTicks(1));
                Assert.IsTrue(cache.HasItemWithKey(key), $"Cache does not contain entry with key '{key}'.");
            }
        }
コード例 #6
0
        public void CanGetItem()
        {
            SystemClockMock  clock        = new SystemClockMock();
            TimerFactoryMock timerFactory = new TimerFactoryMock(
                timedEventMockFactory: (x, y, z) => new EmptyDisposable(),
                timerMockFactory: null
                );

            const string key   = "test_key";
            const string value = "test_value";

            using (InMemoryCache <string> cache = new InMemoryCache <string>(clock, timerFactory)) {
                cache.Set(key, value, TimeSpan.FromTicks(1));
                string actual = cache.Get(key);

                Assert.AreEqual(value, actual);
            }
        }
コード例 #7
0
        public void CanInvokeExpirationMethodWhenItemExpires()
        {
            TimedEventMock timedEventMock = null;

            SystemClockMock  clock        = new SystemClockMock();
            TimerFactoryMock timerFactory = new TimerFactoryMock(
                timedEventMockFactory: (interval, runOnce, action) => {
                TimedEventMock result = new TimedEventMock(interval, runOnce, action);
                timedEventMock        = result;

                return(result);
            },
                timerMockFactory: null
                );

            const string key   = "test_key";
            const string value = "test_value";

            clock.UtcNow = DateTime.Now;
            TimeSpan expiration = TimeSpan.FromHours(1);

            bool expirationMethodInvoked       = false;
            bool expirationEventIsFiredForItem = false;

            using (InMemoryCache <string> cache = new InMemoryCache <string>(clock, timerFactory)) {
                cache.TtlExpired += (o, expiredValue) => {
                    if (expiredValue == value)
                    {
                        expirationEventIsFiredForItem = true;
                    }
                };

                cache.Set(key, value, expiration, (x) => { expirationMethodInvoked = true; });

                clock.UtcNow += expiration + TimeSpan.FromSeconds(5);
                timedEventMock.Tick();

                Assert.IsTrue(expirationEventIsFiredForItem, $"{nameof(cache.TtlExpired)} is not fired for the expired item.");
                Assert.IsTrue(expirationMethodInvoked, "The method set to be execute on expiration of the item has not invoked.");
            }
        }
コード例 #8
0
        public void CanDisposeProperly()
        {
            TimedEventMock timedEventMock = null;

            SystemClockMock  clock        = new SystemClockMock();
            TimerFactoryMock timerFactory = new TimerFactoryMock(
                timedEventMockFactory: (interval, runOnce, action) => {
                TimedEventMock result = new TimedEventMock(interval, runOnce, action);
                timedEventMock        = result;

                return(result);
            },
                timerMockFactory: null
                );

            using (InMemoryCache <string> cache = new InMemoryCache <string>(clock, timerFactory)) {
                //do nothing here
            }

            Assert.IsTrue(timedEventMock.DisposeInvoked, $"Dispose method is not invoked on {nameof(timedEventMock)}.");
        }
コード例 #9
0
 public UnitTestContext(AuthenticationScheme authenticationScheme, Action <CertificateAuthenticationOptions> certificateAuthenticationOptionsConfigurer, HttpContextMock httpContext, LoggerFactoryMock loggerFactory, SystemClockMock systemClock, UrlEncoder urlEncoder)
 {
     this.AuthenticationScheme = authenticationScheme ?? throw new ArgumentNullException(nameof(authenticationScheme));
     this.CertificateAuthenticationOptionsMonitor = new OptionsMonitorMock <CertificateAuthenticationOptions>(certificateAuthenticationOptionsConfigurer);
     this.HttpContext   = httpContext ?? throw new ArgumentNullException(nameof(httpContext));
     this.LoggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
     this.SystemClock   = systemClock ?? throw new ArgumentNullException(nameof(systemClock));
     this.UrlEncoder    = urlEncoder ?? throw new ArgumentNullException(nameof(urlEncoder));
 }
コード例 #10
0
        public async Task GetExpirationInformation_Test()
        {
            var now = await DateTimeOffsetHelper.CreateDateTimeOffsetAsync(2000);

            var systemClock = new SystemClockMock
            {
                UtcNow = now
            };

            var contextCache = await this.CreateContextCacheAsync(systemClock : systemClock);

            var expirationInformation = contextCache.GetExpirationInformation(new DistributedCacheEntryOptions());

            Assert.IsNull(expirationInformation.AbsoluteExpiration);
            Assert.AreEqual(now.AddMinutes(20), expirationInformation.Expires);
            Assert.IsNotNull(expirationInformation.SlidingExpirationInSeconds);
            Assert.AreEqual(20 * 60, expirationInformation.SlidingExpirationInSeconds.Value);

            var absoluteExpiration = now.AddDays(2);
            var options            = new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = absoluteExpiration
            };

            expirationInformation = contextCache.GetExpirationInformation(options);
            Assert.IsNotNull(expirationInformation.AbsoluteExpiration);
            Assert.AreEqual(absoluteExpiration, expirationInformation.AbsoluteExpiration.Value);
            Assert.AreEqual(absoluteExpiration, expirationInformation.Expires);
            Assert.IsNull(expirationInformation.SlidingExpirationInSeconds);

            absoluteExpiration = now.AddDays(5);
            var absoluteExpirationRelativeToNow = TimeSpan.FromDays(5);

            options = new DistributedCacheEntryOptions
            {
                AbsoluteExpirationRelativeToNow = absoluteExpirationRelativeToNow
            };
            expirationInformation = contextCache.GetExpirationInformation(options);
            Assert.IsNotNull(expirationInformation.AbsoluteExpiration);
            Assert.AreEqual(absoluteExpiration, expirationInformation.AbsoluteExpiration.Value);
            Assert.AreEqual(absoluteExpiration, expirationInformation.Expires);
            Assert.IsNull(expirationInformation.SlidingExpirationInSeconds);

            options = new DistributedCacheEntryOptions
            {
                SlidingExpiration = TimeSpan.FromMinutes(50)
            };
            expirationInformation = contextCache.GetExpirationInformation(options);
            Assert.IsNull(expirationInformation.AbsoluteExpiration);
            Assert.AreEqual(now.AddMinutes(50), expirationInformation.Expires);
            Assert.IsNotNull(expirationInformation.SlidingExpirationInSeconds);
            Assert.AreEqual(50 * 60, expirationInformation.SlidingExpirationInSeconds.Value);

            options = new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = now.AddDays(5),
                AbsoluteExpirationRelativeToNow = TimeSpan.FromDays(15),
                SlidingExpiration = TimeSpan.FromMinutes(40)
            };
            expirationInformation = contextCache.GetExpirationInformation(options);
            Assert.IsNotNull(expirationInformation.AbsoluteExpiration);
            Assert.AreEqual(now.AddDays(15), expirationInformation.AbsoluteExpiration.Value);
            Assert.AreEqual(now.AddMinutes(40), expirationInformation.Expires);
            Assert.IsNotNull(expirationInformation.SlidingExpirationInSeconds);
            Assert.AreEqual(40 * 60, expirationInformation.SlidingExpirationInSeconds.Value);

            options = new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = now.AddDays(5),
                SlidingExpiration  = TimeSpan.FromMinutes(40)
            };
            expirationInformation = contextCache.GetExpirationInformation(options);
            Assert.IsNotNull(expirationInformation.AbsoluteExpiration);
            Assert.AreEqual(now.AddDays(5), expirationInformation.AbsoluteExpiration.Value);
            Assert.AreEqual(now.AddMinutes(40), expirationInformation.Expires);
            Assert.IsNotNull(expirationInformation.SlidingExpirationInSeconds);
            Assert.AreEqual(40 * 60, expirationInformation.SlidingExpirationInSeconds.Value);

            options = new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = now.AddDays(5),
                AbsoluteExpirationRelativeToNow = TimeSpan.FromDays(15)
            };
            expirationInformation = contextCache.GetExpirationInformation(options);
            Assert.IsNotNull(expirationInformation.AbsoluteExpiration);
            Assert.AreEqual(now.AddDays(15), expirationInformation.AbsoluteExpiration.Value);
            Assert.AreEqual(now.AddDays(15), expirationInformation.Expires);
            Assert.IsNull(expirationInformation.SlidingExpirationInSeconds);
        }