_test_const.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. # coding: utf-8
  2. import re
  3. import sys
  4. RESTART_TEST_INDICATOR = '##restart-test##'
  5. INFRASTRUCTURE_ERROR_INDICATOR = '##infrastructure-error##'
  6. RESTART_TEST_INDICATORS = [
  7. RESTART_TEST_INDICATOR,
  8. "network error",
  9. ]
  10. # testing
  11. BIN_DIRECTORY = 'bin'
  12. CANONIZATION_RESULT_FILE_NAME = "canonization_res.json"
  13. CONSOLE_SNIPPET_LIMIT = 5000
  14. LIST_NODE_LOG_FILE = "test_list.log"
  15. LIST_NODE_RESULT_FILE = "test_list.json"
  16. LIST_RESULT_NODE_LOG_FILE = "list_result.log"
  17. MAX_FILE_SIZE = 1024 * 1024 * 2 # 2 MB
  18. MAX_TEST_RESTART_COUNT = 3
  19. REPORT_SNIPPET_LIMIT = 10000
  20. SANITIZER_ERROR_RC = 100
  21. TEST_SUBTEST_SEPARATOR = '::'
  22. TESTING_OUT_DIR_NAME = "testing_out_stuff"
  23. TESTING_OUT_TAR_NAME = TESTING_OUT_DIR_NAME + ".tar"
  24. TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S.%f"
  25. TRACE_FILE_NAME = "ytest.report.trace"
  26. TRUNCATING_IGNORE_FILE_LIST = {TRACE_FILE_NAME, "run_test.log"}
  27. # kvm
  28. DEFAULT_RAM_REQUIREMENTS_FOR_KVM = 4
  29. MAX_RAM_REQUIREMENTS_FOR_KVM = 16
  30. # distbuild
  31. TEST_NODE_FINISHING_TIME = 5 * 60
  32. DEFAULT_TEST_NODE_TIMEOUT = 15 * 60
  33. # coverage
  34. COVERAGE_TESTS_TIMEOUT_FACTOR = 1.5
  35. COVERAGE_RESOLVED_FILE_NAME_PATTERN = "coverage_resolved.{}.json"
  36. CPP_COVERAGE_RESOLVED_FILE_NAME = COVERAGE_RESOLVED_FILE_NAME_PATTERN.format("cpp")
  37. JAVA_COVERAGE_RESOLVED_FILE_NAME = COVERAGE_RESOLVED_FILE_NAME_PATTERN.format("java")
  38. PYTHON_COVERAGE_RESOLVED_FILE_NAME = COVERAGE_RESOLVED_FILE_NAME_PATTERN.format("python")
  39. CLANG_COVERAGE_TEST_TYPES = ("unittest", "coverage_extractor", "pytest", "py3test", "gtest", "boost_test", "exectest")
  40. COVERAGE_TABLE_CHUNKS = 20
  41. COVERAGE_YT_PROXY = "hahn.yt.yandex.net"
  42. COVERAGE_YT_ROOT_PATH = "//home/codecoverage"
  43. COVERAGE_YT_TABLE_PREFIX = "datatable"
  44. # fuzzing
  45. CORPUS_DATA_FILE_NAME = 'corpus.json'
  46. CORPUS_DATA_ROOT_DIR = 'fuzzing'
  47. CORPUS_DIR_NAME = 'corpus'
  48. FUZZING_COMPRESSION_COEF = 1.1
  49. FUZZING_DEFAULT_TIMEOUT = 3600
  50. FUZZING_FINISHING_TIME = 600
  51. FUZZING_TIMEOUT_RE = re.compile(r'(^|\s)-max_total_time=(?P<max_time>\d+)')
  52. GENERATED_CORPUS_DIR_NAME = 'mined_corpus'
  53. MAX_CORPUS_RESOURCES_ALLOWED = 5
  54. TEST_TOOL_HOST = 'TEST_TOOL_HOST_RESOURCE_GLOBAL'
  55. TEST_TOOL_TARGET = 'TEST_TOOL_TARGET_RESOURCE_GLOBAL'
  56. TEST_TOOL_HOST_LOCAL = 'TEST_TOOL_HOST_LOCAL'
  57. TEST_TOOL_TARGET_LOCAL = 'TEST_TOOL_TARGET_LOCAL'
  58. XCODE_TOOLS_RESOURCE = 'XCODE_TOOLS_ROOT_RESOURCE_GLOBAL'
  59. GO_TOOLS_RESOURCE = 'GO_TOOLS_RESOURCE_GLOBAL'
  60. LLVM_COV9_RESOURCE = 'LLVM_COV9_RESOURCE_GLOBAL'
  61. PEP8_PY2_RESOURCE = 'PEP8_PY2_RESOURCE_GLOBAL'
  62. PEP8_PY3_RESOURCE = 'PEP8_PY3_RESOURCE_GLOBAL'
  63. FLAKES_PY2_RESOURCE = 'FLAKES_PY2_RESOURCE_GLOBAL'
  64. FLAKES_PY3_RESOURCE = 'FLAKES_PY3_RESOURCE_GLOBAL'
  65. FLAKE8_PY2_RESOURCE = 'FLAKE8_PY2_RESOURCE_GLOBAL'
  66. FLAKE8_PY3_RESOURCE = 'FLAKE8_PY3_RESOURCE_GLOBAL'
  67. class Enum(object):
  68. @classmethod
  69. def enumerate(cls):
  70. return [v for k, v in cls.__dict__.items() if not k.startswith("_")]
  71. class TestRequirements(Enum):
  72. Container = 'container'
  73. Cpu = 'cpu'
  74. DiskUsage = 'disk_usage'
  75. Ram = 'ram'
  76. RamDisk = 'ram_disk'
  77. SbVault = 'sb_vault'
  78. Network = 'network'
  79. Dns = 'dns'
  80. Kvm = 'kvm'
  81. class TestRequirementsConstants(Enum):
  82. All = 'all'
  83. AllCpuValue = 50
  84. AllRamDiskValue = 50
  85. MinCpu = 1
  86. MinRam = 1
  87. MinRamDisk = 0
  88. @classmethod
  89. def is_all_cpu(cls, value):
  90. return value == cls.All
  91. @classmethod
  92. def get_cpu_value(cls, value):
  93. return cls.AllCpuValue if cls.is_all_cpu(value) else value
  94. @classmethod
  95. def is_all_ram_disk(cls, value):
  96. return value == cls.All
  97. @classmethod
  98. def get_ram_disk_value(cls, value):
  99. return cls.AllRamDiskValue if cls.is_all_ram_disk(value) else value
  100. class TestSize(Enum):
  101. Small = 'small'
  102. Medium = 'medium'
  103. Large = 'large'
  104. DefaultTimeouts = {
  105. Small: 60,
  106. Medium: 600,
  107. Large: 3600,
  108. }
  109. DefaultPriorities = {
  110. Small: -1,
  111. Medium: -2,
  112. Large: -3,
  113. }
  114. DefaultRequirements = {
  115. Small: {
  116. TestRequirements.Cpu: 1,
  117. TestRequirements.Ram: 32,
  118. # TestRequirements.Ram: 2,
  119. TestRequirements.RamDisk: 0,
  120. },
  121. Medium: {
  122. TestRequirements.Cpu: 1,
  123. TestRequirements.Ram: 32,
  124. # TestRequirements.Ram: 4,
  125. TestRequirements.RamDisk: 0,
  126. },
  127. Large: {
  128. TestRequirements.Cpu: 1,
  129. TestRequirements.Ram: 32,
  130. # TestRequirements.Ram: 8,
  131. TestRequirements.RamDisk: 0,
  132. },
  133. }
  134. MaxRequirements = {
  135. Small: {
  136. TestRequirements.Cpu: 4,
  137. TestRequirements.Ram: 32,
  138. # TestRequirements.Ram: 4,
  139. TestRequirements.RamDisk: 4,
  140. },
  141. Medium: {
  142. TestRequirements.Cpu: 4,
  143. # TestRequirements.Cpu: 8,
  144. TestRequirements.Ram: 32,
  145. # TestRequirements.Ram: 16,
  146. TestRequirements.RamDisk: 4,
  147. },
  148. Large: {
  149. TestRequirements.Cpu: 4,
  150. TestRequirements.Ram: 32,
  151. TestRequirements.RamDisk: 4,
  152. },
  153. }
  154. @classmethod
  155. def sizes(cls):
  156. return cls.DefaultTimeouts.keys()
  157. @classmethod
  158. def get_default_timeout(cls, size):
  159. if size in cls.DefaultTimeouts:
  160. return cls.DefaultTimeouts[size]
  161. raise Exception("Unknown test size '{}'".format(size))
  162. @classmethod
  163. def get_default_priorities(cls, size):
  164. if size in cls.DefaultPriorities:
  165. return cls.DefaultPriorities[size]
  166. raise Exception("Unknown test size '{}'".format(size))
  167. @classmethod
  168. def get_default_requirements(cls, size):
  169. if size in cls.DefaultRequirements:
  170. return cls.DefaultRequirements[size]
  171. raise Exception("Unknown test size '{}'".format(size))
  172. @classmethod
  173. def get_max_requirements(cls, size):
  174. if size in cls.MaxRequirements:
  175. return cls.MaxRequirements[size]
  176. raise Exception("Unknown test size '{}'".format(size))
  177. class TestRunExitCode(Enum):
  178. Skipped = 2
  179. Failed = 3
  180. TimeOut = 10
  181. InfrastructureError = 12
  182. class YaTestTags(Enum):
  183. Manual = "ya:manual"
  184. Notags = "ya:notags"
  185. Norestart = "ya:norestart"
  186. Dirty = "ya:dirty"
  187. Noretries = "ya:noretries"
  188. Fat = "ya:fat"
  189. RunWithAsserts = "ya:relwithdebinfo"
  190. Privileged = "ya:privileged"
  191. ExoticPlatform = "ya:exotic_platform"
  192. NotAutocheck = "ya:not_autocheck"
  193. class Status(object):
  194. GOOD, XFAIL, FAIL, XPASS, MISSING, CRASHED, TIMEOUT = range(1, 8)
  195. SKIPPED = -100
  196. NOT_LAUNCHED = -200
  197. CANON_DIFF = -300
  198. DESELECTED = -400
  199. INTERNAL = -sys.maxint
  200. FLAKY = -50
  201. BY_NAME = {'good': GOOD, 'fail': FAIL, 'xfail': XFAIL, 'xpass': XPASS, 'missing': MISSING, 'crashed': CRASHED,
  202. 'skipped': SKIPPED, 'flaky': FLAKY, 'not_launched': NOT_LAUNCHED, 'timeout': TIMEOUT, 'diff': CANON_DIFF,
  203. 'internal': INTERNAL, 'deselected': DESELECTED}
  204. TO_STR = {GOOD: 'good', FAIL: 'fail', XFAIL: 'xfail', XPASS: 'xpass', MISSING: 'missing', CRASHED: 'crashed',
  205. SKIPPED: 'skipped', FLAKY: 'flaky', NOT_LAUNCHED: 'not_launched', TIMEOUT: 'timeout', CANON_DIFF: 'diff',
  206. INTERNAL: 'internal', DESELECTED: 'deselected'}
  207. class _Colors(object):
  208. _NAMES = [
  209. "blue",
  210. "cyan",
  211. "default",
  212. "green",
  213. "grey",
  214. "magenta",
  215. "red",
  216. "white",
  217. "yellow",
  218. ]
  219. _PREFIXES = ["", "light", "dark"]
  220. def __init__(self):
  221. self._table = {}
  222. for prefix in self._PREFIXES:
  223. for value in self._NAMES:
  224. name = value
  225. if prefix:
  226. name = "{}_{}".format(prefix, value)
  227. value = "{}-{}".format(prefix, value)
  228. self.__add_color(name.upper(), value)
  229. def __add_color(self, name, value):
  230. self._table[name] = value
  231. self.__setattr__(name, value)
  232. Colors = _Colors()
  233. class _Highlight(object):
  234. _MARKERS = {
  235. # special
  236. "RESET": "rst",
  237. "IMPORTANT": "imp",
  238. "UNIMPORTANT": "unimp",
  239. "BAD": "bad",
  240. "WARNING": "warn",
  241. "GOOD": "good",
  242. "PATH": "path",
  243. "ALTERNATIVE1": "alt1",
  244. "ALTERNATIVE2": "alt2",
  245. "ALTERNATIVE3": "alt3",
  246. }
  247. def __init__(self):
  248. # setting attributes because __getattr__ is much slower
  249. for attr, value in self._MARKERS.items():
  250. self.__setattr__(attr, value)
  251. Highlight = _Highlight()
  252. class _StatusColorMap(object):
  253. _MAP = {
  254. 'good': Highlight.GOOD,
  255. 'fail': Highlight.BAD,
  256. 'missing': Highlight.ALTERNATIVE1,
  257. 'crashed': Highlight.WARNING,
  258. 'skipped': Highlight.UNIMPORTANT,
  259. 'not_launched': Highlight.BAD,
  260. 'timeout': Highlight.BAD,
  261. 'flaky': Highlight.ALTERNATIVE3,
  262. 'xfail': Highlight.WARNING,
  263. 'xpass': Highlight.WARNING,
  264. 'diff': Highlight.BAD,
  265. 'internal': Highlight.BAD,
  266. 'deselected': Highlight.UNIMPORTANT,
  267. }
  268. def __getitem__(self, item):
  269. return self._MAP[item]
  270. StatusColorMap = _StatusColorMap()