def testFillingFirstPage(self, MockEncodeAddressUnwinds): MockEncodeAddressUnwinds.return_value = EncodedAddressUnwind( 0, b'\x00') self.assertEqual( [ EncodedFunctionUnwind(page_number=0, page_offset=0, address_unwinds=REFUSE_TO_UNWIND), EncodedFunctionUnwind(page_number=0, page_offset=100 >> 1, address_unwinds=EncodedAddressUnwind( 0, b'\x00')), EncodedFunctionUnwind(page_number=0, page_offset=200 >> 1, address_unwinds=EncodedAddressUnwind( 0, b'\x00')), EncodedFunctionUnwind(page_number=0, page_offset=300 >> 1, address_unwinds=REFUSE_TO_UNWIND), ], list( EncodeFunctionUnwinds([ FunctionUnwind(address=1100, size=100, address_unwinds=()), FunctionUnwind(address=1200, size=100, address_unwinds=()), ], text_section_start_address=1000)))
def testFillingGaps(self, MockEncodeAddressUnwinds): MockEncodeAddressUnwinds.return_value = EncodedAddressUnwind( 0, b'\x00') self.assertEqual( [ EncodedFunctionUnwind(page_number=0, page_offset=0, address_unwinds=EncodedAddressUnwind( 0, b'\x00')), EncodedFunctionUnwind(page_number=0, page_offset=50 >> 1, address_unwinds=TRIVIAL_UNWIND), EncodedFunctionUnwind(page_number=0, page_offset=100 >> 1, address_unwinds=EncodedAddressUnwind( 0, b'\x00')), ], list( EncodeFunctionUnwinds([ FunctionUnwind(address=0, size=50, address_unwinds=()), FunctionUnwind( address=100, size=PAGE_SIZE - 100, address_unwinds=()), ], text_section_start_address=0)))
def testOverlappedFunctions(self, _): self.assertRaises( # Eval generator with `list`. Otherwise the code will not execute. AssertionError, lambda: list( EncodeFunctionUnwinds([ FunctionUnwind(address=0, size=100, address_unwinds=()), FunctionUnwind(address=50, size=100, address_unwinds=()), ])))
def testSuccessUnwind(self): self.assertEqual( [ FunctionUnwind(address=0x100, size=1024, address_unwinds=( AddressUnwind( address_offset=0x0, unwind_type=UnwindType.RETURN_TO_LR, sp_offset=0, registers=(), ), AddressUnwind( address_offset=0x200, unwind_type=UnwindType.RETURN_TO_LR, sp_offset=0, registers=(), ), )) ], list( GenerateUnwinds([ FunctionCfi(size=1024, address_cfi=( AddressCfi(address=0x100, unwind_instructions='RETURN'), AddressCfi(address=0x300, unwind_instructions='RETURN'), )) ], parsers=[MockReturnParser()])))
def testEncodeOrder(self, MockEncodeAddressUnwinds): MockEncodeAddressUnwinds.return_value = EncodedAddressUnwind( 0, b'\x00') self.assertEqual([ EncodedFunctionUnwind(page_number=0, page_offset=0, address_unwinds=EncodedAddressUnwind( 0, b'\x00')), EncodedFunctionUnwind(page_number=0, page_offset=100 >> 1, address_unwinds=EncodedAddressUnwind( 0, b'\x00')), ], list( EncodeFunctionUnwinds([ FunctionUnwind(address=100, size=PAGE_SIZE - 100, address_unwinds=()), FunctionUnwind(address=0, size=100, address_unwinds=()), ])))