Kamal K. Mandal

11 papers Journal 6Unranked 5
YearRankTypeTitle / Venue / Authors
2021 J jnl
Comput. Electr. Eng.
Gourab Das, M. De, Kamal K. Mandal
2019 J jnl
Appl. Soft Comput.
Sajjan Kumar, Kamal K. Mandal, Niladri Chakraborty
2013 conf
SEMCCO (1)
Bidishna Bhattacharya, Kamal K. Mandal, Niladri Chakraborty
2013 conf
SEMCCO (1)
Sajjan Kumar, Diptendu Pal, Kamal K. Mandal, Niladri Chakraborty
2012 J jnl
Expert Syst. Appl.
Kamal K. Mandal, Niladri Chakraborty
2011 conf
SEMCCO (1)
Bhimsen Tudu, Sibsankar Majumder, Kamal K. Mandal, Niladri Chakraborty
2011 conf
SEMCCO (1)
Kamal K. Mandal, Bidishna Bhattacharya, Bhimsen Tudu, Niladri Chakraborty
2011 J jnl
Appl. Soft Comput.
Kamal K. Mandal, Niladri Chakraborty
2010 conf
SEMCCO
Kamal K. Mandal, Bhimsen Tudu, Niladri Chakraborty
2009 J jnl
Int. J. Autom. Control.
Kamal K. Mandal, Mousumi Basu, Niladri Chakraborty
2008 J jnl
Appl. Soft Comput.
Kamal K. Mandal, Mousumi Basu, Niladri Chakraborty
tests/unit/test_decompile_function_type.py
← Index tests/unit/test_decompile_function_type.py python
"""Unit tests for bninja/function_type.py."""
import sys
import pytest
from unittest.mock import MagicMock

# Install binaryninja stubs before importing
from tests.unit.conftest_binja_stubs import install_binja_stubs, SymbolType
install_binja_stubs()

from redb.extractors.decompiler.bninja.function_type import (
    FunctionType,
    FunctionTypeAnalysis,
)


# ============================================================================
# 4a. FunctionType / FunctionTypeAnalysis
# ============================================================================


class TestFunctionTypeEnum:
    def test_function_type_enum_values(self):
        assert FunctionType.USER.value == "USER"
        assert FunctionType.LIBRARY.value == "LIBRARY"
        assert FunctionType.EXTERNAL.value == "EXTERNAL"
        assert FunctionType.THUNK.value == "THUNK"
        assert FunctionType.UNKNOWN.value == "UNKNOWN"


class TestFunctionTypeAnalysis:
    def _make_function(self, symbol_type=None, is_thunk=False, raise_on_symbol=False):
        func = MagicMock()
        func.is_thunk = is_thunk
        if raise_on_symbol:
            type(func).symbol = property(lambda self: (_ for _ in ()).throw(Exception("no symbol")))
        else:
            func.symbol.type = symbol_type if symbol_type is not None else SymbolType.FunctionSymbol
        return func

    def test_user_function_type(self):
        func = self._make_function(symbol_type=SymbolType.FunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.USER

    def test_external_function_type(self):
        func = self._make_function(symbol_type=SymbolType.ImportedFunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.EXTERNAL

    def test_library_function_type(self):
        func = self._make_function(symbol_type=SymbolType.LibraryFunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.LIBRARY

    def test_thunk_function_type(self):
        # Thunk overrides the symbol type
        func = self._make_function(
            symbol_type=SymbolType.FunctionSymbol, is_thunk=True
        )
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.THUNK

    def test_exception_returns_unknown(self):
        func = self._make_function(raise_on_symbol=True)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.UNKNOWN