public CodeExecutionResponse Execute(CodeExecutionRequest codeExecutionRequest) { var executionRequestData = ComposeExecutionRequestData(); var executionResultLinkId = GetExecutionResultLinkId(codeExecutionRequest, executionRequestData); return(GetCodeExecutionResult(executionResultLinkId)); }
private string GetExecutionResultLinkId(CodeExecutionRequest codeExecutionRequest, CodeExecutionRequestData requestData) { using (var client = new CookieAwareWebClient()) { client.CookieContainer.Add(requestData.CookieCollection); client.UploadValues(IdeOneBaseUrl + IdeOneSubmissionPostfix, GetCodeSubmissionRequestParameters(codeExecutionRequest, requestData)); return(client.ResponseUri.AbsolutePath.Replace("/", "")); } }
public async Task <ActionResult> Run2([FromBody] ProblemSolutionForTransferDto problemSolutionForTransfer) { CodeExecutionRequest codeExecutionRequest = new CodeExecutionRequest() { SourceCode = problemSolutionForTransfer.EncodedSourceCode.FromBase64ToString(), TestCases = problemSolutionForTransfer.TestCases.Select(x => new TestCaseRequest() { SampleInput = x.SampleInput, ExpectedOutput = x.ExpectedOutput }).ToList() }; var results = await _codeExecutionService.ExecuteAsync(codeExecutionRequest); return(Ok(results)); }
public async Task <ActionResult> RunSolution([FromBody] SolutionRunRequest solutionToRun) { // check if student exists var student = await _context.Students.FindAsync(solutionToRun.StudentId); if (student == null) { return(NotFound()); } // check if problem exists var courseProblem = await _context.CourseProblems .Include(cp => cp.Problem) .ThenInclude(p => p.TestCases) .FirstOrDefaultAsync(p => p.Id == solutionToRun.CourseProblemId); if (courseProblem == null) { return(NotFound()); } // solution doesnt exist, create. else update source code var solution = await _context.Solutions.FindAsync(solutionToRun.SolutionId); if (solution == null) { solution = _mapper.Map <Solution> (solutionToRun); _context.Solutions.Add(solution); } else { solution.SourceCode = solutionToRun.SourceCode; } await _context.SaveChangesAsync(); var codeExecutionRequest = new CodeExecutionRequest() { SolutionId = solution.Id, SourceCode = solutionToRun.SourceCode, TestCases = _mapper.Map <List <TestCaseRequest> > (courseProblem.Problem.TestCases) }; var results = await _codeExecutionService.ExecuteAsync(codeExecutionRequest); return(Ok(results)); }
private NameValueCollection GetCodeSubmissionRequestParameters(CodeExecutionRequest codeExecutionRequest, CodeExecutionRequestData requestData) { var nameValueCollection = new NameValueCollection(); foreach (var protectionFieldValue in requestData.ProtectionFieldValues) { nameValueCollection.Add(protectionFieldValue.Key, protectionFieldValue.Value); } nameValueCollection.Add("file", codeExecutionRequest.SourceCode); nameValueCollection.Add("input", PrepareInputParameters(codeExecutionRequest.Input)); nameValueCollection.Add("timelimit", "0"); nameValueCollection.Add("_lang", ((int)codeExecutionRequest.CodeLanguage).ToString()); nameValueCollection.Add("public", "0"); nameValueCollection.Add("run", "1"); return(nameValueCollection); }
public static SolutionInfo CreateSolutionInfo(CodeExecutionRequest request) { List <string> stdinFilenames = new List <string> (); for (int i = 0; i < request.TestCases.Count; i++) { stdinFilenames.Add($"in-{Helpers.RandomId(8)}"); } return(new SolutionInfo() { SolutionName = $"sol-{Helpers.RandomId(32)}", StandardInputDirectory = $"stdin-{Helpers.RandomId(8)}", StandardInputFilenames = stdinFilenames, ProgramFilename = "main.cpp", ProgramName = "main", SourceCode = request.SourceCode, SampleInputs = request.TestCases.Select(r => r.SampleInput).ToList() }); }
public void Execute_ValidPythonRequestProvided_ValidResultReturned() { var request = new CodeExecutionRequest { CodeLanguage = CodeLanguage.Python, SourceCode = "import fileinput" + "\nfor line in fileinput.input():" + "\n print line", Input = new List <string> { Parameter1, Parameter2 } }; var response = subject.Execute(request); response.Should().NotBeNull(); response.IsValid.Should().BeTrue(); response.Output.Should().NotBeNull(); var output = response.Output.ToList(); output[0].Should().Be(Parameter1); output[1].Should().Be(Parameter2); }
public async Task<CodeExecutionResult> ExecuteAsync (CodeExecutionRequest request) { // TODO: Just spawn extra containers? if (AvailableContainers.Count <= 0) { Console.WriteLine ("There are no available contianer runners, try again later"); return null; } // get a new SolutionInfo var solutionInfo = SolutionInfoFactory.CreateSolutionInfo (request); List<TestCaseResult> testResults = new List<TestCaseResult> (); bool timedOut = false; // get available ContainerRunner var containerRunner = AvailableContainers.Pop (); BusyContainers.Add (containerRunner); try { // run var runResult = await containerRunner.RunAsync (solutionInfo); Console.WriteLine ("Exit Code"); Console.WriteLine (runResult.ExitCode); Console.WriteLine ("StandardOutput"); Console.WriteLine (runResult.StandardOutput); Console.WriteLine ("StandardError"); Console.WriteLine (runResult.StandardError); if (runResult.ExitCode != 0) { Console.WriteLine ("HINDI ZERO EXIT CODE"); return new CodeExecutionResult () { SolutionId = request.SolutionId, Passed = false, CompilationError = runResult.StandardOutput }; } var outputs = runResult.StandardOutput.Split (":") .Select (x => Regex.Replace (x, @"\t|\n|\r", "").FromBase64ToString ().Trim ()).ToList (); for (int i = 0; i < request.TestCases.Count; i++) { var testCase = request.TestCases[i]; var testResult = new TestCaseResult () { SampleInput = testCase.SampleInput, ExpectedOutput = testCase.ExpectedOutput, ActualOutput = outputs[i], Status = testCase.ExpectedOutput.Equals (outputs[i]) ? TestCaseStatus.Passed : TestCaseStatus.Failed }; testResults.Add (testResult); } } catch (OperationCanceledException op) { Console.WriteLine ("Code Execution Timed Out"); Console.WriteLine (op.Message); timedOut = true; } catch (Exception e) { Console.WriteLine ("MAY EXCEPTION"); Console.WriteLine (e.Message); // TODO: Catch OperationCanceledException // add property in result. TimedOut? if timedout, return result. your code timeout after t seconds timedOut = true; } finally { BusyContainers.Remove (containerRunner); AvailableContainers.Push (containerRunner); } bool passed = testResults.Count > 0 && testResults.All (t => t.Status == TestCaseStatus.Passed); return new CodeExecutionResult () { SolutionId = request.SolutionId, TestCaseResults = testResults, Passed = passed, TimedOut = timedOut }; }