--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import os, sys
+# for output which reports a local time
+os.environ['TZ'] = 'GMT'
+import shutil
+import os.path
+import re
+
+import logging
+import locale
+
+try:
+ import unittest2 as unittest
+except ImportError:
+ import unittest
+
+import six
+
+from pb_base.common import pp
+from pb_base.common import bytes2human
+
+libdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'lib'))
+sys.path.insert(0, libdir)
+
+from trace_maillog import magic
+
+from general import LogtraceTestcase, get_arg_verbose, init_root_logger
+
+locale.setlocale(locale.LC_ALL, '')
+
+APPNAME = 'test_magic'
+
+LOG = logging.getLogger(APPNAME)
+
+
+
+# =============================================================================
+class MagicTest(LogtraceTestcase):
+
+ # -------------------------------------------------------------------------
+ def setUp(self):
+ self.appname = APPNAME
+ self.testdata_dir = os.path.join(os.path.dirname(__file__), 'testdata')
+
+ # -------------------------------------------------------------------------
+ def tearDown(self):
+ pass
+
+ # -------------------------------------------------------------------------
+ def assert_values(self, m, expected_values):
+ for filename, expected_value in expected_values.items():
+ try:
+ filename = os.path.join(self.testdata_dir, filename)
+ except TypeError:
+ filename = os.path.join(self.testdata_dir.encode('utf-8'), filename)
+
+ if type(expected_value) is not tuple:
+ expected_value = (expected_value,)
+
+ LOG.debug("Testing {!r}, expecting {!r}.".format(filename, expected_value))
+
+ for i in expected_value:
+ with open(filename, 'rb') as f:
+ buf_value = m.from_buffer(f.read())
+
+ file_value = m.from_file(filename)
+ LOG.debug("Got: buffer value: {!r}, file value: {!r}.".format(buf_value, file_value))
+ if buf_value == i and file_value == i:
+ break
+ else:
+ self.assertTrue(False, "no match for " + repr(expected_value))
+
+ # -------------------------------------------------------------------------
+ def test_mime_types(self):
+
+ LOG.info("Testing MIME types ...")
+
+ dest = os.path.join(self.testdata_dir, b'\xce\xbb'.decode('utf-8'))
+ shutil.copyfile(os.path.join(self.testdata_dir, 'lambda'), dest)
+ try:
+ m = magic.Magic(mime=True)
+ self.assert_values(m, {
+ 'magic.pyc': 'application/octet-stream',
+ 'test.pdf': 'application/pdf',
+ 'test.gz': 'application/gzip',
+ 'text.txt': 'text/plain',
+ b'\xce\xbb'.decode('utf-8'): 'text/plain',
+ b'\xce\xbb': 'text/plain',
+ })
+ finally:
+ os.unlink(dest)
+
+ # -------------------------------------------------------------------------
+ def test_descriptions(self):
+
+ LOG.info("Testing descriptions ...")
+
+ m = magic.Magic()
+ os.environ['TZ'] = 'UTC' # To get the last modified date of test.gz in UTC
+ try:
+ self.assert_values(m, {
+ 'magic.pyc': 'python 2.4 byte-compiled',
+ 'test.pdf': 'PDF document, version 1.2',
+ 'test.gz':
+ ('gzip compressed data, was "test", from Unix, last modified: Sun Jun 29 01:32:52 2008',
+ 'gzip compressed data, was "test", last modified: Sun Jun 29 01:32:52 2008, from Unix'),
+ 'text.txt': 'ASCII text',
+ })
+ finally:
+ del os.environ['TZ']
+
+ # -------------------------------------------------------------------------
+ def test_mime_encodings(self):
+
+ LOG.info("Testing MIME encodings ...")
+
+ m = magic.Magic(mime_encoding=True)
+ self.assert_values(m, {
+ 'text-iso8859-1.txt': 'iso-8859-1',
+ 'text.txt': 'us-ascii',
+ })
+
+ # -------------------------------------------------------------------------
+ def test_errors(self):
+
+ LOG.info("Testing errors ...")
+
+ m = magic.Magic()
+ self.assertRaises(IOError, m.from_file, 'nonexistent')
+ self.assertRaises(magic.MagicException, magic.Magic,
+ magic_file='nonexistent')
+ os.environ['MAGIC'] = 'nonexistent'
+ try:
+ self.assertRaises(magic.MagicException, magic.Magic)
+ finally:
+ del os.environ['MAGIC']
+
+ # -------------------------------------------------------------------------
+ def test_keep_going(self):
+
+ LOG.info("Testing keep going ...")
+
+ filename = os.path.join(self.testdata_dir, 'keep-going.jpg')
+
+ m = magic.Magic(mime=True)
+ result = m.from_file(filename)
+ LOG.debug("Testing {!r} - expecting {!r} - got {!r}.".format(
+ filename, 'image/jpeg', result))
+ self.assertEqual(result, 'image/jpeg')
+
+ m = magic.Magic(mime=True, keep_going=True)
+ expected = ['image/jpeg', 'application/octet-stream']
+ result = m.from_file(filename)
+ result = re.split(r'\\012-\s+', result)
+
+ LOG.debug("Testing {!r} keep_going - expecting {!r} - got {!r}.".format(
+ filename, expected, result))
+ self.assertEqual(result, expected)
+
+
+ # -------------------------------------------------------------------------
+ def test_rethrow(self):
+
+ LOG.info("Testing rethrow ...")
+
+ old = magic.magic_buffer
+ try:
+ def t(x,y):
+ raise magic.MagicException("passthrough")
+ magic.magic_buffer = t
+
+ self.assertRaises(magic.MagicException, magic.from_buffer, "hello", True)
+ finally:
+ magic.magic_buffer = old
+
+
+# =============================================================================
+
+if __name__ == '__main__':
+
+
+ verbose = get_arg_verbose()
+ if verbose is None:
+ verbose = 0
+ init_root_logger(verbose)
+
+ LOG.info("Starting tests ...")
+
+ loader = unittest.TestLoader()
+ suite = unittest.TestSuite()
+
+ suite.addTest(MagicTest('test_mime_types', verbose))
+ suite.addTest(MagicTest('test_descriptions', verbose))
+ suite.addTest(MagicTest('test_mime_encodings', verbose))
+ suite.addTest(MagicTest('test_errors', verbose))
+ suite.addTest(MagicTest('test_keep_going', verbose))
+ suite.addTest(MagicTest('test_rethrow', verbose))
+
+ runner = unittest.TextTestRunner(verbosity=verbose)
+
+ result = runner.run(suite)
+
+
+# =============================================================================
+
+# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4