Commit 2966aa5de549bc835406bce4b517df0e2d4dfc7f

Authored by Christian Herdtweck
1 parent d7a7c7b2

tests: create unittest for oleid

Checks output on all data in tests/test-data dir
Showing 1 changed file with 155 additions and 0 deletions
tests/oleid/test_basic.py 0 → 100644
  1 +"""
  2 +Test basic functionality of oleid
  3 +
  4 +Should work with python2 and python3!
  5 +"""
  6 +
  7 +import unittest
  8 +import os
  9 +from os.path import join, relpath, splitext
  10 +from oletools import oleid
  11 +
  12 +# Directory with test data, independent of current working directory
  13 +from tests.test_utils import DATA_BASE_DIR
  14 +
  15 +
  16 +class TestOleIDBasic(unittest.TestCase):
  17 + """Test basic functionality of OleID"""
  18 +
  19 + def test_all(self):
  20 + """Run all file in test-data through oleid and compare to known ouput"""
  21 + # this relies on order of indicators being constant, could relax that
  22 + # Also requires that files have the correct suffixes (no rtf in doc)
  23 + NON_OLE_SUFFIXES = ('.xml', '.csv', '.rtf', '')
  24 + NON_OLE_VALUES = (False, )
  25 + WORD = b'Microsoft Office Word'
  26 + PPT = b'Microsoft Office PowerPoint'
  27 + EXCEL = b'Microsoft Excel'
  28 + CRYPT = (True, False, 'unknown', True, False, False, False, False,
  29 + False, False, 0)
  30 + OLE_VALUES = {
  31 + 'oleobj/sample_with_lnk_file.doc': (True, True, WORD, False, True,
  32 + False, False, False, False,
  33 + True, 0),
  34 + 'oleobj/embedded-simple-2007.xlsb': (False,),
  35 + 'oleobj/embedded-simple-2007.docm': (False,),
  36 + 'oleobj/embedded-simple-2007.xltx': (False,),
  37 + 'oleobj/embedded-simple-2007.xlam': (False,),
  38 + 'oleobj/embedded-simple-2007.dotm': (False,),
  39 + 'oleobj/sample_with_lnk_file.ppt': (True, True, PPT, False, False,
  40 + False, False, True, False,
  41 + False, 0),
  42 + 'oleobj/embedded-simple-2007.xlsx': (False,),
  43 + 'oleobj/embedded-simple-2007.xlsm': (False,),
  44 + 'oleobj/embedded-simple-2007.ppsx': (False,),
  45 + 'oleobj/embedded-simple-2007.pps': (True, True, PPT, False, False,
  46 + False, False, True, False,
  47 + False, 0),
  48 + 'oleobj/embedded-simple-2007.xla': (True, True, EXCEL, False,
  49 + False, False, True, False,
  50 + False, False, 0),
  51 + 'oleobj/sample_with_calc_embedded.doc': (True, True, WORD, False,
  52 + True, False, False, False,
  53 + False, True, 0),
  54 + 'oleobj/embedded-unicode-2007.docx': (False,),
  55 + 'oleobj/embedded-unicode.doc': (True, True, WORD, False, True,
  56 + False, False, False, False, True,
  57 + 0),
  58 + 'oleobj/embedded-simple-2007.doc': (True, True, WORD, False, True,
  59 + False, False, False, False,
  60 + True, 0),
  61 + 'oleobj/embedded-simple-2007.xls': (True, True, EXCEL, False,
  62 + False, False, True, False,
  63 + False, False, 0),
  64 + 'oleobj/embedded-simple-2007.dot': (True, True, WORD, False, True,
  65 + False, False, False, False,
  66 + True, 0),
  67 + 'oleobj/sample_with_lnk_to_calc.doc': (True, True, WORD, False,
  68 + True, False, False, False,
  69 + False, True, 0),
  70 + 'oleobj/embedded-simple-2007.ppt': (True, True, PPT, False, False,
  71 + False, False, True, False,
  72 + False, 0),
  73 + 'oleobj/sample_with_lnk_file.pps': (True, True, PPT, False, False,
  74 + False, False, True, False,
  75 + False, 0),
  76 + 'oleobj/embedded-simple-2007.pptx': (False,),
  77 + 'oleobj/embedded-simple-2007.ppsm': (False,),
  78 + 'oleobj/embedded-simple-2007.dotx': (False,),
  79 + 'oleobj/embedded-simple-2007.pptm': (False,),
  80 + 'oleobj/embedded-simple-2007.xlt': (True, True, EXCEL, False,
  81 + False, False, True, False,
  82 + False, False, 0),
  83 + 'oleobj/embedded-simple-2007.docx': (False,),
  84 + 'oleobj/embedded-simple-2007.potx': (False,),
  85 + 'oleobj/embedded-simple-2007.pot': (True, True, PPT, False, False,
  86 + False, False, True, False,
  87 + False, 0),
  88 + 'oleobj/embedded-simple-2007.xltm': (False,),
  89 + 'oleobj/embedded-simple-2007.potm': (False,),
  90 + 'encrypted/encrypted.xlsx': CRYPT,
  91 + 'encrypted/encrypted.docm': CRYPT,
  92 + 'encrypted/encrypted.docx': CRYPT,
  93 + 'encrypted/encrypted.pptm': CRYPT,
  94 + 'encrypted/encrypted.xlsb': CRYPT,
  95 + 'encrypted/encrypted.xls': (True, True, EXCEL, True, False, False,
  96 + True, False, False, False, 0),
  97 + 'encrypted/encrypted.ppt': (True, False, 'unknown', True, False,
  98 + False, False, True, False, False, 0),
  99 + 'encrypted/encrypted.pptx': CRYPT,
  100 + 'encrypted/encrypted.xlsm': CRYPT,
  101 + 'encrypted/encrypted.doc': (True, True, WORD, True, True, False,
  102 + False, False, False, False, 0),
  103 + 'msodde/harmless-clean.docm': (False,),
  104 + 'msodde/dde-in-csv.csv': (False,),
  105 + 'msodde/dde-test-from-office2013-utf_16le-korean.doc':
  106 + (True, True, WORD, False, True, False, False, False, False,
  107 + False, 0),
  108 + 'msodde/harmless-clean.doc': (True, True, WORD, False, True, False,
  109 + False, False, False, False, 0),
  110 + 'msodde/dde-test.docm': (False,),
  111 + 'msodde/dde-test.xlsb': (False,),
  112 + 'msodde/dde-test.xlsm': (False,),
  113 + 'msodde/dde-test.docx': (False,),
  114 + 'msodde/dde-test.xlsx': (False,),
  115 + 'msodde/dde-test-from-office2003.doc': (True, True, WORD, False,
  116 + True, False, False, False,
  117 + False, False, 0),
  118 + 'msodde/dde-test-from-office2016.doc': (True, True, WORD, False,
  119 + True, False, False, False,
  120 + False, False, 0),
  121 + 'msodde/harmless-clean.docx': (False,),
  122 + 'oleform/oleform-PR314.docm': (False,),
  123 + 'basic/encrypted.docx': CRYPT,
  124 + }
  125 +
  126 + indicator_names = []
  127 + for base_dir, _, files in os.walk(DATA_BASE_DIR):
  128 + for filename in files:
  129 + full_path = join(base_dir, filename)
  130 + name = relpath(full_path, DATA_BASE_DIR)
  131 + values = tuple(indicator.value for indicator in
  132 + oleid.OleID(full_path).check())
  133 + if len(indicator_names) < 2: # not initialized with ole yet
  134 + indicator_names = tuple(indicator.name for indicator in
  135 + oleid.OleID(full_path).check())
  136 + suffix = splitext(filename)[1]
  137 + if suffix in NON_OLE_SUFFIXES:
  138 + self.assertEqual(values, NON_OLE_VALUES,
  139 + msg='For non-ole file {} expected {}, '
  140 + 'not {}'.format(name, NON_OLE_VALUES,
  141 + values))
  142 + continue
  143 + try:
  144 + self.assertEqual(values, OLE_VALUES[name],
  145 + msg='Wrong detail values for {}:\n'
  146 + ' Names {}\n Found {}\n Expect {}'
  147 + .format(name, indicator_names, values,
  148 + OLE_VALUES[name]))
  149 + except KeyError:
  150 + print('Should add oleid output for {} to {} ({})'
  151 + .format(name, __name__, values[3:]))
  152 +
  153 +# just in case somebody calls this file as a script
  154 +if __name__ == '__main__':
  155 + unittest.main()