Commit 9d5c9d3640fb96967b8c4da7c596a78cf512694a
1 parent
56e35a60
tests: create unittests for unicode checker
Showing
1 changed file
with
78 additions
and
0 deletions
tests/common/test_encoding_handler.py
0 → 100644
| 1 | +"""Test common.ensure_stdout_handles_unicode""" | ||
| 2 | + | ||
| 3 | +import unittest | ||
| 4 | +import sys | ||
| 5 | +from subprocess import check_call | ||
| 6 | +from tempfile import mkstemp | ||
| 7 | +import os | ||
| 8 | +from os.path import isfile | ||
| 9 | + | ||
| 10 | + | ||
| 11 | +class TestEncodingHandler(unittest.TestCase): | ||
| 12 | + """Tests replacing stdout encoding in various scenarios""" | ||
| 13 | + | ||
| 14 | + def test_base(self): | ||
| 15 | + """Test regular unicode output not raise error""" | ||
| 16 | + check_call('{python} {this_file} print'.format(python=sys.executable, | ||
| 17 | + this_file=__file__), | ||
| 18 | + shell=True) | ||
| 19 | + | ||
| 20 | + def test_redirect(self): | ||
| 21 | + """ | ||
| 22 | + Test redirection of unicode output to files does not raise error | ||
| 23 | + | ||
| 24 | + TODO: test this on non-linux OSs | ||
| 25 | + """ | ||
| 26 | + tmp_handle = None | ||
| 27 | + tmp_name = None | ||
| 28 | + try: | ||
| 29 | + tmp_handle, tmp_name = mkstemp() | ||
| 30 | + check_call('{python} {this_file} print > {tmp_file}' | ||
| 31 | + .format(python=sys.executable, this_file=__file__, | ||
| 32 | + tmp_file=tmp_file), | ||
| 33 | + shell=True) | ||
| 34 | + except Exception: | ||
| 35 | + raise | ||
| 36 | + finally: | ||
| 37 | + if tmp_handle is not None: | ||
| 38 | + os.close(tmp_handle) | ||
| 39 | + if tmp_name is not None and isfile(tmp_name): | ||
| 40 | + os.unlink(tmp_name) | ||
| 41 | + | ||
| 42 | + @unittest.skipIf(not sys.platform.startswith('linux'), | ||
| 43 | + 'Only tested on linux sofar') | ||
| 44 | + def test_no_lang(self): | ||
| 45 | + """ | ||
| 46 | + Test redirection of unicode output to files does not raise error | ||
| 47 | + | ||
| 48 | + TODO: Adapt this for other OSs; for win create batch script | ||
| 49 | + """ | ||
| 50 | + check_call('LANG=C {python} {this_file} print' | ||
| 51 | + .format(python=sys.executable, this_file=__file__), | ||
| 52 | + shell=True) | ||
| 53 | + | ||
| 54 | +def run_print(): | ||
| 55 | + """This is called from test_read* tests as script. Prints & logs unicode""" | ||
| 56 | + # hack required to import common from parent dir, not system-wide one | ||
| 57 | + # (usually unittest seems to do that for us) | ||
| 58 | + from os.path import abspath, dirname, join | ||
| 59 | + ole_base = dirname(dirname(dirname(abspath(__file__)))) | ||
| 60 | + sys.path.insert(0, ole_base) | ||
| 61 | + | ||
| 62 | + from oletools import common | ||
| 63 | + common.ensure_stdout_handles_unicode() | ||
| 64 | + print(u'\u2713') # print check mark | ||
| 65 | + | ||
| 66 | + | ||
| 67 | +# tests call this file as script | ||
| 68 | +if __name__ == '__main__': | ||
| 69 | + if len(sys.argv) < 2: | ||
| 70 | + sys.exit(unittest.main()) | ||
| 71 | + if sys.argv[1] == 'print': | ||
| 72 | + if len(sys.argv) > 2: | ||
| 73 | + print('Expect no arg for "print"', file=sys.stderr) | ||
| 74 | + sys.exit(2) | ||
| 75 | + sys.exit(run_print()) | ||
| 76 | + else: | ||
| 77 | + print('Unexpected argument: {}'.format(sys.argv[1]), file=sys.stderr) | ||
| 78 | + sys.exit(2) |