github.com/Myriad-Dreamin/tarus@v0.0.0-20220422082640-5379b6998284/cmd/tests/containerd-judge/main.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"encoding/hex"
     6  	"fmt"
     7  	"github.com/Myriad-Dreamin/tarus/api/tarus"
     8  	hr_bytes "github.com/Myriad-Dreamin/tarus/pkg/hr-bytes"
     9  	tarus_judge "github.com/Myriad-Dreamin/tarus/pkg/tarus-judge"
    10  	oci_judge "github.com/Myriad-Dreamin/tarus/pkg/tarus-judge/oci"
    11  )
    12  
    13  func hexUrl(s string) string {
    14  	return fmt.Sprintf("hexbytes://%s", hex.EncodeToString([]byte(s)))
    15  }
    16  
    17  func echoTest(client *oci_judge.ContainerdJudgeServiceServer, ctx context.Context) {
    18  	if _, err := tarus_judge.TransientJudge(client, ctx, &tarus_judge.TransientJudgeRequest{
    19  		ImageId:   "docker.io/library/ubuntu:20.04",
    20  		BinTarget: "data/workdir-judge-engine0/echo_test",
    21  		MakeJudgeRequest: &tarus.MakeJudgeRequest{
    22  			Testcases: []*tarus.JudgeTestcase{
    23  				{
    24  					JudgeKey:   []byte("001"),
    25  					IoProvider: "memory",
    26  					Input:      hexUrl(``),
    27  					Answer:     hexUrl(`hello world`),
    28  				},
    29  			},
    30  		},
    31  	}); err != nil {
    32  		panic(err)
    33  	}
    34  }
    35  
    36  func compileEchoTest(client *oci_judge.ContainerdJudgeServiceServer, ctx context.Context) {
    37  	if _, err := tarus_judge.TransientJudge(client, ctx, &tarus_judge.TransientJudgeRequest{
    38  		ImageId:     "docker.io/library/ubuntu:20.04",
    39  		CompileFile: "cmd/tests/containerd-judge/programs/echo_test.cc",
    40  		MakeJudgeRequest: &tarus.MakeJudgeRequest{
    41  			Testcases: []*tarus.JudgeTestcase{
    42  				{
    43  					JudgeKey:   []byte("001"),
    44  					IoProvider: "memory",
    45  					Input:      hexUrl(``),
    46  					Answer:     hexUrl(`hello world`),
    47  				},
    48  			},
    49  		},
    50  	}); err != nil {
    51  		panic(err)
    52  	}
    53  }
    54  
    55  func sleepTest(client *oci_judge.ContainerdJudgeServiceServer, ctx context.Context) {
    56  	if _, err := tarus_judge.TransientJudge(client, ctx, &tarus_judge.TransientJudgeRequest{
    57  		ImageId:   "docker.io/library/ubuntu:20.04",
    58  		BinTarget: "data/workdir-judge-engine0/sleep_test",
    59  		MakeJudgeRequest: &tarus.MakeJudgeRequest{
    60  			Testcases: []*tarus.JudgeTestcase{
    61  				{
    62  					JudgeKey:   []byte("001"),
    63  					IoProvider: "memory",
    64  					Input:      hexUrl(``),
    65  					Answer:     hexUrl(`hello world`),
    66  				},
    67  			},
    68  		},
    69  	}); err != nil {
    70  		panic(err)
    71  	}
    72  }
    73  
    74  func sleepHardTest(client *oci_judge.ContainerdJudgeServiceServer, ctx context.Context) {
    75  	if _, err := tarus_judge.TransientJudge(client, ctx, &tarus_judge.TransientJudgeRequest{
    76  		ImageId:   "docker.io/library/ubuntu:20.04",
    77  		BinTarget: "data/workdir-judge-engine0/sleep_hard_test",
    78  		MakeJudgeRequest: &tarus.MakeJudgeRequest{
    79  			Testcases: []*tarus.JudgeTestcase{
    80  				{
    81  					JudgeKey:   []byte("001"),
    82  					IoProvider: "memory",
    83  					Input:      hexUrl(``),
    84  					Answer:     hexUrl(`hello world`),
    85  				},
    86  				{
    87  					JudgeKey:   []byte("002"),
    88  					IoProvider: "memory",
    89  					Input:      hexUrl(``),
    90  					Answer:     hexUrl(`hello world`),
    91  				},
    92  			},
    93  		},
    94  	}); err != nil {
    95  		panic(err)
    96  	}
    97  }
    98  
    99  func ioTest(client *oci_judge.ContainerdJudgeServiceServer, ctx context.Context) {
   100  	if _, err := tarus_judge.TransientJudge(client, ctx, &tarus_judge.TransientJudgeRequest{
   101  		ImageId:   "docker.io/library/ubuntu:20.04",
   102  		BinTarget: "data/workdir-judge-engine0/io_test",
   103  		MakeJudgeRequest: &tarus.MakeJudgeRequest{
   104  			Testcases: []*tarus.JudgeTestcase{
   105  				{
   106  					JudgeKey:   []byte("001"),
   107  					IoProvider: "memory",
   108  					Input:      hexUrl("1 2\n"),
   109  					Answer:     hexUrl(`3`),
   110  				},
   111  			},
   112  		},
   113  	}); err != nil {
   114  		panic(err)
   115  	}
   116  }
   117  
   118  func inputTest(client *oci_judge.ContainerdJudgeServiceServer, ctx context.Context) {
   119  	if _, err := tarus_judge.TransientJudge(client, ctx, &tarus_judge.TransientJudgeRequest{
   120  		ImageId:   "docker.io/library/ubuntu:20.04",
   121  		BinTarget: "data/workdir-judge-engine0/echo_input_test",
   122  		MakeJudgeRequest: &tarus.MakeJudgeRequest{
   123  			Testcases: []*tarus.JudgeTestcase{
   124  				{
   125  					JudgeKey:   []byte("001"),
   126  					IoProvider: "memory",
   127  					Input:      hexUrl("yes\n"),
   128  					Answer:     hexUrl(`yes`),
   129  				},
   130  			},
   131  		},
   132  	}); err != nil {
   133  		panic(err)
   134  	}
   135  }
   136  
   137  func statusTest(client *oci_judge.ContainerdJudgeServiceServer, ctx context.Context) {
   138  	testcases := []*tarus.JudgeTestcase{
   139  		{
   140  			JudgeKey:   []byte("001"),
   141  			IoProvider: "memory",
   142  			Input:      hexUrl("exit\n"),
   143  			Answer:     hexUrl(``),
   144  		},
   145  		{
   146  			JudgeKey:   []byte("002"),
   147  			IoProvider: "memory",
   148  			Input:      hexUrl("abort\n"),
   149  			Answer:     hexUrl(``),
   150  		},
   151  		{
   152  			JudgeKey:   []byte("003"),
   153  			IoProvider: "memory",
   154  			Input:      hexUrl("null\n"),
   155  			Answer:     hexUrl(``),
   156  		},
   157  		{
   158  			JudgeKey:   []byte("004"),
   159  			IoProvider: "memory",
   160  			Input:      hexUrl("fpe\n"),
   161  			Answer:     hexUrl(``),
   162  		},
   163  		// safe usage
   164  		{
   165  			JudgeKey:   []byte("005"),
   166  			IoProvider: "memory",
   167  			Input:      hexUrl(fmt.Sprintf("memory=%d\n", int64(384*hr_bytes.MB))),
   168  			Answer:     hexUrl(``),
   169  		},
   170  		// mle, 384 + 128 >= 512MB
   171  		{
   172  			JudgeKey:   []byte("006"),
   173  			IoProvider: "memory",
   174  			Input:      hexUrl(fmt.Sprintf("memory=%d,memory=%d\n", int64(384*hr_bytes.MB), int64(128*hr_bytes.MB))),
   175  			Answer:     hexUrl(``),
   176  		},
   177  		// ok, unused virtual memory are not traced by page usage
   178  		{
   179  			JudgeKey:   []byte("007"),
   180  			IoProvider: "memory",
   181  			Input:      hexUrl(fmt.Sprintf("virt_memory=%d\n", int64(384*hr_bytes.MB))),
   182  			Answer:     hexUrl(``),
   183  		},
   184  		// early rejected by system, gets runtime error
   185  		{
   186  			JudgeKey:   []byte("008"),
   187  			IoProvider: "memory",
   188  			Input:      hexUrl(fmt.Sprintf("virt_memory=%d\n", int64(512*hr_bytes.MB))),
   189  			Answer:     hexUrl(``),
   190  		},
   191  	}
   192  
   193  	//for i := 1; i < 0x20; i++ {
   194  	//	testcases = append(testcases, &tarus.JudgeTestcase{
   195  	//		JudgeKey:   []byte(fmt.Sprintf("signal:%v", syscall.Signal(i).String())),
   196  	//		IoProvider: "memory",
   197  	//		Input:      hexUrl(fmt.Sprintf("signal=%v\n", i)),
   198  	//		Answer:     hexUrl(``),
   199  	//	})
   200  	//	testcases = append(testcases, &tarus.JudgeTestcase{
   201  	//		JudgeKey:   []byte(fmt.Sprintf("signal:%v (exit code detection)", syscall.Signal(i).String())),
   202  	//		IoProvider: "memory",
   203  	//		Input:      hexUrl(fmt.Sprintf("exit=%v\n", i+128)),
   204  	//		Answer:     hexUrl(``),
   205  	//	})
   206  	//}
   207  
   208  	statusCodes, err := tarus_judge.TransientJudge(client, ctx, &tarus_judge.TransientJudgeRequest{
   209  		ImageId:   "docker.io/library/ubuntu:20.04",
   210  		BinTarget: "data/workdir-judge-engine0/mock_solver",
   211  		MakeJudgeRequest: &tarus.MakeJudgeRequest{
   212  			Testcases: testcases,
   213  		},
   214  	})
   215  	if err != nil {
   216  		panic(err)
   217  	}
   218  	for _, status := range statusCodes.Items {
   219  		fmt.Println(status)
   220  	}
   221  }
   222  
   223  func main() {
   224  	client, err := oci_judge.NewContainerdServer()
   225  	if err != nil {
   226  		panic(err)
   227  	}
   228  	defer func() {
   229  		_ = client.Close()
   230  	}()
   231  
   232  	ctx := context.Background()
   233  
   234  	//if err = client.ImportOCIArchive(ctx, "ubuntu.tar"); err != nil {
   235  	//	panic(err)
   236  	//}
   237  
   238  	// echoTest(client, ctx)
   239  	// sleepTest(client, ctx)
   240  	// sleepHardTest(client, ctx)
   241  	// ioTest(client, ctx)
   242  	// inputTest(client, ctx)
   243  	statusTest(client, ctx)
   244  	compileEchoTest(client, ctx)
   245  }