//** TODO This Test need cleaned up immensely

        public void GetTimePeriodReportDataWithMissingMachines(bool InitialState, int[] ReportTimePeriodStartAsArray, int [] ReportTimePeriodEndAsArray, int[] marginAsArray)
        {
            TimeSpan margin = TimeSpan.FromHours(marginAsArray[0]) + TimeSpan.FromMinutes(marginAsArray[1]) + TimeSpan.FromSeconds(marginAsArray[2]) + TimeSpan.FromMilliseconds(marginAsArray[3]);

            (int Hour, int Minute)ReportTimePeriodStart = (ReportTimePeriodStartAsArray[0], ReportTimePeriodStartAsArray[1]);
            (int Hour, int Minute)ReportTimePeriodEnd   = (ReportTimePeriodEndAsArray[0], ReportTimePeriodEndAsArray[1]);

            var TestDB = $"{nameof(DailyDepartmentTimePeriodReportTests)}.{nameof(GetReportData)}";

            var repo = new MachineRepository(databaseIP, "TestRunner", "1234", TimeSpan.FromMilliseconds(5000), databaseName: TestDB);

            if (repo.DoesDBExist(TestDB))
            {
                repo.DropDB(TestDB);
            }

            repo.CreateDB(TestDB);

            var testDepartment = "TestDepartment";

            (var ExpectedReportDataSorted, var ToWriteDataSorted) = ReportTestHelper.GenerateReportTestDataWithMissing(InitialState, testDepartment, ReportTimePeriodStart, ReportTimePeriodEnd, margin);

            //** Validate generated Data, yes, I am testing part of my test, this is smelly and need to be fixed.
            Assert.True(ExpectedReportDataSorted.Count() == ToWriteDataSorted.Count());

            for (int i = 0; i < ExpectedReportDataSorted.Count(); i++)
            {
                Assert.Equal(ExpectedReportDataSorted[i].States.Count, ToWriteDataSorted[i].States.Count);

                for (int a = 0; a < ExpectedReportDataSorted[i].States.Count; a++)
                {
                    Assert.Equal(ExpectedReportDataSorted[i].States[a].State, ToWriteDataSorted[i].States[a].State);
                }
            }

            var toSendData = ReportTestHelper.ConvertExpectedToTestInputDataMulti(testDepartment, ToWriteDataSorted.ToArray(), null);

            repo.MachineIsRunningRepo.WriteAsync(toSendData).Wait();

            try
            {
                var ShiftReport = new DepartmentTimePeriodReportForCurrentDay("*****@*****.**", new[] { "*****@*****.**" },
                                                                              testDepartment, "localhost", 2500, null, $"ReportTemplates{Path.DirectorySeparatorChar}DepartmentReportView.cshtml", repo)
                {
                    StartTime = ReportTimePeriodStart,
                    EndTime   = ReportTimePeriodEnd,
                    Name      = "1st Shift Report (Test)"
                };

                var returnedResults = ShiftReport.GetReportData().Result;

                var ReturnedResultSorted = returnedResults.OrderBy(x => x.MachineInfo.Line).ThenBy(x => x.MachineInfo.Name);

                foreach (var machine in ReturnedResultSorted)
                {
                    machine.States = machine.States.OrderBy(x => x.Start).ThenBy(x => x.End).ThenBy(x => x.State).ToList();
                }

                output.WriteLine($"Date has been returned and sorted");

                //** Output data to "Console"
                foreach (var machine in ReturnedResultSorted)
                {
                    output.WriteLine($"{machine.MachineInfo.Line}.{machine.MachineInfo.Name}");
                    foreach (var state in machine.States)
                    {
                        output.WriteLine($"\t{state}");
                    }
                }
                try
                {
                    ReturnedResultSorted.ShouldDeepEqual(ExpectedReportDataSorted);
                }
                catch (Exception ex)
                {
                    string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                    string FilePath    = $"{desktopPath}{Path.DirectorySeparatorChar}{nameof(GetTimePeriodReportDataWithMissingMachines)}Failure{DateTime.Now.Ticks}";
                    ObjectDifferenceWriter.DumpToFile(
                        ReturnedResultSorted.WithDeepEqual(ExpectedReportDataSorted).Expected,
                        ReturnedResultSorted.WithDeepEqual(ExpectedReportDataSorted).Actual,
                        FilePath
                        );
                    throw;
                }
            }
            finally
            {
                repo.DropDB(TestDB);
            }
        }
        public void GetShiftReportDataWithMissingMachines(bool InitialState)
        {
            var TestDB = $"{nameof(DailyDepartmentTimePeriodReportTests)}.{nameof(GetReportData)}";

            var repo = new MachineRepository(databaseIP, "TestRunner", "1234", TimeSpan.FromMilliseconds(5000), databaseName: TestDB);

            if (repo.DoesDBExist(TestDB))
            {
                repo.DropDB(TestDB);
            }

            repo.CreateDB(TestDB);


            (int Hour, int Minute)ShiftStart = (07, 00);
            (int Hour, int Minute)ShiftEnd   = (15, 00);

            var testDepartment = "TestDepartment";

            (var ExpectedReportDataSorted, var ToWriteDataSorted) = ReportTestHelper.GenerateReportTestDataWithMissing(InitialState, testDepartment, ShiftStart, ShiftEnd);

            output.WriteLine($"Expected Data");
            foreach (var machine in ExpectedReportDataSorted)
            {
                output.WriteLine($"{machine.MachineInfo.Line}.{machine.MachineInfo.Name}");
                foreach (var state in machine.States)
                {
                    output.WriteLine($"\t{state}");
                }
            }

            output.WriteLine($"To Write Data");
            foreach (var machine in ToWriteDataSorted)
            {
                output.WriteLine($"{machine.MachineInfo.Line}.{machine.MachineInfo.Name}");
                foreach (var state in machine.States)
                {
                    output.WriteLine($"\t{state}");
                }
            }

            Assert.True(ExpectedReportDataSorted.Count() == ToWriteDataSorted.Count());

            for (int i = 0; i < ExpectedReportDataSorted.Count(); i++)
            {
                Assert.Equal(ExpectedReportDataSorted[i].States.Count, ToWriteDataSorted[i].States.Count);

                for (int a = 0; a < ExpectedReportDataSorted[i].States.Count; a++)
                {
                    Assert.Equal(ExpectedReportDataSorted[i].States[a].State, ToWriteDataSorted[i].States[a].State);
                    Assert.Equal(ExpectedReportDataSorted[i].States[a].TimeSpan.Milliseconds, ToWriteDataSorted[i].States[a].TimeSpan.Milliseconds);
                }
            }

            var toSendData = ReportTestHelper.ConvertExpectedToTestInputDataMulti(testDepartment, ToWriteDataSorted.ToArray(), null);

            repo.MachineIsRunningRepo.WriteAsync(toSendData).Wait();

            try
            {
                var ShiftReport = new DepartmentTimePeriodReportForCurrentDay("*****@*****.**", new[] { "*****@*****.**" },
                                                                              testDepartment, "localhost", 2500, null, $"ReportTemplates{Path.DirectorySeparatorChar}DepartmentReportView.cshtml", repo)
                {
                    StartTime = ShiftStart,
                    EndTime   = ShiftEnd,
                    Name      = "1st Shift Report (Test)"
                };

                var returnedResults = ShiftReport.GetReportData().Result;

                var ReturnedResultSorted = returnedResults.OrderBy(x => x.MachineInfo.Line).ThenBy(x => x.MachineInfo.Name);

                foreach (var machine in ReturnedResultSorted)
                {
                    machine.States = machine.States.OrderBy(x => x.Start).ThenBy(x => x.End).ThenBy(x => x.State).ToList();
                }

                output.WriteLine($"Date has been returned and sorted");

                //** Output data to "Console"
                foreach (var machine in ReturnedResultSorted)
                {
                    output.WriteLine($"{machine.MachineInfo.Line}.{machine.MachineInfo.Name}");
                    foreach (var state in machine.States)
                    {
                        output.WriteLine($"\t{state}");
                    }
                }

                ReturnedResultSorted.ShouldDeepEqual(ExpectedReportDataSorted);
            }
            finally
            {
                repo.DropDB(TestDB);
            }
        }
