public void RepositoryConcurrentInitialize(bool initialized)
        {
            // Mock
            var initLock = new OperationLockTests.MockOperationLock();
            var factory  = new Mock <IRepositoryFactory>(MockBehavior.Strict);
            var env      = new Mock <IDeploymentEnvironment>();
            var settings = new Mock <IDeploymentSettingsManager>();
            var trace    = new Mock <ITraceFactory>();

            var environment = new Mock <IEnvironment>();

            environment.SetupGet(e => e.RepositoryPath)
            .Returns(String.Empty);
            environment.SetupGet(e => e.SiteRootPath)
            .Returns(String.Empty);
            environment.SetupGet(e => e.RootPath)
            .Returns(String.Empty);

            IRepository repository = initialized ? new Mock <IRepository>().Object : null;
            var         server     = new GitExeServer(environment.Object, initLock, null, factory.Object, env.Object, settings.Object, trace.Object);
            var         calls      = 0;

            // Setup
            trace.Setup(t => t.GetTracer())
            .Returns(() => NullTracer.Instance);
            factory.Setup(f => f.GetRepository())
            .Returns(() => repository);
            factory.Setup(f => f.EnsureRepository(RepositoryType.Git))
            .Returns(() =>
            {
                ++calls;
                Thread.Sleep(100);
                Assert.Null(repository);
                return(repository = new Mock <IRepository>().Object);
            });

            // Test
            Parallel.For(0, 5, i => server.Initialize());

            // Assert
            Assert.NotNull(repository);
            Assert.Equal(initialized ? 0 : 1, calls);
        }
        public void RepositoryConcurrentInitialize(bool initialized)
        {
            // Mock
            var initLock = new OperationLockTests.MockOperationLock();
            var factory = new Mock<IRepositoryFactory>(MockBehavior.Strict);
            var env = new Mock<IDeploymentEnvironment>();
            var settings = new Mock<IDeploymentSettingsManager>();
            var trace = new Mock<ITraceFactory>();

            var environment = new Mock<IEnvironment>();
            environment.SetupGet(e => e.RepositoryPath)
                       .Returns(String.Empty);
            environment.SetupGet(e => e.SiteRootPath)
                       .Returns(String.Empty);
            environment.SetupGet(e => e.RootPath)
                       .Returns(String.Empty);

            IRepository repository = initialized ? new Mock<IRepository>().Object : null;
            var server = new GitExeServer(environment.Object, initLock, null, factory.Object, env.Object, settings.Object, trace.Object);
            var calls = 0;

            // Setup
            trace.Setup(t => t.GetTracer())
                 .Returns(() => NullTracer.Instance);
            factory.Setup(f => f.GetRepository())
                   .Returns(() => repository);
            factory.Setup(f => f.EnsureRepository(RepositoryType.Git))
                   .Returns(() => 
                    {
                        ++calls;
                        Thread.Sleep(100);
                        Assert.Null(repository);
                        return repository = new Mock<IRepository>().Object;
                    });

            // Test
            Parallel.For(0, 5, i => server.Initialize());

            // Assert
            Assert.NotNull(repository);
            Assert.Equal(initialized ? 0 : 1, calls);
        }