blob: 822686b39478051dcda5a1621ec64883b431e018 [file] [log] [blame]
import struct
from nose.plugins.skip import Skip, SkipTest
import ubpf.assembler
import ubpf.disassembler
import testdata
try:
xrange
except NameError:
xrange = range
# Just for assertion messages
def try_disassemble(inst):
data = struct.pack("=Q", inst)
try:
return ubpf.disassembler.disassemble(data).strip()
except ValueError:
return "<error>"
def check_datafile(filename):
"""
Verify that the result of assembling the 'asm' section matches the
'raw' section.
"""
data = testdata.read(filename)
if 'asm' not in data:
raise SkipTest("no asm section in datafile")
if 'raw' not in data:
raise SkipTest("no raw section in datafile")
bin_result = ubpf.assembler.assemble(data['asm'])
assert len(bin_result) % 8 == 0
assert len(bin_result) / 8 == len(data['raw'])
for i in xrange(0, len(bin_result), 8):
j = int(i/8)
inst, = struct.unpack_from("=Q", bin_result[i:i+8])
exp = data['raw'][j]
if exp != inst:
raise AssertionError("Expected instruction %d to be %#x (%s), but was %#x (%s)" %
(j, exp, try_disassemble(exp), inst, try_disassemble(inst)))
def test_datafiles():
# Nose test generator
# Creates a testcase for each datafile
for filename in testdata.list_files():
yield check_datafile, filename