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

            provider.CreateUninitializedItem(CreateHttpContext(), GenerateSessionId(), DefaultTimeout);
        }
        public void TestGetItem()
        {
            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 locked;
            TimeSpan lockAge;
            object lockId;
            SessionStateActions actions;
            var storeData = provider.GetItem(context, sessionId, out locked, out lockAge, out lockId, out actions);

            Assert.IsNotNull(storeData);
            Assert.IsFalse(locked);
            Assert.AreNotEqual(ObjectId.Empty, lockId);

            // Actions flag should be InitializeItem since it was created uninitialized above.
            Assert.AreEqual(SessionStateActions.InitializeItem, actions);
        }
        public void TestSetAndReleaseItemExclusiveWhenExistsWithInvalidLockId()
        {
            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;
            var storeData = provider.GetItem(context, sessionId, out locked1, out lockAge1, out lockId1, out actions1);

            Assert.IsNotNull(storeData);
            storeData.Items["field"] = "value";
            provider.SetAndReleaseItemExclusive(context, sessionId, storeData, ObjectId.GenerateNewId() /* Invalid lock id */, 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.IsNull(retrievedStoreData.Items["field"]);
            Assert.IsFalse(locked2);
            Assert.AreEqual(SessionStateActions.None, actions2);
        }
        public void TestResetItemTimeout()
        {
            var config = new NameValueCollection(_sessionConfig);
            var provider = new MongoSessionStateStore();
            provider.Initialize(DefaultSessionName, config);

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

            // Give the session a chance to expire.
            Thread.Sleep(100);

            // Now reset the timeout.
            provider.ResetItemTimeout(context, sessionId);

            bool locked;
            TimeSpan lockAge;
            object lockId;
            SessionStateActions actions;
            var storeData = provider.GetItem(context, sessionId, out locked, out lockAge, out lockId, out actions);

            // Give the lock a chance to accumulate age.
            Thread.Sleep(100);

            Assert.IsNotNull(storeData);
            Assert.IsFalse(locked);
            Assert.Greater(lockAge, TimeSpan.Zero);
            Assert.AreNotEqual(ObjectId.Empty, lockId);
        }
        public void TestSetAndReleaseItemExclusiveWhenDoesNotExist()
        {
            var config = new NameValueCollection(_sessionConfig);
            var provider = new MongoSessionStateStore();
            provider.Initialize(DefaultSessionName, config);

            var context = CreateHttpContext();
            var sessionId = GenerateSessionId();

            var storeData = provider.CreateNewStoreData(context, DefaultTimeout);
            storeData.Items["field"] = "value";
            provider.SetAndReleaseItemExclusive(context, sessionId, storeData, ObjectId.Empty, true);

            bool locked;
            TimeSpan lockAge;
            object lockId;
            SessionStateActions actions;
            var retrievedStoreData = provider.GetItem(context, sessionId, out locked, out lockAge, out lockId, out actions);

            Assert.IsNotNull(retrievedStoreData);
            Assert.AreEqual("value", retrievedStoreData.Items["field"]);
            Assert.IsFalse(locked);
            Assert.AreEqual(SessionStateActions.None, actions);
        }
        public void TestRemoveItem()
        {
            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;
            var storeData1 = provider.GetItem(context, sessionId, out locked1, out lockAge1, out lockId1, out actions1);

            provider.RemoveItem(context, sessionId, lockId1, storeData1);

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

            Assert.IsNull(storeData2);
            Assert.IsFalse(locked2);
        }
 public void TestInitializeWhenCalledTwice()
 {
     var config = new NameValueCollection(_sessionConfig);
     var provider = new MongoSessionStateStore();
     Assert.Throws<InvalidOperationException>(() => {
         provider.Initialize(DefaultSessionName, config);
         provider.Initialize(DefaultSessionName, config);
     });
 }
        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);
        }
        public void TestGetItemWhenExpired()
        {
            var config = new NameValueCollection(_sessionConfig);
            var provider = new MongoSessionStateStore();
            provider.Initialize(DefaultSessionName, config);

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

            // Give it a chance to expire.
            Thread.Sleep(100);

            bool locked;
            TimeSpan lockAge;
            object lockId;
            SessionStateActions actions;
            var storeData = provider.GetItem(context, sessionId, out locked, out lockAge, out lockId, out actions);

            Assert.IsNull(storeData);
            Assert.IsFalse(locked);
        }
        public void TestGetItemWhenDoesNotExist()
        {
            var config = new NameValueCollection(_sessionConfig);
            var provider = new MongoSessionStateStore();
            provider.Initialize(DefaultSessionName, config);

            var context = CreateHttpContext();
            var sessionId = GenerateSessionId();

            bool locked;
            TimeSpan lockAge;
            object lockId;
            SessionStateActions actions;
            var storeData = provider.GetItem(context, sessionId, out locked, out lockAge, out lockId, out actions);

            Assert.IsNull(storeData);
            Assert.IsFalse(locked);
        }