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))