Exemplo n.º 1
0
        private async Task <ExecutionResult> SolveCaseBaseAsync(CourseProblemCase @case)
        {
            var caseId  = @case.Id;
            var subcase = Item.Results.First(i => i.Case == caseId);

            // skip global timeouts
            if (TimeBank.IsBusted())
            {
                subcase.SetStatus(ProcessStatus.Skipped);
                subcase.TimeLimit = 0;
                subcase.Messages  = new[] { "No time left" };
                return(new ExecutionResult
                {
                    Code = ExecutionStatus.GlobalTimeout,
                    Status = ExecutionStatus.GlobalTimeout.ToString(),
                    Duration = 0,
                    ReturnCode = -1,
                });
            }

            // copy test assets
            CopyInDocker($"assets/{caseId}/*");

            subcase.Status    = ProcessStatus.Running.Value;
            subcase.TimeLimit = @case.Timeout.ScaleTo(Context.Language);

            var language   = Context.Language;
            var isUnitTest = Context.CourseProblem.Type == ProblemType.Unittest;
            var pipeline   = isUnitTest && language.Unittest.Any()
                ? language.Unittest
                : language.Run;


            SetPermissions();
            var executionResult = ExecuteCommand(new ExecutionCommand
            {
                Command  = $"{string.Join(" ", pipeline)}".ReplaceCommon(Context.MainFileName),
                Workdir  = Context.DockerTmpWorkdir,
                Timeout  = @case.Timeout.ScaleTo(language),
                Deadline = TimeBank.TimeLeft,
                IPath    = isUnitTest ? null : $"input/{@case.Id}",
                OPath    = $"output/{@case.Id}",
                EPath    = $"error/{@case.Id}"
            });


            CopyOutputFromDocker(@case);
            CopyErrorFromDocker(@case);
            CopyFromDocker(".report.json");
            CopyFromDocker(".report.simple.json");
            foreach (var f in Context.CourseProblem.Export)
            {
                CopyFromDocker(f);
            }

            // determine messages and statuses
            _evaluationService.EvaluateTypeSolve(executionResult, this, @case);
            return(executionResult);
        }
Exemplo n.º 2
0
        private async Task GenerateInputAction(CourseProblemCase @case)
        {
            var subcase = Item.Results.First(i => i.Case == @case.Id);

            if ([email protected]())
            {
                subcase.Status    = ProcessStatus.Skipped.Value;
                subcase.Message   = "Skipping static input file";
                subcase.TimeLimit = 0;
                return;
            }

            // skip global timeouts
            if (TimeBank.IsBusted())
            {
                subcase.SetStatus(ProcessStatus.Skipped);
                subcase.Messages  = new[] { "No time left" };
                subcase.TimeLimit = 0;
                return;
            }

            subcase.Status    = ProcessStatus.Running.Value;
            subcase.TimeLimit = @case.Timeout.ScaleTo(Context.Language);

            var baseCommand    = $"{string.Join(" ", Context.Language.Run)}".ReplaceCommon(Context.MainFileName);
            var fullCommand    = $"{baseCommand} {@case.GetArguments()}";
            var generateResult = ExecuteCommand(new ExecutionCommand
            {
                Command  = fullCommand,
                Workdir  = Context.DockerTmpWorkdir,
                Timeout  = @case.Timeout.ScaleTo(Context.Language),
                Deadline = TimeBank.TimeLeft,
                OPath    = $"output/{@case.Id}",
                EPath    = $"error/{@case.Id}",
            });

            CopyOutputFromDocker(@case);
            CopyErrorFromDocker(@case);
            CopyToResultDir(Context.TmpDir.OutputDir, Context.ProblemDir.InputDir, false);

            _evaluationService.EvaluateTypeGenerate(generateResult, this, @case);
        }