コード例 #3
0
        public override void LoadConfiguration(IUserConfig userConfig)
        {
            Stopwatch sw = Stopwatch.StartNew();

            DatabaseConfiguration databaseConfiguration = userConfig.DatabaseConfiguration;

            if (databaseConfiguration is null)
            {
                databaseConfiguration = new DatabaseConfiguration("172.16.28.250", "RALSystem", "1234", "TRMI_RAL_System");
            }

            MachineRepositoryCache MachineRepository = new MachineRepositoryCache(
                ipaddress: databaseConfiguration.IPAddress,
                username: databaseConfiguration.Username,
                password: databaseConfiguration.Password,
                timeOut: TimeSpan.FromMilliseconds(10000),
                databaseName: databaseConfiguration.DatabaseName,
                logger: repositoryLogger);

            ManagerFactory.WithLoggerForCollectorManager(collectorLogger);
            ManagerFactory.WithLoggerForRulesManager(rulesLogger);
            ManagerFactory.WithLoggerForReportManager(reportLogger);
            ManagerFactory.WithLoggerForManager(StartUpLogger);

            var listOfStackLightConfigs = userConfig.LightToMachineMapConfigs.Select(x => x.StackLight).Distinct();

            var listOfStackLights = new List <SignaworksEthernetAsStackLightRYGBW>();

            foreach (var stackLightConfig in listOfStackLightConfigs)
            {
                listOfStackLights.Add(new SignaworksEthernetAsStackLightRYGBW(stackLightConfig.IPAddress, logger: GetIndividualLogger(parentLogger: mainLogger, minimumLevel: LogEventLevel.Debug,
                                                                                                                                      RootDir: _stackLightLogPath, Type: "Stack Light", Name: stackLightConfig.Name, shouldBuffer: _logFilesAreBuffer,
                                                                                                                                      shouldBeShared: _logFilesAreShared, flushToDiskInterval: _flushToDiskEvery, retainedFileCountLimit: _maxRetainedLogFileCount, fileSizeLimitBytes: _maxLogFileSize)));
            }

            //var RepositoryForRules = new RepositoryForRules(MachineRepository);

            int MachineIsRunningGracePeriodInSeconds = userConfig.MachineIsRunningGracePeriodInSeconds;

            var machines = new List <Machine>();

            Stopwatch machinesw = new Stopwatch();

            foreach (var machine in userConfig.MachineConfigs)
            {
                machinesw.Restart();
                StartUpLogger.Here(nameof(Configuration)).Debug("Loading Config for machine {Line}.{Name}", machine.Line, machine.Name);
                var machineInfo = new MachineInfo()
                {
                    MAC        = machine.MAC,
                    Line       = machine.Line,
                    Name       = machine.Name,
                    Department = machine.Department
                };

                var AdamClientLoggers = new Dictionary <string, ILogger>();

                var AdamClientLogger = AdamClientLoggers.FirstOrDefault(x => x.Key == "MAC").Value;

                if (AdamClientLogger is null)
                {
                    AdamClientLogger = GetIndividualLogger(parentLogger: machineLogger, minimumLevel: LogEventLevel.Information, RootDir: _adamClientLogPath, Type: "Adam Client", Name: machineInfo.MAC, shouldBuffer: _logFilesAreBuffer,
                                                           shouldBeShared: _logFilesAreShared, flushToDiskInterval: _flushToDiskEvery, retainedFileCountLimit: _maxRetainedLogFileCount, fileSizeLimitBytes: _maxLogFileSize);
                    AdamClientLoggers.Add(machineInfo.MAC, AdamClientLogger);
                }

                var Press = new Machine(
                    machineInfo,
                    MachineRepository,
                    new Adam6051Client(machineInfo.MAC, AdamClientLogger),
                    machine.MQTTPayloadConverter,
                    logger: GetIndividualLogger(parentLogger: machineLogger, minimumLevel: LogEventLevel.Information, RootDir: _machineLogPath, Type: "Machine", Name: machineInfo.ToString(), shouldBuffer: _logFilesAreBuffer,
                                                shouldBeShared: _logFilesAreShared, flushToDiskInterval: _flushToDiskEvery, retainedFileCountLimit: _maxRetainedLogFileCount, fileSizeLimitBytes: _maxLogFileSize)
                    );

                var tempRuleMachineIsRunning = new RuleMachineIsRunning(machine: Press, TimeSpan.FromSeconds(MachineIsRunningGracePeriodInSeconds),
                                                                        pollInterval: TimeSpan.FromMilliseconds(1000), repository: MachineRepository,
                                                                        logger: GetIndividualLogger(parentLogger: rulesLogger, minimumLevel: LogEventLevel.Information, RootDir: _rulesLogPath, Type: "Rule", Name: $"{machine.LineName}-IsRunning", shouldBuffer: _logFilesAreBuffer,
                                                                                                    shouldBeShared: _logFilesAreShared, flushToDiskInterval: _flushToDiskEvery, retainedFileCountLimit: _maxRetainedLogFileCount, fileSizeLimitBytes: _maxLogFileSize));

                try
                {
                    LightToMachineMapConfiguration LightToMachineMap = userConfig.LightToMachineMapConfigs.First(x => x.Machine == machine);
                    var StackLight = listOfStackLights.First(x => x.IPAddress == LightToMachineMap.StackLight.IPAddress);
                    tempRuleMachineIsRunning.AddAction(new RuleActionStackLightOnWhenIsRunningFalse(StackLight, LightToMachineMap.LightNumberFromTop));
                }
                catch (InvalidOperationException ex) when(ex.Message.Contains("Sequence contains no matching element"))
                {
                    StartUpLogger.Fatal($"Can not find LightToMachine Map for Machine {machine.LineName}. This is currently required for all machines.");
                    throw;
                }

                tempRuleMachineIsRunning.AddAction(new RuleActionWriteIsRunning(MachineRepository, logger: rulesLogger));
                Press.AddRule(tempRuleMachineIsRunning);
                machines.Add(Press);
                machinesw.Stop();
                StartUpLogger.Here(nameof(Configuration)).Debug("Done Loading Configuration for Machine {Line}.{Name}, Took {elapsed}", machine.Line, machine.Name, machinesw.Elapsed);
            }

            ManagerFactory.AddMachines(machines);


            var EmailServer = userConfig.EmailServerConfiguration.EmailServer;         //"smtp.ipower.com";

            var EmailServerPort = userConfig.EmailServerConfiguration.EmailServerPort; // 587;

            var FromEmailAddress = "*****@*****.**";

            var Credentials = userConfig.EmailServerConfiguration.Credentials; //("*****@*****.**", "Betz-320");

            var PathToReportTemplate = $"ReportTemplates{Path.DirectorySeparatorChar}DepartmentReportView.cshtml";

            var RepositoryForReports = new RepositoryForReports(MachineRepository);

            var StartTime = (hour : 00, minute : 30);

            if (userConfig.EmailReportConfigs is null)
            {
                throw new ArgumentNullException($"{nameof(userConfig.EmailReportConfigs)}", $"{nameof(userConfig.EmailReportConfigs)} Can't be null. {"AddEmailReport()"} must be used at least one in {nameof(UserConfigBase.UserConfigLoad)}");
            }

            Stopwatch swreport = new Stopwatch();

            foreach (var reportConfig in userConfig.EmailReportConfigs)
            {
                var ShiftStartHour = 0;
                var ShiftEndHour   = 0;
                var ShiftAsString  = "Error";

                swreport.Restart();
                switch (reportConfig.Shift)
                {
                case Shift.First:
                    ShiftStartHour = 6;
                    ShiftEndHour   = 14;
                    ShiftAsString  = "1st";
                    break;

                case Shift.Second:
                    ShiftStartHour = 14;
                    ShiftEndHour   = 22;
                    ShiftAsString  = "2nd";
                    break;

                case Shift.Third:
                    ShiftStartHour = 22;
                    ShiftEndHour   = 6;
                    ShiftAsString  = "3rd";
                    break;

                default:
                    throw new InvalidOperationException("Invalid Shift Specified");
                }

                for (int i = ShiftStartHour; i < ShiftEndHour; i++)
                {
                    (int hour, int minute)tempStart = (StartTime.hour + i, StartTime.minute);
                    (int hour, int minute)tempEnd   = (StartTime.hour + i + 1, StartTime.minute);

                    var tempReport = new DepartmentTimePeriodReportForCurrentDay(
                        from: FromEmailAddress,
                        emailAddresses: reportConfig.ToEmailAddressesForHourly,
                        department: reportConfig.Department,
                        smtpServerHostName: EmailServer,
                        smtpServerPort: EmailServerPort,
                        smtpServerCredentials: Credentials,
                        pathToTemplate: PathToReportTemplate,
                        repository: MachineRepository,
                        logger: reportLogger)
                    {
                        Name      = $"Report for hour {tempStart.hour:00}:{tempStart.minute:00} - {tempEnd.hour:00}:{tempEnd.minute:00} for {reportConfig.Department}",
                        StartTime = tempStart,
                        EndTime   = tempEnd
                    };

                    ManagerFactory.AddReport(tempReport, (s) => s.ToRunEvery(0).Days().At(tempEnd.hour, tempEnd.minute));
                }

                var shiftReport = new DepartmentTimePeriodReportForCurrentDay(
                    from: FromEmailAddress,
                    emailAddresses: reportConfig.ToEmailAddressesForShiftly,
                    department: reportConfig.Department,
                    smtpServerHostName: EmailServer,
                    smtpServerPort: EmailServerPort,
                    smtpServerCredentials: Credentials,
                    pathToTemplate: PathToReportTemplate,
                    repository: MachineRepository,
                    logger: reportLogger)
                {
                    Name      = $"{ShiftAsString} Shift Report for {reportConfig.Department}",
                    StartTime = (Hour : ShiftStartHour, Minute : 30),
                    EndTime   = (Hour : ShiftEndHour, Minute : 30)
                };

                /*
                 * var secondShiftReport = new DepartmentTimePeriodReportForCurrentDay(
                 *  from: FromEmailAddress,
                 *  emailAddresses: reportConfig.ToEmailAddressesForShiftly,
                 *  department: reportConfig.Department,
                 *  smtpServerHostName: EmailServer,
                 *  smtpServerPort: EmailServerPort,
                 *  smtpServerCredentials: Credentials,
                 *  pathToTemplate: PathToReportTemplate,
                 *  repository: MachineRepository,
                 *  logger: reportLogger)
                 * {
                 *  Name = $"2nd Shift Report for {reportConfig.Department}",
                 *  StartTime = (Hour: 14, Minute: 30),
                 *  EndTime = (Hour: 22, Minute: 30)
                 * };
                 *
                 * var thirdShiftReport = new DepartmentTimePeriodReportForCurrentDay(
                 *  from: FromEmailAddress,
                 *  emailAddresses: reportConfig.ToEmailAddressesForShiftly,
                 *  department: reportConfig.Department,
                 *  smtpServerHostName: EmailServer,
                 *  smtpServerPort: EmailServerPort,
                 *  smtpServerCredentials: Credentials,
                 *  pathToTemplate: PathToReportTemplate,
                 *  repository: MachineRepository,
                 *  logger: reportLogger)
                 * {
                 *  Name = $"3rd Shift Report for {reportConfig.Department}",
                 *  StartTime = (Hour: 22, Minute: 30),
                 *  EndTime = (Hour: 06, Minute: 30)
                 * };
                 */
                ManagerFactory.AddReport(shiftReport, (s) => s.ToRunEvery(0).Days().At(ShiftEndHour, 30));

                //ManagerFactory.AddReport(secondShiftReport, (s) => s.ToRunEvery(0).Days().At(22, 30));

                //ManagerFactory.AddReport(thirdShiftReport, (s) => s.ToRunEvery(0).Days().At(06, 30));

                swreport.Stop();
                StartUpLogger.Here(nameof(Configuration)).Debug("Done Loading Configuration for report {Department}, Took {elapsed}", reportConfig.Department, swreport.Elapsed);
            }


            sw.Stop();
            StartUpLogger.Here(nameof(Configuration)).Debug("Done Loading Configuration, Took {elapsed}", sw.Elapsed);
        }