feat: testrun

This commit is contained in:
dragonmuffin 2024-08-25 23:09:57 +05:00
parent 858b2e7fd7
commit 6cc4bd0638
6 changed files with 65 additions and 16 deletions

View file

@ -1,6 +1,7 @@
package runner
import (
"errors"
"io"
"fmt"
"log"
@ -10,7 +11,7 @@ import (
cgroups "github.com/containerd/cgroups"
rand "math/rand"
"time"
"git.sch9.ru/new_gate/ms-runner/languages"
"git.sch9.ru/new_gate/ms-tester/pkg/models"
)
const runIdLength = 20
@ -56,6 +57,15 @@ func copyFile(src string,dst string) error {
return nil
}
func newRunFolder() (string,error) {
runId := genRunId()
err := os.Mkdir("runs/" + runId, 0777)
if(err!=nil) { return "",err }
err = os.Chmod("runs/" + runId, 0777)
if(err!=nil) { return "",err }
return runId,nil
}
func extractNumbers(s string) (result []int32) {
lastNumber, isNumber := false,false
var curNumber int32 = 0
@ -116,12 +126,10 @@ func NewRunnerService() (*RunnerService, error) {
func (runnerService RunnerService) Build(languageId int32, filename string) {
core := <-runnerService.CoreFreed
runId := genRunId()
err := os.Mkdir("runs/" + runId, 0777)
if(err!=nil) { log.Fatal(err) }
os.Chmod("runs/" + runId, 0777)
runId,err := newRunFolder()
if(err!=nil) {log.Fatal
copyFile(filename,"runs/"+runId+"/src")
runnerService.IsolatedRun(languages.Languages[languageId].CompileCmd,"../runs/"+runId,Limits{Processes: 10,Core:core,Memory:BuildMemory,Time:BuildTime});
runnerService.IsolatedRun(models.Languages[languageId].CompileCmd,"../runs/"+runId,Limits{Processes: 10,Core:core,Memory:BuildMemory,Time:BuildTime});
copyFile("runs/"+runId+"/executable","executable")
os.RemoveAll("runs/" + runId)
go func() {
@ -129,13 +137,43 @@ func (runnerService RunnerService) Build(languageId int32, filename string) {
}()
}
func (runnerService RunnerService) IsolatedRun(command []string, sharedFolder string, limits Limits) {
func (runnerService RunnerService) RunTest(solutionLanguageId int32, solutionFilename string, inputFilename string, checkerLanguageId int32, checkerFilename string, limits Limits) (models.Result) {
core := <-runnerService.CoreFreed
testRunId,err := newRunFolder()
if(err!=nil) {log.Fatal
copyFile(solutionFilename,"runs/"+testRunId+"/executable")
copyFile(inputFilename,"runs/"+testRunId+"/in")
code,err = runnerService.IsolatedRun(models.Languages[languageId].RunCmd,"../runs/"+testRunId,limits);
defer os.RemoveAll("runs/" + testRunId)
if(err!=nil) {log.Fatal(err);}
if(code!=0) {return models.RuntimeError}
checkRunId,err := newRunFolder()
copyFile("runs/"+testRunId+"/out","runs/"+checkRunId+"/out")
err = runnerService.IsolatedRun(models.Languages[languageId].RunCmd,"../runs/"+checkRunId,Limits{Processes: 10,Core:core,Memory:BuildMemory,Time:BuildTime}); //FIXME add input/output/answer files options
defer os.RemoveAll("runs/" + checkRunId)
if(err!=nil) {log.Fatal(err);}
switch code {
case 0: return models.Accepted //FIXME add model constants
case 1: return models.WrongAnswer
case 2: return models.PresentationError
case 3: return models.SystemFailDuringTesting
}
return models.SystemFailDuringTesting //bad checker result is a system fail
go func() {
runnerService.CoreFreed <- core
}()
}
func (runnerService RunnerService) IsolatedRun(command []string, sharedFolder string, limits Limits) (int32,error) {
args := []string{int32ToString(limits.Processes),int32ToString(limits.Core), int32ToString(limits.Memory), int32ToString(limits.Time), sharedFolder}
args = append(args, command...)
log.Println("running isolated process with command:",args)
cmd := exec.Command("starter/starter", args...)
err := cmd.Run();
if err != nil {
log.Println(err)
if errors.Is(err,exec.ExitError) {
return err.ProcessState.ExitCode,nil
} else if(err!=nil) {
return 0,err
}
return 0,nil
}