public void TryTakeReadLockAndGetData_WithoutAnyLock()
        {
            ProviderConfiguration pc = Utility.GetDefaultConfigUtility();

            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection(new RedisUtility(pc));
                data["key"] = "value";
                redisConn.Set(data, 900);

                object lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                Assert.True(redisConn.TryCheckWriteLockAndGetData(out lockId, out dataFromRedis, out sessionTimeout));
                Assert.Equal(null, lockId);
                Assert.Equal(1, dataFromRedis.Count);
                Assert.Equal("value", dataFromRedis["key"]);

                // Get actual connection
                // remove data from redis
                IDatabase actualConnection = GetRealRedisConnection(redisConn);
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
        public void TryCheckWriteLockAndGetData_Valid()
        {
            string id = "session_id";
            object lockId;
            ISessionStateItemCollection data;

            RedisConnectionWrapper.sharedConnection = A.Fake <RedisSharedConnection>();
            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), id);

            redisConn.redisConnection = A.Fake <IRedisClientConnection>();

            object[] sessionData     = { "Key", RedisUtility.GetBytesFromObject("Key", "value") };
            object[] returnFromRedis = { "", sessionData, "15" };
            ChangeTrackingSessionStateItemCollection sessionDataReturn = Utility.GetChangeTrackingSessionStateItemCollection();

            sessionDataReturn["key"] = "value";

            A.CallTo(() => redisConn.redisConnection.Eval(A <string> .Ignored, A <string[]> .That.Matches(s => s.Length == 3),
                                                          A <object[]> .That.Matches(o => o.Length == 0))).Returns(returnFromRedis);
            A.CallTo(() => redisConn.redisConnection.GetLockId(A <object> .Ignored)).Returns("");
            A.CallTo(() => redisConn.redisConnection.GetSessionData(A <object> .Ignored)).Returns(sessionDataReturn);
            A.CallTo(() => redisConn.redisConnection.GetSessionTimeout(A <object> .Ignored)).Returns(15);

            int sessionTimeout;

            Assert.True(redisConn.TryCheckWriteLockAndGetData(out lockId, out data, out sessionTimeout));
            Assert.Equal(null, lockId);
            Assert.Equal(1, data.Count);
            Assert.Equal(15, sessionTimeout);
            A.CallTo(() => redisConn.redisConnection.Eval(A <string> .Ignored, A <string[]> .That.Matches(s => s.Length == 3),
                                                          A <object[]> .That.Matches(o => o.Length == 0))).MustHaveHappened();
            A.CallTo(() => redisConn.redisConnection.GetLockId(A <object> .Ignored)).MustHaveHappened();
            A.CallTo(() => redisConn.redisConnection.GetSessionData(A <object> .Ignored)).MustHaveHappened();
            A.CallTo(() => redisConn.redisConnection.GetSessionTimeout(A <object> .Ignored)).MustHaveHappened();
        }
