Пример #1
0
        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 RedisSessionStateProvider();
                await ssp.CreateUninitializedItemAsync(null, sessionId, (int)RedisSessionStateProvider.configuration.SessionTimeout.TotalMinutes, CancellationToken.None);

                // Get write lock and session from cache
                GetItemResult data = await ssp.GetItemExclusiveAsync(null, 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(null, sessionId, data.Item, data.LockId, false, CancellationToken.None);

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

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

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

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

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

                // remove data and lock from redis
                DisposeRedisConnectionWrapper();
            }
        }
        public async Task GetItemExclusive_RecordFound()
        {
            Utility.SetConfigUtilityToDefault();
            string              id = "session-id";
            bool                locked;
            TimeSpan            lockAge;
            object              lockId = null;
            SessionStateActions actions;

            ISessionStateItemCollection sessionStateItemCollection = Utility.GetChangeTrackingSessionStateItemCollection();

            sessionStateItemCollection["session-key"] = "session-value";
            SessionStateStoreData sssd = new SessionStateStoreData(sessionStateItemCollection, null, 15);

            ISessionStateItemCollection sessionData = Utility.GetChangeTrackingSessionStateItemCollection();

            sessionData["session-key"] = "session-value";

            ISessionStateItemCollection mockSessionData = null;
            object mockLockId = 0;
            int    mockSessionTimeout;
            int    sessionTimeout = (int)RedisSessionStateProvider.configuration.SessionTimeout.TotalMinutes;
            var    mockCache      = A.Fake <ICacheConnection>();

            A.CallTo(() => mockCache.TryTakeWriteLockAndGetData(A <DateTime> .Ignored, 90, out mockLockId, out mockSessionData, out mockSessionTimeout)).Returns(true).AssignsOutAndRefParameters(0, sessionData, (int)RedisSessionStateProvider.configuration.SessionTimeout.TotalMinutes);

            RedisSessionStateProvider sessionStateStore = new RedisSessionStateProvider();

            sessionStateStore.cache = mockCache;
            SessionStateStoreData sessionStateStoreData;

            GetItemResult data = await sessionStateStore.GetItemExclusiveAsync(null, id, CancellationToken.None);

            sessionStateStoreData = data.Item;
            locked  = data.Locked;
            lockAge = data.LockAge;
            lockId  = data.LockId;
            actions = data.Actions;

            A.CallTo(() => mockCache.TryTakeWriteLockAndGetData(A <DateTime> .Ignored, 90, out mockLockId, out sessionData, out sessionTimeout)).MustHaveHappened();

            Assert.True(Utility.CompareSessionStateStoreData(sessionStateStoreData, sssd));
            Assert.False(locked);
            Assert.Equal(TimeSpan.Zero, lockAge);
            Assert.Equal(SessionStateActions.None, actions);
        }
        public async Task GetItemExclusive_RecordLocked()
        {
            Utility.SetConfigUtilityToDefault();
            string              id = "session-id";
            bool                locked;
            TimeSpan            lockAge;
            object              lockId = null;
            SessionStateActions actions;

            object mockLockId = 0;
            ISessionStateItemCollection sessionData = null;
            int sessionTimeout;
            var mockCache = A.Fake <ICacheConnection>();

            A.CallTo(() => mockCache.TryTakeWriteLockAndGetData(A <DateTime> .Ignored, 90, out mockLockId, out sessionData, out sessionTimeout)).Returns(false);
            A.CallTo(() => mockCache.GetLockAge(A <object> .Ignored)).Returns(TimeSpan.Zero);


            RedisSessionStateProvider sessionStateStore = new RedisSessionStateProvider();

            sessionStateStore.cache = mockCache;
            SessionStateStoreData sessionStateStoreData;

            GetItemResult data = await sessionStateStore.GetItemExclusiveAsync(null, id, CancellationToken.None);

            sessionStateStoreData = data.Item;
            locked  = data.Locked;
            lockAge = data.LockAge;
            lockId  = data.LockId;
            actions = data.Actions;

            A.CallTo(() => mockCache.TryTakeWriteLockAndGetData(A <DateTime> .Ignored, 90, out mockLockId, out sessionData, out sessionTimeout)).MustHaveHappened();
            A.CallTo(() => mockCache.GetLockAge(A <object> .Ignored)).MustHaveHappened();

            Assert.Null(sessionStateStoreData);
            Assert.True(locked);
        }