Edit

kc3-lang/brotli/python/tests/_test_utils.py

Branch :

  • Show log

    Commit

  • Author : Alex Nicksay
    Date : 2016-11-09 06:21:13
    Hash : 1e5ea6ae
    Message : Python: Add unit tests for brotli.compress and brotli.decompress (#467) Also - rename `test_utils` to `_test_utils` - refactor shared code into `_test_utils`

  • python/tests/_test_utils.py
  • from __future__ import print_function
    import filecmp
    import glob
    import os
    import sys
    import sysconfig
    import unittest
    
    
    def diff_q(first_file, second_file):
        """Simulate call to POSIX diff with -q argument"""
        if not filecmp.cmp(first_file, second_file, shallow=False):
            print(
                'Files %s and %s differ' % (first_file, second_file),
                file=sys.stderr)
            return 1
        return 0
    
    
    project_dir = os.path.abspath(os.path.join(__file__, '..', '..', '..'))
    
    PYTHON = sys.executable or 'python'
    
    BRO = os.path.join(project_dir, 'python', 'bro.py')
    
    # Get the platform/version-specific build folder.
    # By default, the distutils build base is in the same location as setup.py.
    platform_lib_name = 'lib.{platform}-{version[0]}.{version[1]}'.format(
        platform=sysconfig.get_platform(), version=sys.version_info)
    build_dir = os.path.join(project_dir, 'bin', platform_lib_name)
    
    # Prepend the build folder to sys.path and the PYTHONPATH environment variable.
    if build_dir not in sys.path:
        sys.path.insert(0, build_dir)
    TEST_ENV = os.environ.copy()
    if 'PYTHONPATH' not in TEST_ENV:
        TEST_ENV['PYTHONPATH'] = build_dir
    else:
        TEST_ENV['PYTHONPATH'] = build_dir + os.pathsep + TEST_ENV['PYTHONPATH']
    
    TESTDATA_DIR = os.path.join(project_dir, 'tests', 'testdata')
    
    TESTDATA_FILES = [
        'empty',  # Empty file
        '10x10y',  # Small text
        'alice29.txt',  # Large text
        'random_org_10k.bin',  # Small data
        'mapsdatazrh',  # Large data
    ]
    
    TESTDATA_PATHS = [os.path.join(TESTDATA_DIR, f) for f in TESTDATA_FILES]
    
    TESTDATA_PATHS_FOR_DECOMPRESSION = glob.glob(
        os.path.join(TESTDATA_DIR, '*.compressed'))
    
    
    def get_temp_compressed_name(filename):
        return filename + '.bro'
    
    
    def get_temp_uncompressed_name(filename):
        return filename + '.unbro'
    
    
    def bind_method_args(method, *args):
        return lambda self: method(self, *args)
    
    
    def generate_test_methods(test_case_class, for_decompression=False):
        # Add test methods for each test data file.  This makes identifying problems
        # with specific compression scenarios easier.
        if for_decompression:
            paths = TESTDATA_PATHS_FOR_DECOMPRESSION
        else:
            paths = TESTDATA_PATHS
        for method in [m for m in dir(test_case_class) if m.startswith('_test')]:
            for testdata in paths:
                f = os.path.splitext(os.path.basename(testdata))[0]
                name = 'test_{method}_{file}'.format(method=method, file=f)
                func = bind_method_args(getattr(test_case_class, method), testdata)
                setattr(test_case_class, name, func)
    
    
    class TestCase(unittest.TestCase):
    
        def tearDown(self):
            for f in TESTDATA_PATHS:
                try:
                    os.unlink(get_temp_compressed_name(f))
                except OSError:
                    pass
                try:
                    os.unlink(get_temp_uncompressed_name(f))
                except OSError:
                    pass
    
        def assertFilesMatch(self, first, second):
            self.assertTrue(
                filecmp.cmp(first, second, shallow=False),
                'File {} differs from {}'.format(first, second))