Jacques Demerjian

96 papers A 1B 7C 6Misc 1Journal 41Unranked 39
YearRankTypeTitle / Venue / Authors
2025 conf
AINA (3)
Benoît Piranda, Julien Bourgeois, Jacques Demerjian, Abdallah Makhoul
2025 conf
MENACOMM
Joseph Azar, Mohammad Abdullah Tahir, Jacques Bou Abdo, Jacques Demerjian, Nadine Akkari
2025 J jnl
IEEE Commun. Mag.
Stefano Bregni, Lingyang Song, Jacques Demerjian, Vivek Ashok Bohara, Lina S. Mohjazi
2025 J jnl
IEEE Commun. Mag.
Jacques Demerjian, Román A. Lara-Cueva, Job Chunkath, Christos Masouros, Augusto José Venâncio Neto
2025 J jnl
IEEE Commun. Mag.
Hadeel Elayan, Jacques Demerjian, Kevin Pérez Ronquillo, Hina Tabassum
2025 J jnl
IEEE Commun. Mag.
Román A. Lara-Cueva, Jacques Demerjian, Keattisak Sripimanwat, Vivek Ashok Bohara, Baek-Young Choi
2025 conf
MENACOMM
Charbel Mattar, Joseph Gemayel, Jacques Bou Abdo, Charbel El Gemayel, Abdallah Makhoul, Jacques Demerjian
2025 J jnl
J. Sens. Actuator Networks
Charbel Mattar, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2025 J jnl
CoRR
Clarita Hawat, Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2025 J jnl
CoRR
Charbel Mattar, Jacques Bou Abdo, Abdallah Makhoul, Benoît Piranda, Jacques Demerjian
2024 J jnl
Multim. Tools Appl.
Michel Chammas, Abdallah Makhoul, Jacques Demerjian, Elie Dannaoui
2024 J jnl
Computer
Jacques Bou Abdo, Sherali Zeadally, Jacques Demerjian
2024 J jnl
IEEE Commun. Mag.
Stefano Bregni, RR Venkatesha Prasad, Raida Al-Alwai, Mohab Mangoud, Keattisak Sripimanwat, Jacques Demerjian, Umair Ahmed Korai
2024 J jnl
Trans. Recomm. Syst.
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2023 J jnl
Sensors
Suzan Hajj, Joseph Azar, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul, Dominique Ginhac
2023 B conf
DSAA
Suzan Hajj, Joseph Azar, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul, Dominique Ginhac
2023 conf
COMPLEX NETWORKS (4)
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2023 conf
AIBThings
Serge Sandakly, Charbel Salem, Khalil Challita, Shuvalaxmi Dass, Joseph Azar, Jacques Bou Abdo, Jacques Demerjian
2022 conf
AINA (1)
Joseph Assaker, Abdallah Makhoul, Julien Bourgeois, Benoît Piranda, Jacques Demerjian
2022 conf
MENACOMM
Mohammad Ali Nemer, Joseph Azar, Jacques Demerjian, Abdallah Makhoul, Julien Bourgeois
2022 J jnl
Multim. Tools Appl.
Michel Chammas, Abdallah Makhoul, Jacques Demerjian, Elie Dannaoui
2022 J jnl
AI Ethics
Esther Nehme, Rayane El Sibai, Jacques Bou Abdo, A. Ross Taylor, Jacques Demerjian
2022 J jnl
CoRR
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2022 B conf
IWCMC
Gaby Bou Tayeh, Joseph Azar, Abdallah Makhoul, Christophe Guyeux, Jacques Demerjian
2022 C conf
AICCSA
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2021 J jnl
IEEE Access
Suzan Hajj, Rayane El Sibai, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul, Dominique Ginhac
2021 conf
MENACOMM
Ibrahim Atoui, Abdallah Makhoul, Raphaël Couturier, Jacques Demerjian
2021 J jnl
Internet Technol. Lett.
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2021 J jnl
Trans. Emerg. Telecommun. Technol.
Suzan Hajj, Rayane El Sibai, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul, Christophe Guyeux
2021 J jnl
ACM Trans. Knowl. Discov. Data
Wissam Al Jurdi, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2021 J jnl
Comput. Electr. Eng.
Joseph Azar, Abdallah Makhoul, Raphaël Couturier, Jacques Demerjian
2021 J jnl
Trans. Emerg. Telecommun. Technol.
Jacques Bou Abdo, Rayane El Sibai, Jacques Demerjian
2020 A conf
IROS
Joseph Assaker, Abdallah Makhoul, Julien Bourgeois, Jacques Demerjian
2020 B conf
IWCMC
Gaby Bou Tayeh, Joseph Azar, Abdallah Makhoul, Christophe Guyeux, Jacques Demerjian
2020 conf
Cloudtech
Rayane El Sibai, Jacques Bou Abdo, Chady Abou Jaoude, Jacques Demerjian, Yousra Chabchoub, Raja Chiky
2020 J jnl
Trans. Emerg. Telecommun. Technol.
Rayane El Sibai, Nader Gemayel, Jacques Bou Abdo, Jacques Demerjian
2020 J jnl
Int. J. Comput. Sci. Eng.
Christophe Guyeux, Jean-Claude Charr, Jacques Bou Abdo, Jacques Demerjian
2020 J jnl
Internet Technol. Lett.
Rayane El Sibai, Jacques Bou Abdo, Chady Abou Jaoude, Jacques Demerjian, Joseph Assaker, Abdallah Makhoul
2020 J jnl
World Wide Web
Gaby Bou Tayeh, Abdallah Makhoul, Jacques Demerjian, Christophe Guyeux, Jacques M. Bahi
2020 J jnl
Int. J. Sens. Networks
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul, Christophe Guyeux
2020 J jnl
Peer-to-Peer Netw. Appl.
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2020 J jnl
Internet Technol. Lett.
Jacques Bou Abdo, Rayane El Sibai, Krishna Kambhampaty, Jacques Demerjian
2020 J jnl
Neurocomputing
Joseph Azar, Abdallah Makhoul, Raphaël Couturier, Jacques Demerjian
2020 J jnl
IET Wirel. Sens. Syst.
Nadine Boudargham, Rayane El Sibai, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2020 C conf
ICMLA
Michel Chammas, Abdallah Makhoul, Jacques Demerjian
2019 J jnl
IEEE Access
Gaby Bou Tayeh, Abdallah Makhoul, Charith Perera, Jacques Demerjian
2019 J jnl
CoRR
Gaby Bou Tayeh, Abdallah Makhoul, Charith Perera, Jacques Demerjian
2019 conf
ICAART (2)
Miriam El Khoury Badran, Jacques Bou Abdo, Wissam Al Jurdi, Jacques Demerjian
2019 J jnl
Comput. Electr. Eng.
Michel Chammas, Abdallah Makhoul, Jacques Demerjian
2019 conf
SENSORNETS
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2019 conf
SENSORNETS
Joseph Merhej, Jacques Demerjian, Karla Fares, Jacques Bou Abdo, Abdallah Makhoul
2019 J jnl
J. Sens. Actuator Networks
Christophe Guyeux, Stéphane Chrétien, Gaby Bou Tayeh, Jacques Demerjian, Jacques M. Bahi
2019 conf
KSEM (1)
Wissam Al Jurdi, Chady Abou Jaoude, Miriam El Khoury Badran, Jacques Bou Abdo, Jacques Demerjian, Abdallah Makhoul
2019 conf
MENACOMM
Rayane El Sibai, Yousra Chabchoub, Chady Abou Jaoude, Jacques Demerjian, Maurras Togbe
2018 J jnl
Pervasive Mob. Comput.
Gaby Bou Tayeh, Abdallah Makhoul, David Laiymani, Jacques Demerjian
2018 conf
MENACOMM
Gaby Bou Tayeh, Abdallah Makhoul, Jacques Demerjian, David Laiymani
2018 conf
MENACOMM
Rayane El Sibai, Yousra Chabchoub, Jacques Demerjian, Raja Chiky, Kablan Barbar
2018 C conf
W2GIS
Rayane El Sibai, Yousra Chabchoub, Raja Chiky, Jacques Demerjian, Kablan Barbar
2018 conf
MENACOMM
Georges Chaaya, Jacques Bou Abdo, Jacques Demerjian, Raja Chiky, Elisabeth Métais, Kablan Barbar
2018 conf
MENACOMM
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2018 conf
EMCIS
Georges Chaaya, Jacques Bou Abdo, Elisabeth Métais, Raja Chiky, Jacques Demerjian, Kablan Barbar
2018 J jnl
Sensors
Nadine Bou Dargham, Abdallah Makhoul, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux
2018 conf
MENACOMM
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Talar Atéchian
2018 conf
MENACOMM
Rayane El Sibai, Jacques Bou Abdo, Jacques Demerjian, Yousra Chabchoub, Raja Chiky, Kablan Barbar
2018 conf
MENACOMM
Joseph Azar, Abdallah Makhoul, Rony Darazi, Jacques Demerjian, Raphaël Couturier
2018 conf
MENACOMM
Lamis Al Hassanieh, Chadi Abou Jaoudeh, Jacques Bou Abdo, Jacques Demerjian
2018 conf
MENACOMM
Rami Yared, Chady Abou Jaoude, Jacques Demerjian
2018 B conf
WiMob
Joseph Azar, Carol Habib, Rony Darazi, Abdallah Makhoul, Jacques Demerjian
2018 B conf
IWCMC
Joseph Azar, Rony Darazi, Carol Habib, Abdallah Makhoul, Jacques Demerjian
2017 conf
ICCA
Rayane El Sibai, Chady Abou Jaoude, Jacques Demerjian
2017 conf
ICCCI (2)
Rayane El Sibai, Yousra Chabchoub, Raja Chiky, Jacques Demerjian, Kablan Barbar
2017 C conf
ICMLA
Georges Chaaya, Elisabeth Métais, Jacques Bou Abdo, Raja Chiky, Jacques Demerjian, Kablan Barbar
2017 J jnl
Pervasive Mob. Comput.
Jacques Bou Abdo, Jacques Demerjian
2017 J jnl
CoRR
Abdessalem Abidi, Christophe Guyeux, Jacques Demerjian, Belagacem Bouallegue, Mohsen Machhout
2016 J jnl
Mob. Inf. Syst.
Jacques Bou Abdo, Thomas Bourgeau, Jacques Demerjian, Hakima Chaouchi
2016 J jnl
CoRR
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2016 C conf
AICCSA
Nadine Boudargham, Jacques Bou Abdo, Jacques Demerjian, Christophe Guyeux, Abdallah Makhoul
2016 conf
CSE/EUC/DCABES
Jacques Bou Abdo, Rabih Jreish, Jacques Demerjian, Talar Atéchian
2016 conf
ICDEc
Rayane El Sibai, Yousra Chabchoub, Jacques Demerjian, Zakia Kazi-Aoul, Kablan Barbar
2015 conf
GSCIT
Rayane El Sibaï, Talar Atéchian, Jacques Bou Abdo, Jacques Demerjian, Rami Tawil
2015 conf
FiCloud
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Talar Atéchian
2015 conf
GSCIT
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Rami Yared, Talar Atéchian
2015 conf
DICTAP
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Talar Atéchian, Carole Bassil
2014 conf
HPCC/CSS/ICESS
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle, Talar Atéchian
2014 B conf
WCNC
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle
2013 conf
ICITST
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle
2008 conf
Wireless Days
Gilbert Sawma, Jacques Demerjian, Issam Aib, Guy Pujolle
2008 C conf
AICCSA
Rami Tawil, Jacques Demerjian, Guy Pujolle, Oscar Salazar Gaitán
2007 J jnl
J. Commun.
Oscar Salazar Gaitán, Philippe Martins, Jacques Demerjian, Samir Tohmé
2007 conf
VTC Fall
Oscar Salazar Gaitán, Philippe Martins, Samir Tohmé, Jacques Demerjian
2006 B conf
IWCMC
Sylvie Laniepce, Jacques Demerjian, Amdjed Mokhtari
2005 conf
MMM-ACNS
Jacques Demerjian, Ibrahim Hajjeh, Mohamad Badra, Salim Ferraz
2005 conf
Web Technologies, Applications, and Services
Jacques Demerjian, Ibrahim Hajjeh, Ahmed Serhrouchni, Mohamad Badra
2004 conf
ICETE (2)
Jacques Demerjian, Ahmed Serhrouchni, Mohammed Achemlal
2004 Misc conf
SEC
Jacques Demerjian, Ahmed Serhrouchni
2004
Jacques Demerjian
tests/integration/test_elf_extractor.py
← Index tests/integration/test_elf_extractor.py python
"""
Integration tests for the ELFExtractor base class.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration, pytest.mark.elf]


class TestELFExtractorInitialization:
    """Tests for ELFExtractor initialization."""

    def test_elf_extractor_with_valid_elf(self, elf_binary_path, mock_logger):
        """Test ELFExtractor initialization with valid ELF file."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            assert extractor.filepath == elf_binary_path
            assert extractor._is_elf_file() is True

    def test_elf_extractor_with_invalid_file(self, pe_binary_path, mock_logger):
        """Test ELFExtractor initialization with non-ELF file."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(pe_binary_path, mock_logger)

            # Should not be a valid ELF
            assert extractor._is_elf_file() is False

    def test_elf_extractor_with_text_file(self, temp_text_file, mock_logger):
        """Test ELFExtractor initialization with text file."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(temp_text_file, mock_logger)

            # Should not be a valid ELF
            assert extractor._is_elf_file() is False


