Display lengthy output of generator3.py inside corresponding test blocks

Make sure that all messages including those to a logger go through
the buffered sys.stdout.

GitOrigin-RevId: c785e0b2da1ec2f3c72764c388d275b782a5769d
This commit is contained in:
Mikhail Golubev
2019-06-16 05:16:24 +03:00
committed by intellij-monorepo-bot
parent 367a8a9aa7
commit 8fb9d3c4e1
3 changed files with 31 additions and 11 deletions
+1 -1
View File
@@ -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()
@@ -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))
@@ -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)