# coding: utf-8 import re import sys RESTART_TEST_INDICATOR = '##restart-test##' INFRASTRUCTURE_ERROR_INDICATOR = '##infrastructure-error##' RESTART_TEST_INDICATORS = [ RESTART_TEST_INDICATOR, "network error", ] # testing BIN_DIRECTORY = 'bin' CANONIZATION_RESULT_FILE_NAME = "canonization_res.json" CONSOLE_SNIPPET_LIMIT = 5000 LIST_NODE_LOG_FILE = "test_list.log" LIST_NODE_RESULT_FILE = "test_list.json" LIST_RESULT_NODE_LOG_FILE = "list_result.log" MAX_FILE_SIZE = 1024 * 1024 * 2 # 2 MB MAX_TEST_RESTART_COUNT = 3 REPORT_SNIPPET_LIMIT = 10000 SANITIZER_ERROR_RC = 100 TEST_SUBTEST_SEPARATOR = '::' TESTING_OUT_DIR_NAME = "testing_out_stuff" TESTING_OUT_TAR_NAME = TESTING_OUT_DIR_NAME + ".tar" TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S.%f" TRACE_FILE_NAME = "ytest.report.trace" TRUNCATING_IGNORE_FILE_LIST = {TRACE_FILE_NAME, "run_test.log"} # kvm DEFAULT_RAM_REQUIREMENTS_FOR_KVM = 4 MAX_RAM_REQUIREMENTS_FOR_KVM = 16 # distbuild TEST_NODE_FINISHING_TIME = 5 * 60 DEFAULT_TEST_NODE_TIMEOUT = 15 * 60 # coverage COVERAGE_TESTS_TIMEOUT_FACTOR = 1.5 COVERAGE_RESOLVED_FILE_NAME_PATTERN = "coverage_resolved.{}.json" CPP_COVERAGE_RESOLVED_FILE_NAME = COVERAGE_RESOLVED_FILE_NAME_PATTERN.format("cpp") JAVA_COVERAGE_RESOLVED_FILE_NAME = COVERAGE_RESOLVED_FILE_NAME_PATTERN.format("java") PYTHON_COVERAGE_RESOLVED_FILE_NAME = COVERAGE_RESOLVED_FILE_NAME_PATTERN.format("python") CLANG_COVERAGE_TEST_TYPES = ("unittest", "coverage_extractor", "pytest", "py3test", "gtest", "boost_test", "exectest") COVERAGE_TABLE_CHUNKS = 20 COVERAGE_YT_PROXY = "hahn.yt.yandex.net" COVERAGE_YT_ROOT_PATH = "//home/codecoverage" COVERAGE_YT_TABLE_PREFIX = "datatable" # fuzzing CORPUS_DATA_FILE_NAME = 'corpus.json' CORPUS_DATA_ROOT_DIR = 'fuzzing' CORPUS_DIR_NAME = 'corpus' FUZZING_COMPRESSION_COEF = 1.1 FUZZING_DEFAULT_TIMEOUT = 3600 FUZZING_FINISHING_TIME = 600 FUZZING_TIMEOUT_RE = re.compile(r'(^|\s)-max_total_time=(?P\d+)') GENERATED_CORPUS_DIR_NAME = 'mined_corpus' MAX_CORPUS_RESOURCES_ALLOWED = 5 TEST_TOOL_HOST = 'TEST_TOOL_HOST_RESOURCE_GLOBAL' TEST_TOOL_TARGET = 'TEST_TOOL_TARGET_RESOURCE_GLOBAL' TEST_TOOL_HOST_LOCAL = 'TEST_TOOL_HOST_LOCAL' TEST_TOOL_TARGET_LOCAL = 'TEST_TOOL_TARGET_LOCAL' XCODE_TOOLS_RESOURCE = 'XCODE_TOOLS_ROOT_RESOURCE_GLOBAL' GO_TOOLS_RESOURCE = 'GO_TOOLS_RESOURCE_GLOBAL' LLVM_COV9_RESOURCE = 'LLVM_COV9_RESOURCE_GLOBAL' PEP8_PY2_RESOURCE = 'PEP8_PY2_RESOURCE_GLOBAL' PEP8_PY3_RESOURCE = 'PEP8_PY3_RESOURCE_GLOBAL' FLAKES_PY2_RESOURCE = 'FLAKES_PY2_RESOURCE_GLOBAL' FLAKES_PY3_RESOURCE = 'FLAKES_PY3_RESOURCE_GLOBAL' FLAKE8_PY2_RESOURCE = 'FLAKE8_PY2_RESOURCE_GLOBAL' FLAKE8_PY3_RESOURCE = 'FLAKE8_PY3_RESOURCE_GLOBAL' class Enum(object): @classmethod def enumerate(cls): return [v for k, v in cls.__dict__.items() if not k.startswith("_")] class TestRequirements(Enum): Container = 'container' Cpu = 'cpu' DiskUsage = 'disk_usage' Ram = 'ram' RamDisk = 'ram_disk' SbVault = 'sb_vault' Network = 'network' Dns = 'dns' Kvm = 'kvm' class TestRequirementsConstants(Enum): All = 'all' AllCpuValue = 50 AllRamDiskValue = 50 MinCpu = 1 MinRam = 1 MinRamDisk = 0 @classmethod def is_all_cpu(cls, value): return value == cls.All @classmethod def get_cpu_value(cls, value): return cls.AllCpuValue if cls.is_all_cpu(value) else value @classmethod def is_all_ram_disk(cls, value): return value == cls.All @classmethod def get_ram_disk_value(cls, value): return cls.AllRamDiskValue if cls.is_all_ram_disk(value) else value class TestSize(Enum): Small = 'small' Medium = 'medium' Large = 'large' DefaultTimeouts = { Small: 60, Medium: 600, Large: 3600, } DefaultPriorities = { Small: -1, Medium: -2, Large: -3, } DefaultRequirements = { Small: { TestRequirements.Cpu: 1, TestRequirements.Ram: 32, # TestRequirements.Ram: 2, TestRequirements.RamDisk: 0, }, Medium: { TestRequirements.Cpu: 1, TestRequirements.Ram: 32, # TestRequirements.Ram: 4, TestRequirements.RamDisk: 0, }, Large: { TestRequirements.Cpu: 1, TestRequirements.Ram: 32, # TestRequirements.Ram: 8, TestRequirements.RamDisk: 0, }, } MaxRequirements = { Small: { TestRequirements.Cpu: 4, TestRequirements.Ram: 32, # TestRequirements.Ram: 4, TestRequirements.RamDisk: 4, }, Medium: { TestRequirements.Cpu: 4, # TestRequirements.Cpu: 8, TestRequirements.Ram: 32, # TestRequirements.Ram: 16, TestRequirements.RamDisk: 4, }, Large: { TestRequirements.Cpu: 4, TestRequirements.Ram: 32, TestRequirements.RamDisk: 4, }, } @classmethod def sizes(cls): return cls.DefaultTimeouts.keys() @classmethod def get_default_timeout(cls, size): if size in cls.DefaultTimeouts: return cls.DefaultTimeouts[size] raise Exception("Unknown test size '{}'".format(size)) @classmethod def get_default_priorities(cls, size): if size in cls.DefaultPriorities: return cls.DefaultPriorities[size] raise Exception("Unknown test size '{}'".format(size)) @classmethod def get_default_requirements(cls, size): if size in cls.DefaultRequirements: return cls.DefaultRequirements[size] raise Exception("Unknown test size '{}'".format(size)) @classmethod def get_max_requirements(cls, size): if size in cls.MaxRequirements: return cls.MaxRequirements[size] raise Exception("Unknown test size '{}'".format(size)) class TestRunExitCode(Enum): Skipped = 2 Failed = 3 TimeOut = 10 InfrastructureError = 12 class YaTestTags(Enum): Manual = "ya:manual" Notags = "ya:notags" Norestart = "ya:norestart" Dirty = "ya:dirty" Noretries = "ya:noretries" Fat = "ya:fat" RunWithAsserts = "ya:relwithdebinfo" Privileged = "ya:privileged" ExoticPlatform = "ya:exotic_platform" NotAutocheck = "ya:not_autocheck" class Status(object): GOOD, XFAIL, FAIL, XPASS, MISSING, CRASHED, TIMEOUT = range(1, 8) SKIPPED = -100 NOT_LAUNCHED = -200 CANON_DIFF = -300 DESELECTED = -400 INTERNAL = -sys.maxint FLAKY = -50 BY_NAME = {'good': GOOD, 'fail': FAIL, 'xfail': XFAIL, 'xpass': XPASS, 'missing': MISSING, 'crashed': CRASHED, 'skipped': SKIPPED, 'flaky': FLAKY, 'not_launched': NOT_LAUNCHED, 'timeout': TIMEOUT, 'diff': CANON_DIFF, 'internal': INTERNAL, 'deselected': DESELECTED} TO_STR = {GOOD: 'good', FAIL: 'fail', XFAIL: 'xfail', XPASS: 'xpass', MISSING: 'missing', CRASHED: 'crashed', SKIPPED: 'skipped', FLAKY: 'flaky', NOT_LAUNCHED: 'not_launched', TIMEOUT: 'timeout', CANON_DIFF: 'diff', INTERNAL: 'internal', DESELECTED: 'deselected'} class _Colors(object): _NAMES = [ "blue", "cyan", "default", "green", "grey", "magenta", "red", "white", "yellow", ] _PREFIXES = ["", "light", "dark"] def __init__(self): self._table = {} for prefix in self._PREFIXES: for value in self._NAMES: name = value if prefix: name = "{}_{}".format(prefix, value) value = "{}-{}".format(prefix, value) self.__add_color(name.upper(), value) def __add_color(self, name, value): self._table[name] = value self.__setattr__(name, value) Colors = _Colors() class _Highlight(object): _MARKERS = { # special "RESET": "rst", "IMPORTANT": "imp", "UNIMPORTANT": "unimp", "BAD": "bad", "WARNING": "warn", "GOOD": "good", "PATH": "path", "ALTERNATIVE1": "alt1", "ALTERNATIVE2": "alt2", "ALTERNATIVE3": "alt3", } def __init__(self): # setting attributes because __getattr__ is much slower for attr, value in self._MARKERS.items(): self.__setattr__(attr, value) Highlight = _Highlight() class _StatusColorMap(object): _MAP = { 'good': Highlight.GOOD, 'fail': Highlight.BAD, 'missing': Highlight.ALTERNATIVE1, 'crashed': Highlight.WARNING, 'skipped': Highlight.UNIMPORTANT, 'not_launched': Highlight.BAD, 'timeout': Highlight.BAD, 'flaky': Highlight.ALTERNATIVE3, 'xfail': Highlight.WARNING, 'xpass': Highlight.WARNING, 'diff': Highlight.BAD, 'internal': Highlight.BAD, 'deselected': Highlight.UNIMPORTANT, } def __getitem__(self, item): return self._MAP[item] StatusColorMap = _StatusColorMap()