public void ExpenseCzar_Should_Generate()
        {
            int staffid = BusinessUser.Current == null ? -1 : Convert.ToInt32(BusinessUser.Current.UserKey);
            staffid = BusinessUser.Current == null ? -1 : Convert.ToInt32(BusinessUser.Current.UserKey);

            //var isolation = IsolationLevel.ReadUncommitted;

            using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(1, 1, 1)))
            {
                var generationDao = DataAccessFactory.Create<GenericDao>();
                TestDao testDao = new TestDao(generationDao);

                int queueId = new ReportGenerationQueueBuilder()
                    .WithGenerationDao(DataAccessFactory.CreateWithSameContext<GenerationDao>(generationDao))
                    .WithPeriod(201101)
                    .WithReforecastQuarterName("Q0")
                    .WithReportId(testDao.GetReportIdByName("Andre's Unit Test01"))
                    .Build();

                AbstractReportGenerator reportGenerator = ReportGeneratorFactory.GetReportGenerator(queueId);

                Assert.AreEqual(reportGenerator.GetType(), typeof(ExpenseCzarReportGenerator), "expected the report to use the expense czar generator");

                reportGenerator.GenerateReport();

                transaction.Dispose();
            }
        }
        public void Should_Kill_Process_When_Cancelled()
        {
            var genericDao = DataAccessFactory.Create<GenericDao>();
            var generationDao = DataAccessFactory.CreateWithSameContext<GenerationDao>(genericDao);

            int queueId = new ReportGenerationQueueBuilder()
                .WithGenerationDao(generationDao)
                .WithPeriod(201001)
                .WithReforecastQuarterName("Q0")
                .WithReportId(1092)
                .Build();

            var controller = OutProcessControllerFactory.CreateController();

            bool wasTerminated = false;
            controller.OnProcessStarting += (sender, args) =>
            {
                args.Process.StartInfo.Arguments = string.Format("{0} -TestStatus {1} {2} {3} -Sleep 60000", args.Process.StartInfo.Arguments, queueId, ReportStatus.Processing.ToString(), "TestStatus");
            };

            controller.OnProcessTerminated += (sender, e) =>
                {
                    wasTerminated = true;
                };

            new Thread(() =>
                {
                    var lastTick = DateTime.Now.Ticks;
                    do
                    {
                        Thread.Sleep(500);
                        TimeOutHelper.TimeOutCheck(lastTick, 10);
                    }
                    while (QueueHelper.GetQueueItem(queueId).ReportGenerationStatus != ReportStatus.Processing);

                    StatusUpdater.UpdateStatus(queueId, ReportStatus.Cancelled);
                }).Start();

            OutProcessMonitor.MonitorController(controller, queueId);

            Assert.IsTrue(wasTerminated, "Expected process to be terminated");
        }
        public void Should_Generate_Profitibility()
        {
            using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(1, 1, 1)))
            {
                var generationDao = DataAccessFactory.Create<GenericDao>();
                TestDao testDao = new TestDao(generationDao);

                int queueId = new ReportGenerationQueueBuilder()
                    .WithGenerationDao(DataAccessFactory.CreateWithSameContext<GenerationDao>(generationDao))
                    .WithPeriod(201101)
                    .WithReforecastQuarterName("Q2")
                    .WithReportId(testDao.GetReportIdByName("Andre's Profitability UnitTest01"))
                    .Build();

                AbstractReportGenerator reportGenerator = ReportGeneratorFactory.GetReportGenerator(queueId);

                Assert.AreEqual(reportGenerator.GetType(), typeof(ProfitabilityReportGenerator), "expected the report to use the expense czar generator");

                reportGenerator.GenerateReport();

                transaction.Dispose();
            }
        }
        public void Should_Generate_Output_Files_On_Test()
        {
            //var reportGenerator = new FakeReportGenerator(
            //    new FakeReportParameter()
            //    {
            //        MustDeliverReportToTestLocation = false,
            //        ReportType = ReportType.ProfitabilityReport,
            //        ReportPeriod = 201101
            //    }
            //    );
            //ConfigurationManager.ConnectionStrings["GRP"].ConnectionString = @"server=TSSQL-CDTTEST3\CDT$TEST3;database=GRP_V2;Integrated Security=True";
            //ConfigurationManager.ConnectionStrings["GrReporting"].ConnectionString = @"server=TSSQL-REPORTING-DWTEST\TEST;database=GrReporting;Integrated Security=true;";
            //ConfigurationManager.ConnectionStrings["GACS"].ConnectionString = @"Data Source=TSSQL-CDTTEST3\CDT$TEST3;Initial Catalog=GACS;Integrated Security=true;";

            ConfigurationManager.AppSettings["ExportDirectory"] = @"\\obtssql10\Reports\Generated";
            ConfigurationManager.AppSettings["ExportTestDirectory"] = @"\\obtssql10\Reports\TEST\";
            ConfigurationManager.AppSettings["TempFileDirectory"] = @"\\obtssql10\Reports\Temp\";
            ConfigurationManager.AppSettings["TemplateDirectory"] = @"\\obtssql10\Reports\Templates\";

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

            int queueId = new ReportGenerationQueueBuilder()
                .WithGenerationDao(generationDao)
                .WithPeriod(201001)
                .WithReforecastQuarterName("Q0")
                .WithReportId(635)
                .WithStaffFolderLocation()
                .Build();

            var generator = ReportGeneratorFactory.GetReportGenerator(queueId);

            var generatorAccessor = new AbstractReportGenerator_Accessor(new PrivateObject(generator));

            generatorAccessor.ConvertStreamToOutputFiles(new System.IO.MemoryStream());
        }
        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_Requeue_Failed_Reports()
        {
            // using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(1, 1, 1)))
            {
                var genericDao = DataAccessFactory.Create<GenericDao>();
                var generationDao = DataAccessFactory.CreateWithSameContext<GenerationDao>(genericDao);

                // choose a reportid that will break
                int queueId = new ReportGenerationQueueBuilder()
                    .WithGenerationDao(generationDao)
                    .WithPeriod(201001)
                    .WithReforecastQuarterName("Q0")
                    .WithReportId(1092)
                    .Build();

                var controller = OutProcessControllerFactory.CreateController();

                controller.OnProcessStarting += new ProcessStartingEvent(controller_OnProcessStarting);

                OutProcessMonitor.MonitorController(controller, queueId);

                ReportGenerationQueue queueItem = GetQueueItem(generationDao, queueId);

                Assert.AreEqual(queueItem.ReportGenerationStatus, ReportStatus.Failed, "Expected fail");

                StatusUpdater.UpdateStatus(queueId, ReportStatus.Queued);

                OutProcessMonitor.MonitorController(controller, queueId);

                queueItem = GetQueueItem(generationDao, queueId);

                Assert.AreEqual(queueItem.ReportGenerationStatus, ReportStatus.Failed, "Expected fail");

                ReportStatus statusTestValue = ReportStatus.Completed;

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

                StatusUpdater.UpdateStatus(queueId, ReportStatus.Queued);

                OutProcessMonitor.MonitorController(controller, queueId);

                Assert.AreEqual(GetQueueItem(generationDao, queueId).ReportGenerationStatus, ReportStatus.Completed, "Expected Completion");
            }
        }