public void TestReleaseItemExclusive()
        {
            var config = new NameValueCollection(_sessionConfig);
            var provider = new MongoSessionStateStore();
            provider.Initialize(DefaultSessionName, config);

            var context = CreateHttpContext();
            var sessionId = GenerateSessionId();
            provider.CreateUninitializedItem(context, sessionId, DefaultTimeout);

            bool locked1;
            TimeSpan lockAge1;
            object lockId1;
            SessionStateActions actions1;
            provider.GetItemExclusive(context, sessionId, out locked1, out lockAge1, out lockId1, out actions1);
            provider.ReleaseItemExclusive(context, sessionId, lockId1);

            bool locked2;
            TimeSpan lockAge2;
            object lockId2;
            SessionStateActions actions2;
            var storeData = provider.GetItem(context, sessionId, out locked2, out lockAge2, out lockId2, out actions2);

            Assert.IsNotNull(storeData);
            Assert.IsFalse(locked2);
            Assert.AreEqual(SessionStateActions.None, actions2);
        }
        public void TestSetAndReleaseItemExclusiveWhenExistsAndLocked()
        {
            var config = new NameValueCollection(_sessionConfig);
            var provider = new MongoSessionStateStore();
            provider.Initialize(DefaultSessionName, config);

            var context = CreateHttpContext();
            var sessionId = GenerateSessionId();
            provider.CreateUninitializedItem(context, sessionId, DefaultTimeout);

            bool locked1;
            TimeSpan lockAge1;
            object lockId1;
            SessionStateActions actions1;
            // GetItemExclusive locks the item.
            var storeData = provider.GetItemExclusive(context, sessionId, out locked1, out lockAge1, out lockId1, out actions1);

            Assert.IsNotNull(storeData);
            storeData.Items["field"] = "value";
            provider.SetAndReleaseItemExclusive(context, sessionId, storeData, lockId1, false);

            bool locked2;
            TimeSpan lockAge2;
            object lockId2;
            SessionStateActions actions2;
            var retrievedStoreData = provider.GetItem(context, sessionId, out locked2, out lockAge2, out lockId2, out actions2);

            Assert.IsNotNull(retrievedStoreData);
            Assert.AreEqual("value", retrievedStoreData.Items["field"]);
            Assert.IsFalse(locked2);
            Assert.AreEqual(SessionStateActions.None, actions2);
        }
        public void TestGetItemWhenLocked()
        {
            var config = new NameValueCollection(_sessionConfig);
            var provider = new MongoSessionStateStore();
            provider.Initialize(DefaultSessionName, config);

            var context = CreateHttpContext();
            var sessionId = GenerateSessionId();
            provider.CreateUninitializedItem(context, sessionId, DefaultTimeout);

            // Call exclusive version of get item to force a lock.
            bool locked1;
            TimeSpan lockAge1;
            object lockId1;
            SessionStateActions actions1;
            provider.GetItemExclusive(context, sessionId, out locked1, out lockAge1, out lockId1, out actions1);

            // Sleep for a second to ensure the lockAge can be greater than 0 if it exists.
            Thread.Sleep(100);

            bool locked2;
            TimeSpan lockAge2;
            object lockId2;
            SessionStateActions actions2;
            var storeData = provider.GetItem(context, sessionId, out locked2, out lockAge2, out lockId2, out actions2);

            Assert.IsNull(storeData);
            Assert.IsTrue(locked2);
            Assert.Greater(lockAge2, TimeSpan.Zero);
            Assert.AreEqual(lockId1, lockId2);
        }