diff --git a/python/helpers/tests/__main__.py b/python/helpers/tests/__main__.py index b0d976f8a924..f307df515c84 100644 --- a/python/helpers/tests/__main__.py +++ b/python/helpers/tests/__main__.py @@ -21,7 +21,7 @@ def get_test_runner(): try: import teamcity.unittestpy if teamcity.is_running_under_teamcity(): - return teamcity.unittestpy.TeamcityTestRunner() + return teamcity.unittestpy.TeamcityTestRunner(buffer=True) except ImportError: pass return unittest.TextTestRunner() diff --git a/python/helpers/tests/generator3_tests/__init__.py b/python/helpers/tests/generator3_tests/__init__.py index e596a7c6a7c7..95f37b7ce9e8 100644 --- a/python/helpers/tests/generator3_tests/__init__.py +++ b/python/helpers/tests/generator3_tests/__init__.py @@ -1,9 +1,11 @@ -from contextlib import contextmanager -from io import open +import logging import os import shutil +import sys import tempfile import unittest +from contextlib import contextmanager +from io import open _test_dir = os.path.dirname(__file__) _test_data_root_dir = os.path.join(_test_dir, 'data') @@ -13,6 +15,23 @@ _override_test_data = False class GeneratorTestCase(unittest.TestCase): longMessage = True + @classmethod + def setUpClass(cls): + super(GeneratorTestCase, cls).setUpClass() + # Logger cannot be initialized beforehand (say, on top-level), because, + # otherwise, it won't take into account buffered sys.stderr needed by + # teamcity-messages + cls.log = logging.getLogger(cls.__name__) + handler = logging.StreamHandler(sys.stderr) + handler.setFormatter(logging.Formatter(fmt='%(levelname)s:%(name)s:%(message)s')) + cls.log.addHandler(handler) + cls.log.setLevel(logging.DEBUG) + + @classmethod + def tearDownClass(cls): + delattr(cls, 'log') + super(GeneratorTestCase, cls).tearDownClass() + def setUp(self): self.temp_dir = tempfile.mkdtemp(prefix='{}_{}__'.format(self.test_class_name, self.test_name)) diff --git a/python/helpers/tests/generator3_tests/test_generation.py b/python/helpers/tests/generator3_tests/test_generation.py index 03f7ab206d68..b0b3f4e9e76f 100644 --- a/python/helpers/tests/generator3_tests/test_generation.py +++ b/python/helpers/tests/generator3_tests/test_generation.py @@ -1,4 +1,3 @@ -import logging import os import subprocess import sys @@ -7,6 +6,7 @@ import unittest import generator3 import six +from generator3_tests import GeneratorTestCase from pycharm_generator_utils.constants import ( ENV_TEST_MODE_FLAG, ENV_VERSION, @@ -14,15 +14,11 @@ from pycharm_generator_utils.constants import ( CACHE_DIR_NAME, ENV_STANDALONE_MODE_FLAG, ) -from generator3_tests import GeneratorTestCase - -logging.basicConfig(level=logging.DEBUG) # Such version implies that skeletons are always regenerated TEST_GENERATOR_VERSION = '1000.0' _run_generator_in_separate_process = True -_log = logging.getLogger(__name__) class SkeletonCachingTest(GeneratorTestCase): @@ -73,8 +69,13 @@ class SkeletonCachingTest(GeneratorTestCase): if mod_path: args.append(mod_path) - _log.info('Launching generator3 as: ' + ' '.join(args)) - subprocess.call(args, env=env) + self.log.info('Launching generator3 as: ' + ' '.join(args)) + process = subprocess.Popen(args, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + process.wait() + sys.stdout.write(process.stdout.read().decode('utf-8')) + process.stdout.close() + sys.stderr.write(process.stderr.read().decode('utf-8')) + process.stderr.close() else: os.environ.update(env) sys.path.append(extra_syspath_entry) @@ -85,7 +86,7 @@ class SkeletonCachingTest(GeneratorTestCase): else: generator3.process_one(mod_qname, mod_path, mod_qname in sys.builtin_module_names, output_dir) except Exception: - _log.error('Raised inside generator', exc_info=True) + self.log.error('Raised inside generator', exc_info=True) finally: if mod_qname != 'sys': sys.modules.pop(mod_qname, None)