public async Task SessionReadCycle_Valid()
        {
            using (RedisServer redisServer = new RedisServer())
            {
                string sessionId = ResetRedisConnectionWrapperAndConfiguration();

                // Inserting empty session with "SessionStateActions.InitializeItem" flag into redis server
                RedisSessionStateProvider ssp = new Oriflame.Web.Redis.RedisSessionStateProvider();
                await ssp.CreateUninitializedItemAsync(FakeHttpContext, sessionId, (int)RedisSessionStateProvider.configuration.SessionTimeout.TotalMinutes, CancellationToken.None);

                // Get write lock and session from cache
                GetItemResult data = await ssp.GetItemAsync(FakeHttpContext, sessionId, CancellationToken.None);

                // Get actual connection and varify lock and session timeout
                IDatabase actualConnection = GetRealRedisConnection();
                Assert.True(actualConnection.StringGet(ssp.cache.Keys.LockKey).IsNull);
                Assert.Equal(((int)RedisSessionStateProvider.configuration.SessionTimeout.TotalSeconds).ToString(), actualConnection.HashGet(ssp.cache.Keys.InternalKey, "SessionTimeout").ToString());

                // reset sessions timoue
                await ssp.ResetItemTimeoutAsync(FakeHttpContext, sessionId, CancellationToken.None);

                // End request
                await ssp.EndRequestAsync(null);

                // remove data and lock from redis
                DisposeRedisConnectionWrapper();
            }
        }
        public async Task SessionSetVersion_WithLocking_Valid()
        {
            using (new RedisServer())
            {
                var sessionId = ResetRedisConnectionWrapperAndConfiguration();

                RedisSessionStateProvider.configuration = null;

                // Inserting empty session with "SessionStateActions.InitializeItem" flag into redis server
                var ssp = new Oriflame.Web.Redis.RedisSessionStateProvider();

                var config = new NameValueCollection
                {
                    ["redisSerializerType"] = typeof(RawStringSerializer).AssemblyQualifiedName,
                    ["port"] = "0",
                    ["ssl"]  = "false",
                    [ApplicationVersionCheckInterceptor.VersionConfigAttributeName] = "1.2.3.4",
                    [Oriflame.Web.Redis.RedisSessionStateProvider.SessionVersionProviderTypeAttributeName] = typeof(ApplicationVersionCheckInterceptor).FullName
                };

                ssp.Initialize("ssp", config);

                await ssp.CreateUninitializedItemAsync(FakeHttpContext, sessionId, (int)RedisSessionStateProvider.configuration.SessionTimeout.TotalMinutes, CancellationToken.None);

                // Get write lock and session from cache
                var data = await ssp.GetItemExclusiveAsync(FakeHttpContext, sessionId, CancellationToken.None);

                // Get actual connection and verify lock and session timeout
                var actualConnection = GetRealRedisConnection();
                Assert.Equal(data.LockId.ToString(), actualConnection.StringGet(ssp.cache.Keys.LockKey).ToString());
                Assert.Equal(((int)RedisSessionStateProvider.configuration.SessionTimeout.TotalSeconds).ToString(), actualConnection.HashGet(ssp.cache.Keys.InternalKey, "SessionTimeout").ToString());

                // setting data as done by any normal session operation
                data.Item.Items["key"] = "value";

                // session update
                await ssp.SetAndReleaseItemExclusiveAsync(FakeHttpContext, sessionId, data.Item, data.LockId, false, CancellationToken.None);

                Assert.Equal(2, actualConnection.HashGetAll(ssp.cache.Keys.DataKey).Length);

                // simulation of invalid version
                actualConnection.HashSet(ssp.cache.Keys.DataKey,
                                         new[] { new HashEntry(ApplicationVersionCheckInterceptor.SessionVersionKey, "modified-by-test") });

                var ssp2 = new Oriflame.Web.Redis.RedisSessionStateProvider();
                ssp2.Initialize("ssp2", config);
                var data2 = await ssp2.GetItemExclusiveAsync(FakeHttpContext, sessionId, CancellationToken.None);

                Assert.Equal(1, data2.Item.Items.Count);

                //var items2 = data2.Item.Items.Keys;

                data2.Item.Items["test2"] = "test value";

                await ssp2.SetAndReleaseItemExclusiveAsync(FakeHttpContext, sessionId, data2.Item, data2.LockId, false, CancellationToken.None);

                Assert.Equal(2, actualConnection.HashGetAll(ssp2.cache.Keys.DataKey).Length);
                DisposeRedisConnectionWrapper();
            }
        }
        public async Task RemoveItemWithNullLockId()
        {
            using (RedisServer redisServer = new RedisServer())
            {
                string sessionId = ResetRedisConnectionWrapperAndConfiguration();
                RedisSessionStateProvider ssp = new Oriflame.Web.Redis.RedisSessionStateProvider();
                await ssp.RemoveItemAsync(null, sessionId, null, null, CancellationToken.None);

                DisposeRedisConnectionWrapper();
            }
        }
        public async Task SessionTimoutChangeFromGlobalAspx()
        {
            using (RedisServer redisServer = new RedisServer())
            {
                string sessionId = ResetRedisConnectionWrapperAndConfiguration();

                // Inserting empty session with "SessionStateActions.InitializeItem" flag into redis server
                RedisSessionStateProvider ssp = new Oriflame.Web.Redis.RedisSessionStateProvider();
                await ssp.CreateUninitializedItemAsync(FakeHttpContext, sessionId, (int)RedisSessionStateProvider.configuration.SessionTimeout.TotalMinutes, CancellationToken.None);

                // Get write lock and session from cache
                GetItemResult data = await ssp.GetItemExclusiveAsync(FakeHttpContext, sessionId, CancellationToken.None);

                // Get actual connection and varify lock and session timeout
                IDatabase actualConnection = GetRealRedisConnection();
                Assert.Equal(data.LockId.ToString(), actualConnection.StringGet(ssp.cache.Keys.LockKey).ToString());
                Assert.Equal(((int)RedisSessionStateProvider.configuration.SessionTimeout.TotalSeconds).ToString(), actualConnection.HashGet(ssp.cache.Keys.InternalKey, "SessionTimeout").ToString());

                // setting data as done by any normal session operation
                data.Item.Items["key"] = "value";
                data.Item.Timeout      = 5;

                // session update
                await ssp.SetAndReleaseItemExclusiveAsync(FakeHttpContext, sessionId, data.Item, data.LockId, false, CancellationToken.None);

                Assert.Equal(1, actualConnection.HashGetAll(ssp.cache.Keys.DataKey).Length);
                Assert.Equal("300", actualConnection.HashGet(ssp.cache.Keys.InternalKey, "SessionTimeout").ToString());

                // reset sessions timoue
                await ssp.ResetItemTimeoutAsync(FakeHttpContext, sessionId, CancellationToken.None);

                // End request
                await ssp.EndRequestAsync(FakeHttpContext);

                // Verify that GetItemExclusive returns timeout from redis
                GetItemResult data_1 = await ssp.GetItemExclusiveAsync(FakeHttpContext, sessionId, CancellationToken.None);

                Assert.Equal(5, data.Item.Timeout);

                // remove data and lock from redis
                DisposeRedisConnectionWrapper();
            }
        }