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); }