From 53ea167fbff4187b8a77e7804837c65f55937d09 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Mon, 24 Jan 2022 14:32:11 -0500 Subject: Add additional unit tests for types.py and fix some resulting bugs --- suite/testcommon.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) (limited to 'suite/testcommon.py') diff --git a/suite/testcommon.py b/suite/testcommon.py index ac31e668..631c626e 100644 --- a/suite/testcommon.py +++ b/suite/testcommon.py @@ -10,8 +10,10 @@ from binaryninja.filemetadata import FileMetadata from binaryninja.datarender import DataRenderer from binaryninja.function import InstructionTextToken, DisassemblyTextLine from binaryninja.enums import InstructionTextTokenType, FindFlag,\ - FunctionGraphType -from binaryninja.types import Type + FunctionGraphType, NamedTypeReferenceClass, ReferenceType +from binaryninja.types import (Type, BoolWithConfidence, EnumerationBuilder, NamedTypeReferenceBuilder, + IntegerBuilder, CharBuilder, FloatBuilder, WideCharBuilder, PointerBuilder, ArrayBuilder, FunctionBuilder, StructureBuilder, + EnumerationBuilder, NamedTypeReferenceBuilder) import subprocess import re @@ -804,6 +806,58 @@ class TestBuilder(Builder): finally: self.delete_package("helloworld") + def test_TypeBuilders_and_Types(self): + """Test TypeBuilders""" + file_name = self.unpackage_file("helloworld") + try: + with binja.open_view(file_name) as bv: + with binja.StructureBuilder.builder(bv, 'Foo') as s: + s.packed = True + s.append(Type.int(2)) + s.append(Type.int(4)) + s.append(Type.void()) + s.append(Type.bool()) + s.append(Type.char()) + s.append(Type.char("char_alt_name")) + s.append(Type.float(2), "half") + s.append(Type.float(4) ) + s.append(Type.float(8)) + s.append(Type.float(16)) + s.append(Type.wide_char(4, "wchar32_t")) + s.append(Type.structure_type(binja.StructureBuilder.create([Type.int(1)]))) + s.append(Type.named_type(NamedTypeReferenceBuilder.create(NamedTypeReferenceClass.UnknownNamedTypeClass, "id", "name"))) + s.append(Type.named_type_from_type_and_id("id2", ["qualified", "name"])) + s.append(Type.generate_named_type_reference("guid", [b"byte", b"name"])) + s.append(Type.enumeration_type(bv.arch, EnumerationBuilder.create([("Member1", 1)]))) + try: + Type.pointer(None, None) # test the failure case + except binja.types.TypeCreateException as tce: + pass + s.append(Type.pointer_of_width(8, Type.int(4), BoolWithConfidence(True, 255), BoolWithConfidence(False, 255), ReferenceType.RValueReferenceType)) + s.append(Type.array(Type.int(4), 4)) + s.append(Type.structure([(Type.int(4), "field1")])) + s.append(Type.enumeration(bv.arch, [binja.types.EnumerationMember("Mem-1", 1), binja.types.EnumerationMember("Mem-2")])) + s.append(Type.enumeration(bv.arch, [binja.types.EnumerationMember("Mem2-1", 1), binja.types.EnumerationMember("Mem2-2")], 2)) + s.append(Type.enumeration(bv.arch, [binja.types.EnumerationMember("Mem3-1", 1), binja.types.EnumerationMember("Mem3-2")], 2, True)) + s.append(Type.enumeration(bv.arch, None)) + tid = Type.generate_auto_demangled_type_id("auto_demangled_tid") + tid_source = Type.get_auto_demangled_type_id_source() + s.append(Type.named_type_reference(NamedTypeReferenceClass.UnknownNamedTypeClass, "Someothername", tid, 4, 4, True, True)) + try: + Type.int(4).name + assert False, "trying to access name of integer succeeded when it shouldn't have" + except NotImplementedError: + pass + + members = s.members + s = bv.types['Foo'] + assert members == s.members + assert const == s.const + assert volatile == s.volatile + return str(s.members) + finally: + self.delete_package("helloworld") + def test_Plugin_bin_info(self): """print_syscalls plugin produced different result""" file_name = self.unpackage_file("helloworld") -- cgit v1.3.1