public void LoginRetryAfterPermissionDeniedExceptionOccuredAndConfigHasBeenChanged()
        {
            var waitHandle = new AutoResetEvent(false);

            this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
            .Callback <IDictionary <string, string>, object, object, object>(
                (d, x, y, z) => this.VerifyConnectionProperties(d)).Throws <CmisPermissionDeniedException>();
            this.queue.Setup(q => q.AddEvent(It.IsAny <ISyncEvent>())).Callback(() => waitHandle.Set());
            using (var underTest = new ConnectionScheduler(this.repoInfo, this.queue.Object, this.sessionFactory.Object, this.authProvider.Object, this.interval)) {
                underTest.Start();
                waitHandle.WaitOne();
                this.queue.Verify(q => q.AddEvent(It.IsAny <PermissionDeniedEvent>()), Times.Once());
                this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
                .Callback <IDictionary <string, string>, object, object, object>(
                    (d, x, y, z) => this.VerifyConnectionProperties(d)).Returns(this.session.Object);
                Assert.That(waitHandle.WaitOne(3 * this.interval), Is.False);
                this.queue.Verify(q => q.AddEvent(It.IsAny <PermissionDeniedEvent>()), Times.Once());
                this.queue.Verify(q => q.AddEvent(It.IsAny <ISyncEvent>()), Times.Exactly(1));
                underTest.Handle(new RepoConfigChangedEvent(this.repoInfo));
                Assert.That(waitHandle.WaitOne(3 * this.interval), Is.True);
                this.queue.Verify(q => q.AddEvent(It.IsAny <PermissionDeniedEvent>()), Times.Once());
                this.queue.Verify(q => q.AddEvent(It.IsAny <ISyncEvent>()), Times.Exactly(2));
                this.queue.Verify(q => q.AddEvent(It.IsAny <SuccessfulLoginEvent>()), Times.Once());
                Assert.That(waitHandle.WaitOne(3 * this.interval), Is.False);
                this.queue.Verify(q => q.AddEvent(It.IsAny <ISyncEvent>()), Times.Exactly(2));
            }

            this.session.VerifySet(s => s.DefaultContext = It.IsNotNull <IOperationContext>(), Times.Once());
        }
        public void LoginBlockedWithLockedUntilFutureDate()
        {
            var  waitHandle = new AutoResetEvent(false);
            var  now        = DateTime.UtcNow;
            long seconds    = 5;
            var  exception  = Mock.Of <CmisPermissionDeniedException>(e => e.Data == EventsTests.PermissionDeniedEventCalculatesBlockingUntilTest.CreateHeader(now.AddSeconds(seconds).ToString()));

            this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
            .Callback <IDictionary <string, string>, object, object, object>(
                (d, x, y, z) => this.VerifyConnectionProperties(d)).Throws(exception);
            this.queue.Setup(q => q.AddEvent(It.IsAny <ISyncEvent>())).Callback(() => waitHandle.Set());
            using (var scheduler = new ConnectionScheduler(this.repoInfo, this.queue.Object, this.sessionFactory.Object, this.authProvider.Object, this.interval)) {
                scheduler.Start();
                waitHandle.WaitOne();
                this.queue.VerifyThatNoOtherEventIsAddedThan <PermissionDeniedEvent>();
                this.queue.Verify(q => q.AddEvent(It.Is <PermissionDeniedEvent>(e => e.IsBlockedUntil != null)));
                this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
                .Callback <IDictionary <string, string>, object, object, object>(
                    (d, x, y, z) => this.VerifyConnectionProperties(d)).Returns(this.session.Object);
                Assert.That(waitHandle.WaitOne(5 * this.interval), Is.False);
                Assert.That(waitHandle.WaitOne((int)seconds * 1000 + 1000), Is.True);
                this.queue.Verify(q => q.AddEvent(It.Is <SuccessfulLoginEvent>(l => l.Session == this.session.Object)), Times.Once());
                this.queue.Verify(q => q.AddEvent(It.IsAny <ISyncEvent>()), Times.Exactly(2));
            }

            this.session.VerifySet(s => s.DefaultContext = It.IsNotNull <IOperationContext>(), Times.Once());
        }
        public void LoginFailsWithProxyAuthRequiredException()
        {
            var waitHandle = new AutoResetEvent(false);

            this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
            .Callback <IDictionary <string, string>, object, object, object>(
                (d, x, y, z) => this.VerifyConnectionProperties(d)).Throws(new CmisRuntimeException("Proxy Authentication Required"));
            this.queue.Setup(q => q.AddEvent(It.IsAny <ISyncEvent>())).Callback(() => waitHandle.Set());
            using (var scheduler = new ConnectionScheduler(this.repoInfo, this.queue.Object, this.sessionFactory.Object, this.authProvider.Object, this.interval)) {
                scheduler.Start();
                waitHandle.WaitOne();
                this.queue.VerifyThatNoOtherEventIsAddedThan <ProxyAuthRequiredEvent>();
                this.queue.Verify(q => q.AddEvent(It.IsAny <ProxyAuthRequiredEvent>()));
            }

            this.session.VerifySet(s => s.DefaultContext = It.IsAny <IOperationContext>(), Times.Never());
        }
        public void CreateConnection()
        {
            var waitHandle = new AutoResetEvent(false);

            this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
            .Callback <IDictionary <string, string>, object, object, object>(
                (d, x, y, z) => this.VerifyConnectionProperties(d))
            .Returns(this.session.Object);
            this.queue.Setup(q => q.AddEvent(It.IsAny <ISyncEvent>())).Callback(() => waitHandle.Set());
            using (var scheduler = new ConnectionScheduler(this.repoInfo, this.queue.Object, this.sessionFactory.Object, this.authProvider.Object, this.interval)) {
                scheduler.Start();
                waitHandle.WaitOne();
                this.queue.VerifyThatNoOtherEventIsAddedThan <SuccessfulLoginEvent>();
                this.queue.Verify(q => q.AddEvent(It.Is <SuccessfulLoginEvent>(l => l.Session == this.session.Object)));
            }

            this.session.VerifySet(s => s.DefaultContext = It.IsNotNull <IOperationContext>(), Times.Once());
        }
        public void LoginRetryAfterConfigHasBeenChanged()
        {
            var waitHandle = new AutoResetEvent(false);
            var newSession = new Mock <ISession>();

            newSession.SetupCreateOperationContext();
            this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
            .Callback <IDictionary <string, string>, object, object, object>(
                (d, x, y, z) => this.VerifyConnectionProperties(d))
            .Returns(this.session.Object);
            this.queue.Setup(q => q.AddEvent(It.IsAny <ISyncEvent>())).Callback(() => waitHandle.Set());
            using (var underTest = new ConnectionScheduler(this.repoInfo, this.queue.Object, this.sessionFactory.Object, this.authProvider.Object, this.interval)) {
                underTest.Start();
                waitHandle.WaitOne();
                this.queue.Verify(q => q.AddEvent(It.Is <SuccessfulLoginEvent>(l => l.Session == this.session.Object)), Times.Once());
                Assert.That(waitHandle.WaitOne(3 * this.interval), Is.False);
                this.queue.Verify(q => q.AddEvent(It.Is <SuccessfulLoginEvent>(l => l.Session == this.session.Object)), Times.Once());
                underTest.Handle(new RepoConfigChangedEvent(this.repoInfo));
                underTest.Handle(new RepoConfigChangedEvent(this.repoInfo));
                underTest.Handle(new RepoConfigChangedEvent(this.repoInfo));
                underTest.Handle(new RepoConfigChangedEvent(this.repoInfo));
                this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
                .Returns(newSession.Object);
                underTest.Handle(new RepoConfigChangedEvent(this.repoInfo));
                Assert.That(waitHandle.WaitOne(3 * this.interval), Is.True);
                waitHandle.WaitOne(this.interval);
                waitHandle.WaitOne(this.interval);
                waitHandle.WaitOne(this.interval);
                waitHandle.WaitOne(this.interval);
                waitHandle.WaitOne(this.interval);
                this.queue.Verify(q => q.AddEvent(It.Is <SuccessfulLoginEvent>(l => l.Session == newSession.Object)), Times.Between(1, 5, Range.Inclusive));
                Assert.That(waitHandle.WaitOne(3 * this.interval), Is.False);
                this.queue.Verify(q => q.AddEvent(It.IsAny <ISyncEvent>()), Times.Between(2, 6, Range.Inclusive));
            }

            this.session.VerifySet(s => s.DefaultContext = It.IsNotNull <IOperationContext>(), Times.Between(1, 5, Range.Inclusive));
            newSession.VerifySet(s => s.DefaultContext   = It.IsNotNull <IOperationContext>(), Times.Between(1, 5, Range.Inclusive));
        }
        public void LoginRetryOccursIfFirstLoginFailed()
        {
            var waitHandle = new AutoResetEvent(false);

            this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
            .Callback <IDictionary <string, string>, object, object, object>(
                (d, x, y, z) => this.VerifyConnectionProperties(d)).Throws(new CmisRuntimeException("Some generic exception"));
            this.queue.Setup(q => q.AddEvent(It.IsAny <ISyncEvent>())).Callback(() => waitHandle.Set());
            using (var scheduler = new ConnectionScheduler(this.repoInfo, this.queue.Object, this.sessionFactory.Object, this.authProvider.Object, this.interval)) {
                scheduler.Start();
                waitHandle.WaitOne();
                this.queue.Verify(q => q.AddEvent(It.IsAny <ExceptionEvent>()), Times.Once());
                this.sessionFactory.Setup(f => f.CreateSession(It.IsAny <IDictionary <string, string> >(), null, this.authProvider.Object, null))
                .Callback <IDictionary <string, string>, object, object, object>(
                    (d, x, y, z) => this.VerifyConnectionProperties(d)).Returns(this.session.Object);
                waitHandle.WaitOne();
                this.queue.Verify(q => q.AddEvent(It.Is <SuccessfulLoginEvent>(l => l.Session == this.session.Object)), Times.Once());
                Assert.That(waitHandle.WaitOne(3 * this.interval), Is.False);
                this.queue.Verify(q => q.AddEvent(It.Is <SuccessfulLoginEvent>(l => l.Session == this.session.Object)), Times.Once());
                this.queue.Verify(q => q.AddEvent(It.IsAny <ISyncEvent>()), Times.Exactly(2));
            }

            this.session.VerifySet(s => s.DefaultContext = It.IsNotNull <IOperationContext>(), Times.Once());
        }
 public void DisposingWithoutHavingFinished()
 {
     using (var scheduler = new ConnectionScheduler(this.repoInfo, this.queue.Object, this.sessionFactory.Object, this.authProvider.Object, this.interval)) {
         scheduler.Start();
     }
 }