class TestELFExtractorMethods:
    """Tests for ELFExtractor helper methods."""

    def test_is_elf_file_true(self, elf_binary_path, mock_logger):
        """Test _is_elf_file returns True for valid ELF."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            assert extractor._is_elf_file() is True

    def test_is_elf_file_cached(self, elf_binary_path, mock_logger):
        """Test _is_elf_file result is cached."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            # First call
            result1 = extractor._is_elf_file()
            # Second call should use cached value
            result2 = extractor._is_elf_file()

            assert result1 == result2
            # Cache should be set
            assert extractor._elf_file_valid is not None

    def test_is_64bit(self, elf_binary_path, mock_logger):
        """Test _is_64bit method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._is_64bit()
            # Result depends on the test binary
            assert isinstance(result, bool)

    def test_is_stripped(self, elf_binary_path, mock_logger):
        """Test _is_stripped method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._is_stripped()
            assert isinstance(result, bool)

    def test_has_debug_info(self, elf_binary_path, mock_logger):
        """Test _has_debug_info method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._has_debug_info()
            assert isinstance(result, bool)

    def test_get_architecture(self, elf_binary_path, mock_logger):
        """Test _get_architecture method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._get_architecture()
            # Should return a string (architecture name)
            assert isinstance(result, str)
            assert result != ""

    def test_get_endianness(self, elf_binary_path, mock_logger):
        """Test _get_endianness method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._get_endianness()
            # Should be one of: "little", "big", or "unknown"
            assert result in ["little", "big", "unknown"]

    def test_get_file_type(self, elf_binary_path, mock_logger):
        """Test _get_file_type method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._get_file_type()
            # Should return a file type string
            assert isinstance(result, str)
            # Common values: "executable", "shared_object", "relocatable", etc.
            expected_types = ["none", "relocatable", "executable", "shared_object", "core_dump", "unknown"]
            assert result in expected_types or result.startswith("ET_")

    def test_is_pie(self, elf_binary_path, mock_logger):
        """Test _is_pie method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._is_pie()
            assert isinstance(result, bool)

    def test_has_stack_protection(self, elf_binary_path, mock_logger):
        """Test _has_stack_protection method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._has_stack_protection()
            assert isinstance(result, bool)

    def test_has_nx_bit(self, elf_binary_path, mock_logger):
        """Test _has_nx_bit method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._has_nx_bit()
            assert isinstance(result, bool)

    def test_has_relro(self, elf_binary_path, mock_logger):
        """Test _has_relro method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._has_relro()
            assert isinstance(result, bool)

    def test_get_build_id(self, elf_binary_path, mock_logger):
        """Test _get_build_id method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._get_build_id()
            # Could be None if no build ID, or a hex string
            assert result is None or isinstance(result, str)

    def test_count_sections(self, elf_binary_path, mock_logger):
        """Test _count_sections method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._count_sections()
            assert isinstance(result, int)
            assert result >= 0

    def test_count_segments(self, elf_binary_path, mock_logger):
        """Test _count_segments method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._count_segments()
            assert isinstance(result, int)
            assert result >= 0

    def test_count_symbols(self, elf_binary_path, mock_logger):
        """Test _count_symbols method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._count_symbols()
            assert isinstance(result, int)
            assert result >= 0

    def test_get_dependencies(self, elf_binary_path, mock_logger):
        """Test _get_dependencies method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor._get_dependencies()
            assert isinstance(result, list)


class TestWithELFFile:
    """Tests for the _with_elf_file context manager method."""

    def test_with_elf_file_success(self, elf_binary_path, mock_logger):
        """Test _with_elf_file executes operation successfully."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            # Define a simple operation
            def get_header(elf):
                return elf.header is not None

            result = extractor._with_elf_file(get_header)
            assert result is True

    def test_with_elf_file_error_handling(self, temp_text_file, mock_logger):
        """Test _with_elf_file handles errors gracefully."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(temp_text_file, mock_logger)

            # Define an operation that would fail
            def get_header(elf):
                return elf.header

            result = extractor._with_elf_file(get_header)
            # Should return None on error
            assert result is None


class TestELFExtractorTag:
    """Tests for tag method in ELF extractors."""

    def test_elf_features_tag(self, elf_binary_path, mock_logger):
        """Test that ELFFeaturesExtractor returns correct tag."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)
            tag = extractor.tag()
            # Should return the tag string
            assert isinstance(tag, str)
            assert "elf" in tag.lower() or "features" in tag.lower()