Esempio n. 3
0
        public void TryTakeReadLockAndGetData_WithOtherWriteLock()
        {
            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection();
                data["key"] = "value";
                redisConn.Set(data, 900);

                int lockTimeout = 900;

                DateTime lockTime_1 = DateTime.Now;
                object   lockId_1;
                ISessionStateItemCollection dataFromRedis_1;
                int sessionTimeout;
                Assert.True(redisConn.TryTakeWriteLockAndGetData(lockTime_1, lockTimeout, out lockId_1, out dataFromRedis_1, out sessionTimeout));
                Assert.Equal(lockTime_1.Ticks.ToString(), lockId_1.ToString());
                Assert.Equal(1, dataFromRedis_1.Count);

                object lockId_2;
                ISessionStateItemCollection dataFromRedis_2;
                Assert.False(redisConn.TryCheckWriteLockAndGetData(out lockId_2, out dataFromRedis_2, out sessionTimeout));
                Assert.Equal(lockTime_1.Ticks.ToString(), lockId_2.ToString());
                Assert.Equal(null, dataFromRedis_2);

                // Get actual connection
                // remove data and lock from redis
                IDatabase actualConnection = GetRealRedisConnection(redisConn);
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                actualConnection.KeyDelete(redisConn.Keys.LockKey);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
Esempio n. 4
0
        public void TryRemoveIfLockIdMatch_NullLockId()
        {
            ProviderConfiguration pc = Utility.GetDefaultConfigUtility();

            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection(new RedisUtility(pc));
                data["key"] = "value";
                redisConn.Set(data, 900);

                object lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                Assert.True(redisConn.TryCheckWriteLockAndGetData(out lockId, out dataFromRedis, out sessionTimeout));
                Assert.Null(lockId);
                Assert.Single(dataFromRedis);

                redisConn.TryRemoveAndReleaseLock(null);

                // Get actual connection and get data from redis
                IDatabase actualConnection = GetRealRedisConnection(redisConn);
                Assert.False(actualConnection.KeyExists(redisConn.Keys.DataKey));

                // check lock removed from redis
                Assert.False(actualConnection.KeyExists(redisConn.Keys.LockKey));
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
Esempio n. 5
0
        public void TryUpdateIfLockIdMatch_LockIdNull()
        {
            ProviderConfiguration pc = Utility.GetDefaultConfigUtility();

            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection(new RedisUtility(pc));
                data["key1"] = "value1";
                redisConn.Set(data, 900);

                DateTime lockTime = DateTime.Now;
                object   lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                Assert.True(redisConn.TryCheckWriteLockAndGetData(out lockId, out dataFromRedis, out sessionTimeout));
                Assert.Null(lockId);
                Assert.Single(dataFromRedis);

                // update session data without lock id (to support lock free session)
                dataFromRedis["key1"] = "value1-updated";
                redisConn.TryUpdateAndReleaseLock(null, dataFromRedis, 900);

                // Get actual connection and get data from redis
                IDatabase   actualConnection     = GetRealRedisConnection(redisConn);
                HashEntry[] sessionDataFromRedis = actualConnection.HashGetAll(redisConn.Keys.DataKey);
                Assert.Single(sessionDataFromRedis);
                ChangeTrackingSessionStateItemCollection sessionDataFromRedisAsCollection = new ChangeTrackingSessionStateItemCollection(new RedisUtility(pc));
                foreach (HashEntry entry in sessionDataFromRedis)
                {
                    sessionDataFromRedisAsCollection[entry.Name] = RedisUtility.GetObjectFromBytes(entry.Value).ToString();
                }
                Assert.Equal("value1-updated", sessionDataFromRedisAsCollection["key1"]);

                // check lock removed and remove data from redis
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                Assert.False(actualConnection.KeyExists(redisConn.Keys.LockKey));
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
        public void TryCheckWriteLockAndGetData_Valid()
        {
            string id = "session_id";
            object lockId;
            ISessionStateItemCollection data;

            object[] sessionData = { "Key", RedisUtility.GetBytesFromObject("value") };
            object[] returnFromRedis = { "", sessionData, "15" };
            ChangeTrackingSessionStateItemCollection sessionDataReturn = new ChangeTrackingSessionStateItemCollection();
            sessionDataReturn["key"] = "value";

            var mockRedisClient = A.Fake<IRedisClientConnection>();
            A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 3),
                 A<object[]>.That.Matches(o => o.Length == 0))).Returns(returnFromRedis);
            A.CallTo(() => mockRedisClient.GetLockId(A<object>.Ignored)).Returns("");
            A.CallTo(() => mockRedisClient.GetSessionData(A<object>.Ignored)).Returns(sessionDataReturn);
            A.CallTo(() => mockRedisClient.GetSessionTimeout(A<object>.Ignored)).Returns(15);

            RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
            RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), id);

            int sessionTimeout;
            Assert.True(redisConn.TryCheckWriteLockAndGetData(out lockId, out data, out sessionTimeout));
            Assert.Equal(null, lockId);
            Assert.Equal(1, data.Count);
            Assert.Equal(15, sessionTimeout);
            A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 3),
                A<object[]>.That.Matches(o => o.Length == 0))).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetLockId(A<object>.Ignored)).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetSessionData(A<object>.Ignored)).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetSessionTimeout(A<object>.Ignored)).MustHaveHappened();
        }