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));
        }
Esempio n. 4
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 8
0
		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
			};
		}