private async Task <TestRunResult> RunAsync(ExecutionData executionData, string environmentPath, string binariesFolder, ExecutableCode testingCode) { var testRunEnvironment = Path.Combine(environmentPath, Guid.NewGuid().ToString()); binariesFolder.CopyFolderTo(testRunEnvironment); string inputFilePath = Path.Combine(testRunEnvironment, _configuration.InputFileName); File.WriteAllText(inputFilePath, executionData.InputData); var executionCommand = testingCode.GetExecutionCommand(testRunEnvironment); executionCommand.StdinFilename = _configuration.InputFileName; var containerExecutionResult = await _executor.ExecuteAsync(executionCommand); var outputFile = Path.Combine(testRunEnvironment, _configuration.OutputFileName); return(new TestRunResult { ExecutionResult = containerExecutionResult.Result, ExpectedOutput = executionData.OutputData, UserOutput = await GetUserOutput(outputFile, containerExecutionResult) }); }
public async Task <CompilationResult> CompileCodeAsync(CompilableCode code) { var codeFilename = _configuration.CodeName + code.Language.GetExtension(); var pathToCode = Path.Combine(code.WorkingDirectory, codeFilename); var compilationCommand = code.GetCompilationCommand(code.WorkingDirectory); var execute = await _executor.ExecuteAsync(compilationCommand); if (execute.WasSuccessful) { return(new CompilationResult { OutputPath = pathToCode, ExecutablePath = code.GetExecutable() }); } return(new CompilationResult { Errors = execute.ErrorOutput.Split(Environment.NewLine) .Union(execute.StandardOutput.Split(Environment.NewLine)) .ToArray() }); }
public async Task <CodeAnalysisResult> Analyse(TestingCode code) { var tempFolder = Path.Combine(Configuration.TempFolderPath, Guid.NewGuid().ToString()); await CreateDirectoryForAnalysis(code, tempFolder); ExecutableCode executableCode = _codeFactory.GetExecutableCode(code); Command executionCommand = GetCompilationCommand(executableCode, tempFolder); Command analysisCommand = ModifyCommandForAnalysis(executionCommand); ContainerExecutionResult containerExecutionResult = await _executor.ExecuteAsync(analysisCommand); CodeAnalysisResult codeAnalysis = new CodeAnalysisResult(); if (containerExecutionResult.Result == ExecutionResult.Success) { codeAnalysis = AnalyseOutput(containerExecutionResult); } Directory.Delete(tempFolder, true); return(codeAnalysis); }