environment.py 2.83 KB
Newer Older
Johannes Bechberger's avatar
Johannes Bechberger committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
import logging
import os
import shutil
import tempfile
from datetime import datetime, time
from mjtest.util.shell import execute
from mjtest.util.utils import get_mjtest_basedir
from typing import Tuple, List


class TestMode:
    syntax = "syntax"

    semantic = "semantic"

    exec = "exec"

""" All 'success' tests of the n.th mode can used as 'success' tests for the n-1.th mode"""
TEST_MODES = [TestMode.syntax, TestMode.semantic, TestMode.exec]

class Environment:

    LOG_LEVELS = {
        "info": logging.INFO,
        "error": logging.ERROR,
        "warn": logging.WARN,
        "debug": logging.DEBUG
    }

30
    def __init__(self, mode, mj_run: str, tmp_dir: str = "", test_dir: str = "",
Johannes Bechberger's avatar
Johannes Bechberger committed
31 32 33
                 only_incorrect_tests: bool = False, parallel: bool = False,
                 timeout: int = 30, report_dir: str = "", log_level: str = "warn"):
        self.mode = mode
34
        self.mj_run_cmd = os.path.realpath(mj_run)
Johannes Bechberger's avatar
Johannes Bechberger committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

        if tmp_dir:
            self.own_tmp_dir = True
            self.tmp_dir = os.path.abspath(os.path.expandvars(tmp_dir))
            if not os.path.exists(tmp_dir):
                os.mkdir(self.tmp_dir)
        else:
            self.own_tmp_dir = False
            self.tmp_dir = tempfile.mkdtemp("mjtest")

        if test_dir:
            self.test_dir = os.path.abspath(os.path.realpath(test_dir))
        else:
            self.test_dir = os.path.join(get_mjtest_basedir(), "tests")
        if not os.path.exists(self.test_dir):
            os.mkdir(self.test_dir)
            for d in [TestMode.syntax, TestMode.semantic, TestMode.exec]:
                os.mkdir(os.path.join(self.test_dir, d))

        self.only_incorrect_tests = only_incorrect_tests
        self.parallel = parallel
        self.timeout = timeout

58
        if report_dir:
Johannes Bechberger's avatar
Johannes Bechberger committed
59 60 61 62 63 64 65
            self.report_dir = os.path.abspath(os.path.expandvars(report_dir))
            if not os.path.exists(report_dir):
                os.mkdir(self.report_dir)
        else:
            self.report_dir = os.path.join(get_mjtest_basedir(), "reports")
            if not os.path.exists(self.report_dir):
                os.mkdir(self.report_dir)
66
        self.report_dir = os.path.join(self.report_dir, datetime.now().strftime("%d-%m-%y_%H-%M-%S"))
Johannes Bechberger's avatar
Johannes Bechberger committed
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
        os.mkdir(self.report_dir)
        logging.basicConfig(level=self.LOG_LEVELS[log_level])

    def create_tmpfile(self) -> str:
        return os.path.join(self.tmp_dir, os.times())

    def clean_up(self):
        if not self.own_tmp_dir:
            shutil.rmtree(self.tmp_dir)

    def run_mj_command(self, *args: Tuple[str]) -> Tuple[bytes, bytes, int]:
        """
        Execute the MiniJava `run` script with the given arguments.

        :param args: arguments for the MiniJava `run` script
        :return: (out, err, return code)
        """
        cmd = [self.mj_run_cmd] + list(args)
        return execute(cmd, timeout=self.timeout)