Blame test_jbig2dec.py

Packit 3f21c4
#! /usr/bin/env python
Packit 3f21c4
Packit 3f21c4
# this is the testtest script for jbig2dec
Packit 3f21c4
Packit 3f21c4
import os, re
Packit 3f21c4
import sys, time
Packit 3f21c4
Packit 3f21c4
class SelfTest:
Packit 3f21c4
  'generic class for self tests'
Packit 3f21c4
  def __init__(self):
Packit 3f21c4
    self.result = 'unrun'
Packit 3f21c4
    self.msg = ''
Packit 3f21c4
  def shortDescription(self):
Packit 3f21c4
    'returns a short name for the test'
Packit 3f21c4
    return "generic self test"
Packit 3f21c4
  def runTest(self):
Packit 3f21c4
    'call this to execute the test'
Packit 3f21c4
    pass
Packit 3f21c4
  def fail(self, msg=None):
Packit 3f21c4
    self.result = 'FAIL'
Packit 3f21c4
    self.msg = msg
Packit 3f21c4
  def failIf(self, check, msg=None):
Packit 3f21c4
    if check: self.fail(msg)
Packit 3f21c4
  def assertEqual(self, a, b, msg=None):
Packit 3f21c4
    if a != b: self.fail(msg)
Packit 3f21c4
Packit 3f21c4
class SelfTestSuite:
Packit 3f21c4
  'generic class for running a collection of SelfTest instances'
Packit 3f21c4
  def __init__(self, stream=sys.stderr):
Packit 3f21c4
    self.stream = stream
Packit 3f21c4
    self.tests = []
Packit 3f21c4
    self.fails = []
Packit 3f21c4
    self.xfails = []
Packit 3f21c4
    self.errors = []
Packit 3f21c4
  def addTest(self, test):
Packit 3f21c4
    self.tests.append(test)
Packit 3f21c4
  def run(self):
Packit 3f21c4
    starttime = time.time()
Packit 3f21c4
    for test in self.tests:
Packit 3f21c4
      self.stream.write("%s ... " % test.shortDescription())
Packit 3f21c4
      test.result = 'ok'
Packit 3f21c4
      test.runTest()
Packit 3f21c4
      if test.result != 'ok':
Packit 3f21c4
        self.fails.append(test)
Packit 3f21c4
      self.stream.write("%s\n" % test.result)
Packit 3f21c4
    stoptime = time.time()
Packit 3f21c4
    self.stream.write('-'*72 + '\n')
Packit 3f21c4
    self.stream.write('ran %d tests in %.3f seconds\n\n' % 
Packit 3f21c4
	(len(self.tests), stoptime - starttime))
Packit 3f21c4
    if len(self.fails):
Packit 3f21c4
      self.stream.write('FAILED %d of %d tests\n' % 
Packit 3f21c4
	(len(self.fails),len(self.tests)))
Packit 3f21c4
    else:
Packit 3f21c4
      self.stream.write('PASSED all %d tests\n' % len(self.tests))
Packit 3f21c4
Packit 3f21c4
class KnownFileHash(SelfTest):
Packit 3f21c4
  'self test to check for correct decode of known test files'
Packit 3f21c4
Packit 3f21c4
  # hashes of known test inputs
Packit 3f21c4
  known_042_DECODED = "ebfdf6e2fc5ff3ee2271c2fa19de0e52712046e8"
Packit 3f21c4
  # we do not have correct hashes for these
Packit 3f21c4
  known_amb_DECODED = "ff32ffff0776ff66ff254129ff28ffffffff6bff"
Packit 3f21c4
Packit 3f21c4
  # these are known test files in the form
Packit 3f21c4
  # (filename, sha-1(file), sha-1(decoded document)
