public void TryUpdateIfLockIdMatchPrepare_Valid_OneUpdateOneDelete()
        {
            string id             = "session_id";
            int    sessionTimeout = 900;
            object lockId         = DateTime.Now.Ticks;
            ChangeTrackingSessionStateItemCollection data = Utility.GetChangeTrackingSessionStateItemCollection();

            data["KeyDel"] = "valueDel";
            data["Key"]    = "value";
            data.Remove("KeyDel");

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

            redisConn.redisConnection = A.Fake <IRedisClientConnection>();
            redisConn.TryUpdateAndReleaseLock(lockId, data, sessionTimeout);


            A.CallTo(() => redisConn.redisConnection.Eval(A <string> .Ignored, A <string[]> .That.Matches(s => s.Length == 3), A <object[]> .That.Matches(
                                                              o => o.Length == 11 &&
                                                              o[2].Equals(1) &&
                                                              o[3].Equals(9) &&
                                                              o[4].Equals(9) &&
                                                              o[5].Equals(1) &&
                                                              o[6].Equals(10) &&
                                                              o[7].Equals(11)
                                                              ))).MustHaveHappened();
        }
示例#2
0
        public void TryUpdateAndReleaseLockIfLockIdMatch_LargeLockTime_ExpireManuallyTest()
        {
            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);

                int      lockTimeout = 120000;
                DateTime lockTime    = DateTime.Now;
                object   lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                Assert.True(redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId, out dataFromRedis, out sessionTimeout));
                redisConn.TryUpdateAndReleaseLock(lockId, dataFromRedis, 900);

                // Get actual connection and check that lock is released
                IDatabase actualConnection = GetRealRedisConnection(redisConn);
                Assert.False(actualConnection.KeyExists(redisConn.Keys.LockKey));
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
示例#3
0
        public void TryUpdateIfLockIdMatch_WithOnlyUpdateAndNoDelete()
        {
            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";
                data["key2"] = "value2";
                data["key3"] = "value3";
                redisConn.Set(data, 900);

                int      lockTimeout = 900;
                DateTime lockTime    = DateTime.Now;
                object   lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                Assert.True(redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId, out dataFromRedis, out sessionTimeout));
                Assert.Equal(lockTime.Ticks.ToString(), lockId.ToString());
                Assert.Equal(3, dataFromRedis.Count);
                Assert.Equal("value1", dataFromRedis["key1"]);
                Assert.Equal("value2", dataFromRedis["key2"]);
                Assert.Equal("value3", dataFromRedis["key3"]);

                dataFromRedis["key2"] = "value2-updated";
                redisConn.TryUpdateAndReleaseLock(lockId, dataFromRedis, 900);

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

                // check lock removed and remove data from redis
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                Assert.False(actualConnection.KeyExists(redisConn.Keys.LockKey));
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
示例#4
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);
            }
        }
示例#5
0
        public void TryUpdateIfLockIdMatch_ExpiryTime_OnValidData()
        {
            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";
                data["key1"] = "value1";
                redisConn.Set(data, 900);

                // Check that data shoud exists
                int      lockTimeout = 90;
                DateTime lockTime    = DateTime.Now;
                object   lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId, out dataFromRedis, out sessionTimeout);
                Assert.Equal(2, dataFromRedis.Count);

                // Update expiry time to only 1 sec and than verify that.
                redisConn.TryUpdateAndReleaseLock(lockId, dataFromRedis, 1);

                // Wait for 1.1 seconds so that data will expire
                System.Threading.Thread.Sleep(1100);

                // Get data blob from redis
                IDatabase   actualConnection = GetRealRedisConnection(redisConn);
                HashEntry[] sessionDataFromRedisAfterExpire = actualConnection.HashGetAll(redisConn.Keys.DataKey);

                // Check that data shoud not be there
                Assert.Empty(sessionDataFromRedisAfterExpire);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }