示例#1
0
        private async Task <List <TestRunStepItem> > CompareOutputs(TestReadModel test, TestRunReadModel testRun)
        {
            var result = new List <TestRunStepItem>();

            var testExePath = _paths.TestsData.Execs[test.Name].MainExePaths.Absolute;
            var inputsPath  = _paths.RunsData[ProcessingRun.Id][testRun.Id].Inputs;

            _processingRunData.CurrentItemIndex = 0;

            foreach (var inputFile in Directory.GetFiles(inputsPath.Absolute))
            {
                var started = DateTime.Now;

                var inputName = Path.GetFileNameWithoutExtension(inputFile);

                _processingRunData.CurrentItemName = inputName;
                SendRunData();

                var exeOutputPath      = _paths.RunsData[ProcessingRun.Id][testRun.Id].Outputs[inputName].Absolute;
                var cilantroOutputPath = _paths.RunsData[ProcessingRun.Id][testRun.Id].CilAntroOutputs[Path.GetFileNameWithoutExtension(inputFile)].Absolute;

                var exeOutput = await File.ReadAllTextAsync(exeOutputPath);

                var cilantroOutput = await File.ReadAllTextAsync(cilantroOutputPath);

                var areOutputsIdentical = exeOutput.Equals(cilantroOutput);

                var finished = DateTime.Now;

                var item = new TestRunStepItem
                {
                    Id   = Guid.NewGuid(),
                    Name = Path.GetFileNameWithoutExtension(inputFile),
                    ProcessedForMilliseconds = (int)(finished - started).TotalMilliseconds,
                    Outcome = areOutputsIdentical ? RunOutcome.Ok : RunOutcome.Wrong
                };
                result.Add(item);

                _processingRunData.CurrentItemIndex++;
            }

            return(result);
        }
示例#2
0
        private async Task <List <TestRunStepItem> > GenerateCilAntroOutputFiles(TestReadModel test, TestRunReadModel testRun)
        {
            var result = new List <TestRunStepItem>();

            var testExePath = _paths.TestsData.Execs[test.Name].MainExePaths.Absolute;
            var inputsPath  = _paths.RunsData[ProcessingRun.Id][testRun.Id].Inputs;

            _processingRunData.CurrentItemIndex = 0;

            foreach (var inputFile in Directory.GetFiles(inputsPath.Absolute))
            {
                string errorText = null;

                var inputName  = Path.GetFileNameWithoutExtension(inputFile);
                var outputPath = _paths.RunsData[ProcessingRun.Id][testRun.Id].CilAntroOutputs[inputName].Absolute;
                var errorPath  = _paths.RunsData[ProcessingRun.Id][testRun.Id].CilAntroErrors[inputName].Absolute;

                var started = DateTime.Now;

                try
                {
                    _processingRunData.CurrentItemName = inputName;
                    SendRunData();

                    var testIlSourcePath = _paths.TestsData.IlSources[test.Name].MainIlSourcePaths.Absolute;

                    var processStartInfo = new ProcessStartInfo(_paths.CilAntro, $"--fileName \"{testIlSourcePath}\"")
                    {
                        RedirectStandardOutput = true,
                        RedirectStandardInput  = true,
                        RedirectStandardError  = true,
                        WindowStyle            = ProcessWindowStyle.Hidden,
                        CreateNoWindow         = true
                    };

                    var outputBuilder = new StringBuilder();
                    var errorBuilder  = new StringBuilder();

                    using (var cancelTokenSource = new CancellationTokenSource())
                    {
                        var token = cancelTokenSource.Token;

                        var newProcess = new Process
                        {
                            StartInfo = processStartInfo
                        };

                        var hasStarted  = false;
                        var hasFinished = false;
                        var attempts    = 0;
                        while (!hasStarted && attempts < 10)
                        {
                            hasStarted = newProcess.Start();
                            attempts++;
                        }

                        if (hasStarted)
                        {
                            var errorOutputTask = Task.Run(async() =>
                            {
                                var errorOutput = newProcess.StandardError;
                                while (true)
                                {
                                    if (errorOutput.EndOfStream && !hasFinished)
                                    {
                                        await Task.Delay(100);
                                        continue;
                                    }
                                    else if (errorOutput.EndOfStream)
                                    {
                                        break;
                                    }

                                    var errorLine = await newProcess.StandardError.ReadLineAsync();
                                    errorBuilder.AppendLine(errorLine);
                                }
                            }, token);

                            var exeOutputTask = Task.Run(async() =>
                            {
                                var exeOutput = newProcess.StandardOutput;
                                while (true)
                                {
                                    if (exeOutput.EndOfStream && !hasFinished)
                                    {
                                        await Task.Delay(100);
                                        continue;
                                    }
                                    else if (exeOutput.EndOfStream)
                                    {
                                        break;
                                    }

                                    var outputLine = await exeOutput.ReadLineAsync();
                                    outputBuilder.AppendLine(outputLine);
                                }
                            }, token);

                            var inputTask = Task.Run(async() =>
                            {
                                using (var streamReader = new StreamReader(inputFile))
                                {
                                    await newProcess.StandardInput.WriteAsync(await streamReader.ReadToEndAsync());
                                    await newProcess.StandardInput.FlushAsync();
                                }
                            }, token);

                            newProcess.WaitForExit();

                            //if (!newProcess.HasExited)
                            //{
                            //    newProcess.Kill();
                            //}

                            hasFinished = true;
                            Task.WaitAll(errorOutputTask, exeOutputTask);

                            //cancelTokenSource.Cancel();

                            errorText = errorBuilder.ToString();
                            if (inputTask.IsFaulted)
                            {
                                errorText = $"INPUT TASK ERROR\n\n{inputTask.Exception.Message}";
                            }
                            else if (exeOutputTask.IsFaulted)
                            {
                                errorText = $"EXE OUTPUT TASK ERROR\n\n{exeOutputTask.Exception.Message}";
                            }
                            else if (errorOutputTask.IsFaulted)
                            {
                                errorText = $"ERROR OUTPUT TASK ERROR\n\n{errorOutputTask.Exception.Message}";
                            }
                        }
                        else
                        {
                            errorText = "AFTER 10 ATTEMPTS THE PROCESS HAS NOT BEEN STARTED";
                        }
                    }

                    await File.WriteAllTextAsync(outputPath, outputBuilder.ToString());
                }
                catch (Exception ex)
                {
                    errorText = $"OTHER EXCEPTION\n\n{ex.Message}";
                }

                var hasErrors = !string.IsNullOrEmpty(errorText);
                await File.WriteAllTextAsync(errorPath, errorText);

                var finished = DateTime.Now;

                var item = new TestRunStepItem
                {
                    Id   = Guid.NewGuid(),
                    Name = Path.GetFileNameWithoutExtension(inputFile),
                    ProcessedForMilliseconds = (int)(finished - started).TotalMilliseconds,
                    Outcome = !hasErrors ? RunOutcome.Ok : RunOutcome.Wrong
                };
                result.Add(item);

                _processingRunData.CurrentItemIndex++;
            }

            return(result);
        }
