1 from unittest import expectedFailure
2 from unittest import skip
4 from .base import TestBase
5 from ..disassembler import DisassemblerByteArraySource
6 from ..disassembler import DisassemblerFileSource
7 from ..disassembler import Disassembler
8 from ..object import ObjectFile
10 class TestDisassembler(TestBase):
11 def test_simple(self):
12 sequence = '\x67\xe3\x81' # jcxz -127
13 triple = 'i686-apple-darwin9'
15 source = DisassemblerByteArraySource(sequence)
17 disassembler = Disassembler(triple, source)
18 instructions = list(disassembler.get_instructions())
20 self.assertEqual(len(instructions), 1)
23 self.assertEqual(str(i), '\tjcxz\t-127\n')
24 self.assertEqual(i.byte_size, 3)
25 self.assertEqual(i.id, 1032)
26 self.assertTrue(i.is_branch)
27 self.assertFalse(i.is_move)
28 self.assertEqual(i.branch_target_id, 0)
30 tokens = list(i.get_tokens())
31 self.assertEqual(len(tokens), 4)
33 self.assertEqual(str(token), 'jcxz')
34 self.assertFalse(token.is_whitespace)
35 self.assertFalse(token.is_punctuation)
36 self.assertTrue(token.is_opcode)
37 self.assertFalse(token.is_literal)
38 self.assertFalse(token.is_register)
40 self.assertTrue(tokens[1].is_whitespace)
42 operands = list(i.get_operands())
43 self.assertEqual(len(operands), 1)
45 # TODO implement operand tests
47 @skip('This test is horribly broken and probably not even correct.')
48 def test_read_instructions(self):
49 filename = self.get_test_binary()
50 o = ObjectFile(filename=filename)
52 for symbol in o.get_symbols():
53 address = symbol.address
54 offset = symbol.file_offset
57 source = DisassemblerFileSource(filename, offset, length=size,
58 start_address=address)
60 disassembler = Disassembler('x86-generic-gnu-linux', source)
61 for instruction in disassembler.get_instructions():