feat: testrun
This commit is contained in:
parent
858b2e7fd7
commit
6cc4bd0638
6 changed files with 65 additions and 16 deletions
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue