public void Initialise(ICruiseServer server, 
            ExtensionConfiguration extensionConfig)
        {
            var projectsElement = extensionConfig.Items
                .SingleOrDefault(n => n.Name == "allowedProjects");
            if (projectsElement != null)
            {
                this.maxCount = int.Parse(
                    projectsElement.InnerText) - 1;
            }

            this.server = server;
            this.server.ProjectStarting += (o, e) =>
            {
                if (this.count >= this.maxCount)
                {
                    e.Cancel = true;
                }
                else
                {
                    this.count++;
                }
            };
            this.server.ProjectStopped += (o, e) =>
            {
                this.count--;
            };
            Console.WriteLine("Initialise");
        }
        /// <summary>
        /// Initialises the extension.
        /// </summary>
        /// <param name="extensionConfig"></param>
        /// <param name="server">The server that this extension is for.</param>
        public void Initialise(ICruiseServer server, ExtensionConfiguration extensionConfig)
        {
            var counters = this.PerformanceCounters ?? new DefaultPerformanceCounters();
            counters.EnsureCategoryExists(
                CategoryName,
                "Performance counters for CruiseControl.NET",
                new CounterCreationData(NumberCompletedCounter, string.Empty, PerformanceCounterType.NumberOfItems32),
                new CounterCreationData(NumberFailedCounter, string.Empty, PerformanceCounterType.NumberOfItems32),
                new CounterCreationData(AverageTimeCounter, string.Empty, PerformanceCounterType.AverageTimer32),
                new CounterCreationData(NumberTotalCounter, string.Empty, PerformanceCounterType.AverageBase));

            // Retrieve the counters
            Log.Debug("Initialising performance monitoring - integration requests");
            var stopwatches = new Dictionary<string, Stopwatch>();

            server.IntegrationStarted += (o, e) =>
            {
                Log.Debug(
                    string.Format(CultureInfo.CurrentCulture,"Starting stopwatch for '{0}'", e.ProjectName));

                // Start a stopwatch for the project
                if (stopwatches.ContainsKey(e.ProjectName))
                {
                    stopwatches[e.ProjectName].Reset();
                }
                else
                {
                    var stopwatch = new Stopwatch();
                    stopwatches.Add(e.ProjectName, stopwatch);
                    stopwatch.Start();
                }
            };

            server.IntegrationCompleted += (o, e) =>
            {
                Log.Debug(
                    string.Format(CultureInfo.CurrentCulture,"Performance logging for '{0}'", e.ProjectName));

                // Stop the stopwatch and record the elapsed time
                if (stopwatches.ContainsKey(e.ProjectName))
                {
                    var stopwatch = stopwatches[e.ProjectName];
                    stopwatch.Stop();
                    stopwatches.Remove(e.ProjectName);
                    counters.IncrementCounter(CategoryName, NumberTotalCounter);
                    counters.IncrementCounter(CategoryName, AverageTimeCounter, stopwatch.ElapsedMilliseconds);
                }

                // Record the result
                if (e.Status == IntegrationStatus.Success)
                {
                    counters.IncrementCounter(CategoryName, NumberCompletedCounter);
                }
                else
                {
                    counters.IncrementCounter(CategoryName, NumberFailedCounter);
                }
            };
        }
        /// <summary>
        /// Initialises the extension.
        /// </summary>
        /// <param name="extensionConfig"></param>
        /// <param name="server">The server that this extension is for.</param>
        public void Initialise(ICruiseServer server, ExtensionConfiguration extensionConfig)
        {
            foreach (XmlElement itemEl in extensionConfig.Items)
            {
                if (itemEl.Name == "limit") numberOfRequestsAllowed = Convert.ToInt32(itemEl.InnerText);
            }

            server.IntegrationStarted += new EventHandler<IntegrationStartedEventArgs>(server_IntegrationStarted);
            server.IntegrationCompleted += new EventHandler<IntegrationCompletedEventArgs>(server_IntegrationCompleted);
        }
        /// <summary>
        /// Initialises the service host to use.
        /// </summary>
        /// <param name="server">The CruiseServer that is initialising this extension.</param>
        /// <param name="extensionConfig">The configuration for the extension.</param>
        public void Initialise(ICruiseServer server, ExtensionConfiguration extensionConfig)
        {
            // Validate the input parameters
            if (server == null) throw new ArgumentNullException("server");

            // Store the parameters that we need for later
            cruiseServer = server;

            // Create a new service host
            wcfServiceHost = new ServiceHost(new CruiseControlImplementation(cruiseServer));
        }
 public void InitialiseLoadsTheSpaceCorrectlyForMb()
 {
     var server = mocks.DynamicMock<ICruiseServer>();
     var extension = new DiskSpaceMonitorExtension();
     var configuration = new ExtensionConfiguration();
     configuration.Items = new XmlElement[] {
         CreateSizeElement("Mb", 100, "C:\\")
     };
     extension.Initialise(server, configuration);
     Assert.AreEqual(104857600, extension.RetrieveMinimumSpaceRequired("C:\\"));
 }
 public void ItemsGetSetTest()
 {
     XmlDocument document = new XmlDocument();
     XmlElement element = document.CreateElement("test");
     ExtensionConfiguration config = new ExtensionConfiguration();
     config.Items = new XmlElement[] {
         element
     };
     Assert.AreEqual(1, config.Items.Length);
     Assert.AreEqual(element, config.Items[0]);
 }
        /// <summary>
        /// Initialises the extension.
        /// </summary>
        /// <param name="extensionConfig"></param>
        /// <param name="server">The server that this extension is for.</param>
        public void Initialise(ICruiseServer server, ExtensionConfiguration extensionConfig)
        {
            foreach (var itemEl in extensionConfig.Items ?? new XmlElement[0])
            {
                if (itemEl.Name == "limit")
                {
                    this.NumberOfRequestsAllowed = Convert.ToInt32(
                        itemEl.InnerText, 
                        CultureInfo.CurrentCulture);
                }
            }

            server.IntegrationStarted += server_IntegrationStarted;
            server.IntegrationCompleted += server_IntegrationCompleted;
        }
        /// <summary>
        /// Initialises the extension.
        /// </summary>
        /// <param name="server">The server that this extension is for.</param>
        /// <param name="extensionConfig"></param>
        public virtual void Initialise(ICruiseServer server, ExtensionConfiguration extensionConfig)
        {
            if (server == null)
            {
                throw new ArgumentNullException("server");
            }
            else
            {
                server.IntegrationStarted += (o, e) =>
                {
                    // Check all the drives that they have sufficient space
                    var fileSystem = server.RetrieveService(typeof(IFileSystem)) as IFileSystem ?? new SystemIoFileSystem();
                    bool hasSpace = true;
                    foreach (var drive in driveSpaces.Keys)
                    {
                        var freeSpace = fileSystem.GetFreeDiskSpace(drive);
                        hasSpace &= (freeSpace >= driveSpaces[drive]);
                    }
                    e.Result = hasSpace ? IntegrationStartedEventArgs.EventResult.Continue 
                        : IntegrationStartedEventArgs.EventResult.Cancel;
                    if (!hasSpace)
                    {
                        Log.Warning(string.Format(System.Globalization.CultureInfo.CurrentCulture,"Integration for '{0}' cancelled due to a lack of space.", e.ProjectName));
                    }
                };
            }

            foreach (var element in extensionConfig.Items ?? new XmlElement[0])
            {
                if (element.Name == "drive")
                {
                    if (element.SelectNodes("*").Count > 0) throw new ArgumentException("Drive definitions cannot contain child elements");
                    AddDriveSpace(element.GetAttribute("name"), element.GetAttribute("unit"), element.InnerText);
                }
                else
                {
                    throw new ArgumentOutOfRangeException("Unknown configuration option: " + element.Name);
                }
            }

            if (driveSpaces.Count == 0)
            {
                throw new ArgumentOutOfRangeException("At least one drive must be defined to monitor");
            }
        }
        public void InitialiseLoadsNumberOfRequestsAllowed()
        {
            var extension = new IntegrationRequestThrottleExtension();
            var serverMock = this.mocks.StrictMock<ICruiseServer>();
            var config = new ExtensionConfiguration();
            config.Items = new[] 
                {
                    GenerateElement("limit", "10")
                };
            Expect.Call(() => serverMock.IntegrationCompleted += null).IgnoreArguments();
            Expect.Call(() => serverMock.IntegrationStarted += null).IgnoreArguments();

            this.mocks.ReplayAll();
            extension.Initialise(serverMock, config);

            this.mocks.VerifyAll();
            Assert.AreEqual(10, extension.NumberOfRequestsAllowed);
        }
        public void IntegrationStartIsAllowedWhenWithinLimit()
        {
            var extension = new IntegrationRequestThrottleExtension();
            var serverMock = this.mocks.StrictMock<ICruiseServer>();
            var config = new ExtensionConfiguration();
            Expect.Call(() => serverMock.IntegrationCompleted += null).IgnoreArguments();
            var startRaiser = Expect
                .Call(() => serverMock.IntegrationStarted += null)
                .IgnoreArguments()
                .GetEventRaiser();
            var eventArgs = new IntegrationStartedEventArgs(null, "TestProject");

            this.mocks.ReplayAll();
            extension.Initialise(serverMock, config);
            startRaiser.Raise(serverMock, eventArgs);

            this.mocks.VerifyAll();
            Assert.AreEqual(IntegrationStartedEventArgs.EventResult.Continue, eventArgs.Result);
        }
        public void StartAndAbortDoesNothing()
        {
            var counters = this.InitialiseCounters();
            var extension = new IntegrationPerformanceCountersExtension
                {
                    PerformanceCounters = counters
                };
            var serverMock = this.mocks.StrictMock<ICruiseServer>();
            var config = new ExtensionConfiguration();
            Expect.Call(() => serverMock.IntegrationCompleted += null).IgnoreArguments();
            Expect.Call(() => serverMock.IntegrationStarted += null).IgnoreArguments();

            this.mocks.ReplayAll();
            extension.Initialise(serverMock, config);
            extension.Start();
            extension.Abort();

            this.mocks.VerifyAll();
        }
        /// <summary>
        /// Retrieve the list of extensions to load.
        /// </summary>
        /// <param name="parent">The parent.</param>
        /// <param name="configContext">The context.</param>
        /// <param name="section">The section that is being loaded.</param>
        /// <returns>An array of strings containing the type names.</returns>
        public object Create(object parent, object configContext, XmlNode section)
        {
            ServerConfiguration configuration = new ServerConfiguration();

            // Load the extensions
            foreach (XmlNode node in section.SelectNodes("extension"))
            {
                ExtensionConfiguration config = new ExtensionConfiguration();
                config.Type = node.Attributes["type"].Value;
                List<XmlElement> items = new List<XmlElement>();
                foreach (XmlElement itemEl in node.SelectNodes("*"))
                {
                    items.Add(itemEl);
                }
                config.Items = items.ToArray();
                configuration.Extensions.Add(config);
            }

            return configuration;
        }
        public void SuccessfulIntegrationUpdatesSuccessCounter()
        {
            var counters = this.InitialiseCounters();
            Expect.Call(() => counters.IncrementCounter(
                IntegrationPerformanceCountersExtension.CategoryName,
                IntegrationPerformanceCountersExtension.NumberCompletedCounter));
            Expect.Call(() => counters.IncrementCounter(
                IntegrationPerformanceCountersExtension.CategoryName,
                IntegrationPerformanceCountersExtension.NumberTotalCounter));
            Expect.Call(() => counters.IncrementCounter(
                Arg<string>.Is.Equal(IntegrationPerformanceCountersExtension.CategoryName),
                Arg<string>.Is.Equal(IntegrationPerformanceCountersExtension.AverageTimeCounter), 
                Arg<long>.Is.Anything));
            var extension = new IntegrationPerformanceCountersExtension
                {
                    PerformanceCounters = counters
                };
            var serverMock = this.mocks.StrictMock<ICruiseServer>();
            var config = new ExtensionConfiguration();
            var completedRaiser = Expect.Call(() => serverMock
                .IntegrationCompleted += null)
                .IgnoreArguments()
                .GetEventRaiser();
            var startRaiser = Expect
                .Call(() => serverMock.IntegrationStarted += null)
                .IgnoreArguments()
                .GetEventRaiser();
            var request = new IntegrationRequest(BuildCondition.ForceBuild, "Testing", null);

            this.mocks.ReplayAll();
            extension.Initialise(serverMock, config);
            startRaiser.Raise(serverMock, new IntegrationStartedEventArgs(request, "TestProject"));
            completedRaiser.Raise(serverMock, new IntegrationCompletedEventArgs(request, "TestProject", IntegrationStatus.Success));
            
            this.mocks.VerifyAll();
        }
 public void Initialise(ICruiseServer server, ExtensionConfiguration extensionConfig)
 {
     HasInitialised = true;
 }
        public void StartAndAbortDoesNothing()
        {
            var extension = new DiskSpaceMonitorExtension();
            var serverMock = this.mocks.StrictMock<ICruiseServer>();
            var config = new ExtensionConfiguration();

            this.mocks.ReplayAll();
            extension.Start();
            extension.Abort();

            this.mocks.VerifyAll();
        }
        public void IntegrationIsSuccessfulWhenSufficientSpace()
        {
            // Initialise the file system
            var fileSystem = mocks.DynamicMock<IFileSystem>();
            SetupResult.For(fileSystem.GetFreeDiskSpace("c:\\"))
                .Return(104857600);

            // Initialise the server
            var server = mocks.DynamicMock<ICruiseServer>();
            SetupResult.For(server.RetrieveService(typeof(IFileSystem)))
                .Return(fileSystem);
            server.IntegrationStarted += null;
            LastCall.IgnoreArguments();
            var eventRaiser = LastCall.GetEventRaiser();

            // Initialise the extension
            var extension = new DiskSpaceMonitorExtension();
            var configuration = new ExtensionConfiguration();
            configuration.Items = new XmlElement[] {
                CreateSizeElement("Mb", 1, "C:\\")
            };
            mocks.ReplayAll();

            // Run the actual test
            extension.Initialise(server, configuration);
            var args = new IntegrationStartedEventArgs(null, "Project 1");
            eventRaiser.Raise(null, args);
            Assert.AreEqual(IntegrationStartedEventArgs.EventResult.Continue, args.Result);
        }
 public void InitialiseThrowsAnErrorWithNoDrives()
 {
     var server = mocks.DynamicMock<ICruiseServer>();
     var extension = new DiskSpaceMonitorExtension();
     var configuration = new ExtensionConfiguration();
     configuration.Items = new XmlElement[] {
     };
     Assert.That(delegate { extension.Initialise(server, configuration); },
                 Throws.TypeOf<ArgumentOutOfRangeException>());
 }
 public void InitialiseThrowsAnErrorForUnknownUnit()
 {
     var server = mocks.DynamicMock<ICruiseServer>();
     var extension = new DiskSpaceMonitorExtension();
     var configuration = new ExtensionConfiguration();
     configuration.Items = new XmlElement[] {
         CreateSizeElement("garbage", 100, "C:\\")
     };
     Assert.That(delegate { extension.Initialise(server, configuration); },
                 Throws.TypeOf<ArgumentOutOfRangeException>());
 }
        public void StartAndAbortExtensions()
        {
            List<ExtensionConfiguration> extensions = new List<ExtensionConfiguration>();
            ExtensionConfiguration extensionStub = new ExtensionConfiguration();
            extensionStub.Type = "ThoughtWorks.CruiseControl.UnitTests.Remote.ServerExtensionStub,ThoughtWorks.CruiseControl.UnitTests";
            extensions.Add(extensionStub);

            configServiceMock.ExpectAndReturn("Load", configuration);
            projectIntegratorListFactoryMock.ExpectAndReturn("CreateProjectIntegrators", integratorList, configuration.Projects, integrationQueue);
            server = new CruiseServer((IConfigurationService)configServiceMock.MockInstance,
                                      (IProjectIntegratorListFactory)projectIntegratorListFactoryMock.MockInstance,
                                      (IProjectSerializer)projectSerializerMock.MockInstance,
									  (IProjectStateManager)stateManagerMock.MockInstance,
									  fileSystem,
									  executionEnvironment,
                                      extensions);
            Assert.IsTrue(ServerExtensionStub.HasInitialised);

            server.Start();
            Assert.IsTrue(ServerExtensionStub.HasStarted);

            server.Abort();
            Assert.IsTrue(ServerExtensionStub.HasAborted);
        }
        public void InitialiseingANonExistantExtensionThrowsAnException()
        {
            List<ExtensionConfiguration> extensions = new List<ExtensionConfiguration>();
            ExtensionConfiguration extensionStub = new ExtensionConfiguration();
            extensionStub.Type = "ThoughtWorks.CruiseControl.UnitTests.Remote.Garbage,ThoughtWorks.CruiseControl.UnitTests";
            extensions.Add(extensionStub);

            configServiceMock.ExpectAndReturn("Load", configuration);
            projectIntegratorListFactoryMock.ExpectAndReturn("CreateProjectIntegrators", integratorList, configuration.Projects, integrationQueue);

            Assert.That(delegate
                            {
                                new CruiseServer((IConfigurationService) configServiceMock.MockInstance,
                                                 (IProjectIntegratorListFactory)
                                                 projectIntegratorListFactoryMock.MockInstance,
                                                 (IProjectSerializer) projectSerializerMock.MockInstance,
                                                 (IProjectStateManager) stateManagerMock.MockInstance,
                                                 fileSystem,
                                                 executionEnvironment,
                                                 extensions);
                            },
                        Throws.TypeOf<NullReferenceException>().With.Message.EqualTo(
                            "Unable to find extension 'ThoughtWorks.CruiseControl.UnitTests.Remote.Garbage,ThoughtWorks.CruiseControl.UnitTests'"));
        }
        public void IntegrationStartAllowedAtTopOfQueue()
        {
            var extension = new IntegrationRequestThrottleExtension();
            var serverMock = this.mocks.StrictMock<ICruiseServer>();
            var config = new ExtensionConfiguration();
            var completeRaiser = Expect
                .Call(() => serverMock.IntegrationCompleted += null)
                .IgnoreArguments()
                .GetEventRaiser();
            var startRaiser = Expect
                .Call(() => serverMock.IntegrationStarted += null)
                .IgnoreArguments()
                .GetEventRaiser();
            var eventArgs = new IntegrationStartedEventArgs(null, "TestProject");

            this.mocks.ReplayAll();
            extension.Initialise(serverMock, config);
            extension.NumberOfRequestsAllowed = 1;
            startRaiser.Raise(serverMock, new IntegrationStartedEventArgs(null, "First"));
            startRaiser.Raise(serverMock, eventArgs);
            startRaiser.Raise(serverMock, new IntegrationStartedEventArgs(null, "Third"));
            completeRaiser.Raise(
                serverMock,
                new IntegrationCompletedEventArgs(null, "First", IntegrationStatus.Success));
            startRaiser.Raise(serverMock, eventArgs);

            this.mocks.VerifyAll();
            Assert.AreEqual(IntegrationStartedEventArgs.EventResult.Continue, eventArgs.Result);
        }
        /// <summary>
        /// Initialises the extension.
        /// </summary>
        /// <param name="extensionConfig"></param>
        /// <param name="server">The server that this extension is for.</param>
        public void Initialise(ICruiseServer server, ExtensionConfiguration extensionConfig)
        {
            if (!PerformanceCounterCategory.Exists("CruiseControl.NET"))
            {
                Log.Info("Initialising new performance counters for integration requests");
                var collection = new CounterCreationDataCollection();

                // Number of integrations completed counter
                var numberOfCompletedIntegrations = new CounterCreationData();
                numberOfCompletedIntegrations.CounterType = PerformanceCounterType.NumberOfItems32;
                numberOfCompletedIntegrations.CounterName = "Number of Completed Integrations";
                collection.Add(numberOfCompletedIntegrations);

                // Number of integrations failed counter
                var numberOfFailedIntegrations = new CounterCreationData();
                numberOfFailedIntegrations.CounterType = PerformanceCounterType.NumberOfItems32;
                numberOfFailedIntegrations.CounterName = "Number of Failed Integrations";
                collection.Add(numberOfFailedIntegrations);

                // Integration time counter
                var integrationElapsedTime = new CounterCreationData();
                integrationElapsedTime.CounterType = PerformanceCounterType.AverageTimer32;
                integrationElapsedTime.CounterName = "Integration Time";
                collection.Add(integrationElapsedTime);

                // Integration count counter
                var averageIntegrations = new CounterCreationData();
                averageIntegrations.CounterType = PerformanceCounterType.AverageBase;
                averageIntegrations.CounterName = "Average number of integrations";
                collection.Add(averageIntegrations);

                // Create the category
                PerformanceCounterCategory.Create("CruiseControl.NET",
                    "Performance counters for CruiseControl.NET",
                    collection);
            }

            // Retrieve the counters
            Log.Debug("Initialising performance monitoring - integration requests");
            var numberOfCompletedIntegrationsCounter = new PerformanceCounter("CruiseControl.NET", "Number of Completed Integrations", false);
            var numberOfFailedIntegrationsCounter = new PerformanceCounter("CruiseControl.NET", "Number of Failed Integrations", false);
            var integrationElapsedTimeCounter = new PerformanceCounter("CruiseControl.NET", "Integration Time", false);
            var averageIntegrationsCounter = new PerformanceCounter("CruiseControl.NET", "Average number of integrations", false);
            var stopwatches = new Dictionary<string, Stopwatch>();

            server.IntegrationStarted += (o, e) =>
            {
                Log.Debug(string.Format("Starting stopwatch for '{0}'", e.ProjectName));

                // Start a stopwatch for the project
                if (stopwatches.ContainsKey(e.ProjectName))
                {
                    stopwatches[e.ProjectName].Reset();
                }
                else
                {
                    var stopwatch = new Stopwatch();
                    stopwatches.Add(e.ProjectName, stopwatch);
                    stopwatch.Start();
                }
            };
            server.IntegrationCompleted += (o, e) =>
            {
                Log.Debug(string.Format("Performance logging for '{0}'", e.ProjectName));

                // Stop the stopwatch and record the elapsed time
                if (stopwatches.ContainsKey(e.ProjectName))
                {
                    var stopwatch = stopwatches[e.ProjectName];
                    stopwatch.Stop();
                    stopwatches.Remove(e.ProjectName);
                    averageIntegrationsCounter.Increment();
                    integrationElapsedTimeCounter.IncrementBy(stopwatch.ElapsedTicks);
                }

                // Record the result
                if (e.Status == IntegrationStatus.Success)
                {
                    numberOfCompletedIntegrationsCounter.Increment();
                }
                else
                {
                    numberOfFailedIntegrationsCounter.Increment();
                }
            };
        }
        public void StartAndStopDoesNothing()
        {
            var extension = new IntegrationRequestThrottleExtension();
            var serverMock = this.mocks.StrictMock<ICruiseServer>();
            var config = new ExtensionConfiguration();
            Expect.Call(() => serverMock.IntegrationCompleted += null).IgnoreArguments();
            Expect.Call(() => serverMock.IntegrationStarted += null).IgnoreArguments();

            this.mocks.ReplayAll();
            extension.Initialise(serverMock, config);
            extension.Start();
            extension.Stop();

            this.mocks.VerifyAll();
        }