Packit 3f21c4
  known_hashes = ( ('../ubc/042_1.jb2',
Packit 3f21c4
			"673e1ee5c55ab241b171e476ba1168a42733ddaa",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_2.jb2', 
Packit 3f21c4
                        "9aa2804e2d220952035c16fb3c907547884067c5",
Packit 3f21c4
                        known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_3.jb2',
Packit 3f21c4
			"9663a5f35727f13e61a0a2f0a64207b1f79e7d67",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_4.jb2',
Packit 3f21c4
			"014df658c8b99b600c2ceac3f1d53c7cc2b4917c",
Packit 3f21c4
                        known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_5.jb2',
Packit 3f21c4
			"264720a6ccbbf72aa6a2cfb6343f43b8e6f2da4b",
Packit 3f21c4
                        known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_6.jb2',
Packit 3f21c4
			"96f7dc9df4a1b305f9ac082dd136f85ef5b108fe",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_7.jb2',
Packit 3f21c4
			"5526371ba9dc2b8743f20ae3e05a7e60b3dcba76",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_8.jb2',
Packit 3f21c4
			"4bf0c87dfaf40d67c36f2a083579eeda26d54641",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_9.jb2',
Packit 3f21c4
			"53e630e7fe2fe6e1d6164758e15fc93382e07f55",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_10.jb2',
Packit 3f21c4
			"5ca1364367e25cb8f642e9dc677a94d5cfed0c8b",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_11.jb2',
Packit 3f21c4
			"bc194caf022bc5345fc41259e05cea3c08245216",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_12.jb2',
Packit 3f21c4
			"f354df8eb4849bc707f088739e322d1fe3a14ef3",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_13.jb2',
Packit 3f21c4
			"7d428bd542f58591b254d9827f554b0552c950a7",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_14.jb2',
Packit 3f21c4
			"c40fe3a02acb6359baf9b40fc9c49bc0800be589",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_15.jb2',
Packit 3f21c4
			"a9e39fc1ecb178aec9f05039514d75ea3246246c",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_16.jb2',
Packit 3f21c4
			"4008bbca43670f3c90eaee26516293ba95baaf3d",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_17.jb2',
Packit 3f21c4
			"0ff95637b64c57d659a41c582da03e25321551fb",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_18.jb2',
Packit 3f21c4
			"87381d044f00c4329200e44decbe91bebfa31595",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_19.jb2',
Packit 3f21c4
			"387d95a140b456d4742622c788cf5b51cebbf438",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_20.jb2',
Packit 3f21c4
			"85c19e9ec42b8ddd6b860a1bebea1c67610e7a59",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_21.jb2',
Packit 3f21c4
			"ab535c7d7a61a7b9dc53d546e7419ca78ac7f447",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_22.jb2',
Packit 3f21c4
			"a9e2b365be63716dbde74b0661c3c6efd2a6844d",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_23.jb2',
Packit 3f21c4
			"8ffa40a05e93e10982b38a2233a8da58c1b5c343",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_24.jb2',
Packit 3f21c4
			"2553fe65111c58f6412de51d8cdc71651e778ccf",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/042_25.jb2',
Packit 3f21c4
			"52de4a3b86252d896a8d783ba71dd0699333dd69",
Packit 3f21c4
			known_042_DECODED),
Packit 3f21c4
                   ('../ubc/amb_1.jb2',
Packit 3f21c4
			"d6d6d1c981dc37a09108c1e3ed990aa5b345fa6a",
Packit 3f21c4
                        known_amb_DECODED),
Packit 3f21c4
                   ('../ubc/amb_2.jb2',
Packit 3f21c4
			"9af6616a89eb03f8934de72626e301a716366c3c",
Packit 3f21c4
                        known_amb_DECODED),
Packit 3f21c4
                   ('../str-p39',
Packit 3f21c4
			"1a303e33d3ea57eb7e19a676a1b2f28baa29b045",
Packit 3f21c4
                        "ff373f070f5f405b732c53ffffff087eff22ff5b") )
Packit 3f21c4
Packit 3f21c4
  def __init__(self, file, file_hash, decode_hash):
Packit 3f21c4
    SelfTest.__init__(self)
Packit 3f21c4
    self.file = file
Packit 3f21c4
    self.file_hash = file_hash
Packit 3f21c4
    self.decode_hash = decode_hash
Packit 3f21c4
Packit 3f21c4
  def shortDescription(self):
Packit 3f21c4
    return "Checking '%s' for correct decoded document hash" % self.file
Packit 3f21c4
Packit 3f21c4
  def runTest(self):
Packit 3f21c4
    '''jbig2dec should return proper document hashes for known files'''
Packit 3f21c4
    # invoke jbig2dec on our file
Packit 3f21c4
    instance = os.popen('./jbig2dec -q -o /dev/null --hash ' + self.file)
Packit 3f21c4
    lines = instance.readlines()
Packit 3f21c4
    exit_code = instance.close()
Packit 3f21c4
    self.failIf(exit_code, 'jbig2dec should exit normally')
Packit 3f21c4
    # test here for correct hash
Packit 3f21c4
    hash_pattern = re.compile('[0-9a-f]{%d}' % len(decode_hash))
Packit 3f21c4
    for line in lines:
Packit 3f21c4
      m = hash_pattern.search(line.lower())
Packit 3f21c4
      if m:
Packit 3f21c4
        self.assertEqual(self.decode_hash, m.group(),
Packit 3f21c4
          'hash of known decoded document must be correct')
Packit 3f21c4
        return
Packit 3f21c4
    self.fail('document hash was not found in the output')
Packit 3f21c4
Packit 3f21c4
suite = SelfTestSuite()
Packit 3f21c4
for filename, file_hash, decode_hash in KnownFileHash.known_hashes:
Packit 3f21c4
  # only add tests for files we can find
Packit 3f21c4
  if not os.access(filename, os.R_OK): continue
Packit 3f21c4
  # todo: verify our file matches its encoded document hash
Packit 3f21c4
  suite.addTest(KnownFileHash(filename, file_hash, decode_hash))
Packit 3f21c4
Packit 3f21c4
# run the defined tests if we're called as a script
Packit 3f21c4
if __name__ == "__main__":
Packit 3f21c4
    result = suite.run()
Packit 3f21c4
    sys.exit(not result)