public void RemoveCallsGrain()
        {
            var key     = Guid.NewGuid().ToString();
            var factory = Mock.Of <IGrainFactory>(x => x.GetGrain <ICacheGrain>(key, null).RemoveAsync() == Task.CompletedTask);
            var clock   = new NullClock();
            var cache   = new OutkeepDistributedCache(factory, clock);

            cache.Remove(key);

            Mock.Get(factory).VerifyAll();
        }
        public async Task RefreshAsyncCallsGrain()
        {
            var key     = Guid.NewGuid().ToString();
            var factory = Mock.Of <IGrainFactory>(x => x.GetGrain <ICacheGrain>(key, null).RefreshAsync() == Task.CompletedTask);
            var clock   = new NullClock();
            var cache   = new OutkeepDistributedCache(factory, clock);

            await cache.RefreshAsync(key).ConfigureAwait(false);

            Mock.Get(factory).VerifyAll();
        }
        public void GetCallsGrain()
        {
            var key     = Guid.NewGuid().ToString();
            var value   = Guid.NewGuid().ToByteArray();
            var factory = Mock.Of <IGrainFactory>(x => x.GetGrain <ICacheGrain>(key, null).GetAsync() == new ValueTask <CachePulse>(new CachePulse(Guid.NewGuid(), value)));
            var clock   = new NullClock();
            var cache   = new OutkeepDistributedCache(factory, clock);

            var result = cache.Get(key);

            Assert.Same(value, result);
            Mock.Get(factory).VerifyAll();
        }
        public async Task SetAsyncCallsGrainWithNoExpiration()
        {
            var key               = Guid.NewGuid().ToString();
            var value             = Guid.NewGuid().ToByteArray();
            var slidingExpiration = TimeSpan.FromMinutes(1);
            var factory           = Mock.Of <IGrainFactory>(x => x.GetGrain <ICacheGrain>(key, null).SetAsync(new Immutable <byte[]?>(value), null, slidingExpiration) == Task.CompletedTask);
            var clock             = new NullClock();
            var cache             = new OutkeepDistributedCache(factory, clock);

            var options = new DistributedCacheEntryOptions
            {
                SlidingExpiration = slidingExpiration
            };
            await cache.SetAsync(key, value, options).ConfigureAwait(false);

            Mock.VerifyAll();
        }
        public void SetCallsGrain()
        {
            var key   = Guid.NewGuid().ToString();
            var value = Guid.NewGuid().ToByteArray();
            var absoluteExpiration = DateTimeOffset.UtcNow.AddHours(1);
            var slidingExpiration  = TimeSpan.FromMinutes(1);
            var factory            = Mock.Of <IGrainFactory>(x => x.GetGrain <ICacheGrain>(key, null).SetAsync(new Immutable <byte[]?>(value), absoluteExpiration, slidingExpiration) == Task.CompletedTask);
            var clock = new NullClock();
            var cache = new OutkeepDistributedCache(factory, clock);

            var options = new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = absoluteExpiration,
                SlidingExpiration  = slidingExpiration
            };

            cache.Set(key, value, options);

            Mock.VerifyAll();
        }
        public async Task SetAsyncCallsGrainWithRelativeAbsoluteExpiration()
        {
            var key   = Guid.NewGuid().ToString();
            var value = Guid.NewGuid().ToByteArray();
            var absoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1);
            var utcNow             = DateTimeOffset.UtcNow;
            var absoluteExpiration = utcNow.Add(absoluteExpirationRelativeToNow);
            var slidingExpiration  = TimeSpan.FromMinutes(1);
            var factory            = Mock.Of <IGrainFactory>(x => x.GetGrain <ICacheGrain>(key, null).SetAsync(new Immutable <byte[]?>(value), absoluteExpiration, slidingExpiration) == Task.CompletedTask);
            var clock = Mock.Of <ISystemClock>(x => x.UtcNow == utcNow);
            var cache = new OutkeepDistributedCache(factory, clock);

            var options = new DistributedCacheEntryOptions
            {
                AbsoluteExpirationRelativeToNow = absoluteExpirationRelativeToNow,
                SlidingExpiration = slidingExpiration
            };
            await cache.SetAsync(key, value, options).ConfigureAwait(false);

            Mock.VerifyAll();
        }