class TestELFExtractorClickHouseTable:
    """Tests for get_clickhouse_table method in ELF extractors."""

    def test_elf_features_clickhouse_table(self, elf_binary_path, mock_logger):
        """Test that ELFFeaturesExtractor returns correct ClickHouse table name."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)
            assert extractor.get_clickhouse_table() == "redb_elf_features"


class TestELFExtractorExtract:
    """Tests for extract method in ELF extractors."""

    def test_elf_features_extract(self, elf_binary_path, mock_logger):
        """Test ELFFeaturesExtractor.extract() returns valid data."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor
        from redb.models.dataclasses import ELFFeatures

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()
            assert result is not None
            assert isinstance(result, ELFFeatures)

            # Check some expected fields
            assert isinstance(result.ei_class, int)
            assert isinstance(result.ei_data, int)
            assert isinstance(result.e_entry, int)
            assert isinstance(result.number_of_sections, int)
            assert isinstance(result.number_of_segments, int)

    def test_elf_features_extract_invalid_file(self, pe_binary_path, mock_logger):
        """Test ELFFeaturesExtractor.extract() handles invalid ELF."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()
            # Should return None for invalid ELF
            assert result is None


class TestELFExtractorPrepareExportData:
    """Tests for prepare_export_data method in ELF extractors."""

    def test_elf_features_prepare_export_elasticsearch(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            # First extract
            extractor.extract()
            result = extractor.prepare_export_data("ElasticsearchExporter")
            # Should return the elf_features dataclass
            assert result is extractor.elf_features

    def test_elf_features_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)

            # First extract
            extractor.extract()
            result = extractor.prepare_export_data("ClickHouseExporter")

            # Should return tuple of (data, column_names, column_type_names)
            assert isinstance(result, tuple)
            assert len(result) == 3
            data, column_names, column_type_names = result
            assert isinstance(data, list)
            assert isinstance(column_names, list)
            assert isinstance(column_type_names, list)
            # Column names and types should match in length
            assert len(column_names) == len(column_type_names)


class TestELFExtractorAdvanced:
    """Advanced tests for ELF extraction using hello_advanced binary."""

    def test_elf_advanced_features(self, elf_advanced_binary_path, mock_logger):
        """Test ELFFeaturesExtractor with more complex ELF binary."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_advanced_binary_path, mock_logger)

            result = extractor.extract()
            assert result is not None

            # Check that we can extract meaningful data
            assert result.number_of_sections > 0
            assert result.number_of_segments > 0

    def test_elf_advanced_architecture(self, elf_advanced_binary_path, mock_logger):
        """Test architecture detection for advanced ELF binary."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_advanced_binary_path, mock_logger)

            arch = extractor._get_architecture()
            # Should detect a valid architecture
            assert arch != "unknown"
            assert arch != ""