/// <summary>
        /// Creates this instance.
        /// </summary>
        /// <returns></returns>
        public static OutOfProcessReportGenerationController Create()
        {
            var settingsProvider = new AppSettingsProvider();

            var controller = new OutOfProcessReportGenerationController(
                  new OutOfProcessConfiguration(settingsProvider),
                  new DefaultProcessFactory(),
                //new ReportQueueStatusWCFService()); moony
                  new ReportQueueStatusDBService());
            return controller;
        }
        public void Should_Parrallelize_And_HandleStatusses()
        {
            //using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(1, 1, 1)))
            {
                //var memoryContext = new MemoryDataContext();

                var genericDao = DataAccessFactory.Create<GenericDao>();

                var generationDao = DataAccessFactory.CreateWithSameContext<GenerationDao>(genericDao);

                // we dont care what the real parameters are here, cause we are just doing status checks.
                var idList = new List<int>();
                for (int i = 1; i <= 10; i++)
                {
                    int queueId = new ReportGenerationQueueBuilder()
                        .WithGenerationDao(generationDao)
                        .WithPeriod(201001)
                        .WithReforecastQuarterName("Q0")
                        .WithReportId(1092)
                        .Build();
                    idList.Add(queueId);
                }

                var configurationProvider = new AppSettingsProvider();
                var configuration = new OutOfProcessConfiguration(configurationProvider);
                configurationProvider.AppSettings["ParallelProcessCount"] = "10";
                configurationProvider.AppSettings["TerminationSleepInterval"] = "0";

                var controller = OutProcessControllerFactory.CreateController(configuration);
                //controller.ParallelProcessCount = 10;
                int activeProcesses = 0;

                ReportStatus statusTestValue = ReportStatus.Failed;

                controller.OnProcessStarting += (sender, args) =>
                {
                    args.Process.StartInfo.Arguments = string.Format("{0} -TestStatus {1} {2} {3} -Sleep 5000", args.Process.StartInfo.Arguments, args.Process.ReportGenerationQueueId, statusTestValue.ToString(), "TestStatus");
                };

                controller.OnProcessStarted += (sender, args) =>
                {
                    activeProcesses++;
                };

                controller.OnProcessTerminating += (sender, args) =>
                {

                };

                controller.OnProcessTerminated += (sender, args) =>
                {
                    activeProcesses--;
                    Assert.AreEqual(GetQueueItem(generationDao, args.Process.ReportGenerationQueueId).ReportGenerationStatus, statusTestValue, "Expected: " + statusTestValue.ToString());
                };

                new Thread(() =>
                {

                    var statusses = new List<ReportStatus>();
                    statusses.Add(ReportStatus.Completed);
                    statusses.Add(ReportStatus.Cancelled);

                    foreach (var status in statusses)
                    {
                        var lastTick = DateTime.Now.Ticks;
                        while (activeProcesses < 10)
                        {
                            TimeOutHelper.TimeOutCheck(lastTick, 60000);
                            Thread.Sleep(100);
                        }

                        lastTick = DateTime.Now.Ticks;
                        while (activeProcesses > 0)
                        {
                            TimeOutHelper.TimeOutCheck(lastTick, 60000);
                            Thread.Sleep(100);
                        }
                        statusTestValue = status;
                        foreach (var id in idList)
                        {
                            StatusUpdater.UpdateStatus(id, ReportStatus.Queued);
                        }
                    }
                    controller.RunProcess = false;
                }).Start();

                controller.Run();

                foreach (var id in idList)
                {
                    StatusUpdater.UpdateStatus(id, ReportStatus.Completed);
                }
            }
        }
 public void Should_StartupWithInvalidConfig()
 {
     var provider = new AppSettingsProvider();
     provider.AppSettings["TemplateDirectory"] = null;
     var controller = OutProcessControllerFactory.CreateController(provider);
 }