示例#3
0
        private async Task <List <TestRunStepItem> > GenerateInputFiles(TestReadModel test, TestRunReadModel testRun)
        {
            var result = new List <TestRunStepItem>();

            _processingRunData.AllItemsCount    = ProcessingRun.Type == RunType.Quick ? test.IoExamples.Count + 3 : test.IoExamples.Count + 100;
            _processingRunData.CurrentItemIndex = 0;

            foreach (var ioExample in test.IoExamples)
            {
                var started = DateTime.Now;

                var inputName = ioExample.Name.Replace(' ', '_');

                _processingRunData.CurrentItemName = inputName;
                SendRunData();

                var inputPath = _paths.RunsData[ProcessingRun.Id][testRun.Id].Inputs[inputName].Absolute;
                await File.WriteAllTextAsync(inputPath, ioExample.Input);

                var finished = DateTime.Now;

                var item = new TestRunStepItem
                {
                    Id   = Guid.NewGuid(),
                    Name = Path.GetFileNameWithoutExtension(inputPath),
                    ProcessedForMilliseconds = (int)(finished - started).TotalMilliseconds,
                    Outcome = RunOutcome.Ok
                };
                result.Add(item);

                _processingRunData.CurrentItemIndex++;
            }

            var randomInputsToGenerate = ProcessingRun.Type == RunType.Full ? 100 : 3;

            {
                var inputFactory = new InputFactory(test.Input);

                for (int i = 1; i <= randomInputsToGenerate; i++)
                {
                    var started = DateTime.Now;

                    var inputName = $"Random_{i.ToString("D3")}";

                    _processingRunData.CurrentItemName = inputName;
                    SendRunData();

                    var inputPath = _paths.RunsData[ProcessingRun.Id][testRun.Id].Inputs[inputName].Absolute;
                    var input     = inputFactory.GenerateRandomInput();

                    if (input != null)
                    {
                        await File.WriteAllTextAsync(inputPath, input);
                    }

                    var finished = DateTime.Now;

                    var item = new TestRunStepItem
                    {
                        Id   = Guid.NewGuid(),
                        Name = Path.GetFileNameWithoutExtension(inputPath),
                        ProcessedForMilliseconds = (int)(finished - started).TotalMilliseconds,
                        Outcome = input != null ? RunOutcome.Ok : RunOutcome.Wrong
                    };
                    result.Add(item);

                    _processingRunData.CurrentItemIndex++;
                }
            }

            return(result);
        }