Irfan Mehmood

92 papers Misc 2Journal 76Unranked 13
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Haroon Wahab, Hassan Ugail, Irfan Mehmood
2025 conf
MLSP
Haroon Wahab, Hassan Ugail, Irfan Mehmood
2024 J jnl
J. Supercomput.
Umair Khan, Muazzam Maqsood, Saira Andleeb Gillani, Mehr Yahya Durrani, Irfan Mehmood, Sanghyun Seo
2024 J jnl
Future Gener. Comput. Syst.
Haroon Wahab, Irfan Mehmood, Hassan Ugail, Javier Del Ser, Khan Muhammad
2023 J jnl
J. Signal Process. Syst.
Muazzam Maqsood, Mustansar Ali Ghazanfar, Irfan Mehmood, Eenjun Hwang, Seungmin Rho
2023 J jnl
J. Supercomput.
Umair Khan, Muazzam Maqsood, Saira Andleeb Gillani, Mehr Yahya Durrani, Irfan Mehmood, Sanghyun Seo
2023 J jnl
Future Gener. Comput. Syst.
Haroon Wahab, Irfan Mehmood, Hassan Ugail, Arun Kumar Sangaiah, Khan Muhammad
2023 J jnl
Multim. Syst.
Nawab Muhammad Faseeh Qureshi, Varun G. Menon, Ali Kashif Bashir, Shahid Mumtaz, Irfan Mehmood
2022 J jnl
Syst.
Haider Maqsood, Muazzam Maqsood, Sadaf Yasmin, Irfan Mehmood, Jihoon Moon, Seungmin Rho
2021 J jnl
Comput. Intell. Neurosci.
Wafaa Adnan Alsaggaf, Irfan Mehmood, Enas Fawai Khairullah, Samar M. Alkhuraiji, Maha Farouk S. Sabir, Ahmed S. Alghamdi, Ahmed A. Abd El-Latif
2021 J jnl
Sensors
Rita Goel, Irfan Mehmood, Hassan Ugail
2021 J jnl
Multim. Tools Appl.
Hina Nawaz, Muazzam Maqsood, Sitara Afzal, Farhan Aadil, Irfan Mehmood, Seungmin Rho
2021 J jnl
Int. J. Interact. Multim. Artif. Intell.
Sitara Afzal, Muazzam Maqsood, Umair Khan, Irfan Mehmood, Hina Nawaz, Farhan Aadil, Oh-Young Song, Yunyoung Nam
2021 J jnl
IEEE Access
Maryam Bukhari, Khalid Bashir Bajwa, Saira Andleeb Gillani, Muazzam Maqsood, Mehr Yahya Durrani, Irfan Mehmood, Hassan Ugail, Seungmin Rho
2021 conf
MICAD
Maisun Mohamed Al Zorgani, Irfan Mehmood, Hassan Ugail
2021 conf
MICAD
Maisun Mohamed Al Zorgani, Irfan Mehmood, Hassan Ugail
2021 conf
MICAD
Maisun Mohamed Al Zorgani, Irfan Mehmood, Hassan Ugail
2021 J jnl
Inf. Process. Manag.
Ahmed A. Abd El-Latif, Bassem Abd-El-Atty, Irfan Mehmood, Khan Muhammad, Salvador E. Venegas-Andraca, Jialiang Peng
2020 J jnl
IEEE Access
Nestor Tsafack, Syam Sankar, Bassem Abd-El-Atty, Jacques Kengne, K. C. Jithin, Akram Belazi, Irfan Mehmood, Ali Kashif Bashir, Oh-Young Song, Ahmed A. Abd El-Latif
2020 J jnl
IEEE Access
Laiba Zahid, Muazzam Maqsood, Mehr Yahya Durrani, Maheen Bakhtyar, Junaid Baber, Habibullah Jamal, Irfan Mehmood, Oh-Young Song
2020 J jnl
Int. J. Inf. Manag.
Haider Maqsood, Irfan Mehmood, Muazzam Maqsood, Muhammad Yasir, Sitara Afzal, Farhan Aadil, Mahmoud Mohamed Selim, Khan Muhammad
2020 conf
ICCS (5)
Khasrouf Taif, Hassan Ugail, Irfan Mehmood
2020 J jnl
Concurr. Comput. Pract. Exp.
Shuihua Wang, Junding Sun, Irfan Mehmood, Chichun Pan, Yi Chen, Yudong Zhang
2020 conf
IW-FCV
Laiba Zahid, Muazzam Maqsood, Sehar Shahzad Farooq, Farhan Aadil, Irfan Mehmood, Mustansar Fiaz, Soon Ki Jung
2020 J jnl
IEEE Trans. Ind. Informatics
Khan Muhammad, Salman Khan, Vasile Palade, Irfan Mehmood, Victor Hugo C. de Albuquerque
2020 J jnl
Multim. Tools Appl.
Gulraiz Khan, Muhammad Usman Ghani, Aiman Siddiqi, Zahoor-Ur Rehman, Sanghyun Seo, Sung Wook Baik, Irfan Mehmood
2020 J jnl
Sensors
Muhammad Attique, Muhammad Afzal, Farman Ali, Irfan Mehmood, Muhammad Fazal Ijaz, Hyung-Ju Cho
2020 J jnl
IEEE Netw.
Sandeep Pirbhulal, Wanqing Wu, Khan Muhammad, Irfan Mehmood, Guanglin Li, Victor Hugo C. de Albuquerque
2020 J jnl
IEEE Access
Rehan Ashraf, Sitara Afzal, Attiq Ur Rehman, Sarah Gul, Junaid Baber, Maheen Bakhtyar, Irfan Mehmood, Oh-Young Song, Muazzam Maqsood
2020 J jnl
Circuits Syst. Signal Process.
Aniqa Dilawari, Muhammad Usman Ghani Khan, Zahoor-Ur Rehman, Khalid Mahmood Awan, Irfan Mehmood, Seungmin Rho
2020 J jnl
Future Gener. Comput. Syst.
Paolo Bellavista, Kaoru Ota, Zhihan Lv, Irfan Mehmood, Seungmin Rho
2020 J jnl
Sustain. Comput. Informatics Syst.
Lien Minh Dang, Syed Ibrahim Hassan, Suhyeon Im, Arun Kumar Sangaiah, Irfan Mehmood, Seungmin Rho, Sanghyun Seo, Hyeonjoon Moon
2019 J jnl
IEEE Access
Sitara Afzal, Muazzam Maqsood, Faria Nazir, Umair Khan, Farhan Aadil, Khalid M. Awan, Irfan Mehmood, Oh-Young Song
2019 ch.
Handbook of Multimedia Information Security
Sitara Afzal, Mubashir Javed, Muazzam Maqsood, Farhan Aadil, Seungmin Rho, Irfan Mehmood
2019 conf
SKIMA
Bassem Abd-El-Atty, Mohamed Amin, Ahmed A. Abd El-Latif, Hassan Ugail, Irfan Mehmood
2019 J jnl
Peer-to-Peer Netw. Appl.
Fouzia Jabeen, Muazzam Maqsood, Mustansar Ali Ghazanfar, Farhan Aadil, Salabat Khan, Muhammad Fahad Khan, Irfan Mehmood
2019 J jnl
Multim. Tools Appl.
Irfan Mehmood, Muhammad Sajjad, Khan Muhammad, Syed Inayat Ali Shah, Arun Kumar Sangaiah, Muhammad Shoaib, Sung Wook Baik
2019 J jnl
IEEE Internet Things J.
Irfan Mehmood, Amin Ullah, Khan Muhammad, Der-Jiunn Deng, Weizhi Meng, Fadi Al-Turjman, Muhammad Sajjad, Victor Hugo C. de Albuquerque
2019 J jnl
Comput. Hum. Behav.
Ch. Muhammad Shahzad Faisal, Ali Daud, AbuBakr Akram, Rabeeh Ayaz Abbasi, Naif Radi Aljohani, Irfan Mehmood
2019 J jnl
IEEE Access
Zhihan Lv, Irfan Mehmood, Mario Vento, Minh-Son Dao, Kaoru Ota, Alessia Saggese
2019 J jnl
IEEE Access
Misbah Iqbal, Mustansar Ali Ghazanfar, Asma Sattar, Muazzam Maqsood, Salabat Khan, Irfan Mehmood, Sung Wook Baik
2019 J jnl
Multim. Tools Appl.
Muhammad Wasim, Muhammad Nabeel Asim, Muhammad Usman Ghani, Zahoor-Ur Rehman, Seungmin Rho, Irfan Mehmood
2019 J jnl
Int. J. Inf. Manag.
Irfan Mehmood, Zhihan Lv, Yudong Zhang, Kaoru Ota, Muhammad Sajjad, Amit Kumar Singh
2019 J jnl
Future Gener. Comput. Syst.
Bin Cao, Jianwei Zhao, Po Yang, Peng Yang, Xin Liu, Jun Qi, Andrew Simpson, Mohamed Elhoseny, Irfan Mehmood, Khan Muhammad
2019 conf
SKIMA
Hayat Ullah, Irfan Mehmood
2019 J jnl
Multim. Tools Appl.
Faria Nazir, Mustansar Ali Ghazanfar, Muazzam Maqsood, Farhan Aadil, Seungmin Rho, Irfan Mehmood
2019 J jnl
Sensors
Muazzam Maqsood, Faria Nazir, Umair Khan, Farhan Aadil, Habibullah Jamal, Irfan Mehmood, Oh-Young Song
2018 J jnl
Mob. Networks Appl.
Peer Azmat Shah, Khalid Mahmood Awan, Zahoor-Ur Rehman, Khalid Iqbal, Farhan Aadil, Khan Muhammad, Irfan Mehmood, Sung Wook Baik
2018 J jnl
Multim. Tools Appl.
Zahoor Jan, Arshad Khan, Muhammad Sajjad, Khan Muhammad, Seungmin Rho, Irfan Mehmood
2018 J jnl
J. Supercomput.
Farhan Aadil, Waleed Ahsan, Zahoor-Ur Rehman, Peer Azmat Shah, Seungmin Rho, Irfan Mehmood
2018 J jnl
IEEE Access
Khan Muhammad, Jamil Ahmad, Irfan Mehmood, Seungmin Rho, Sung Wook Baik
2018 J jnl
Sensors
Farhan Aadil, Ali Raza, Muhammad Fahad Khan, Muazzam Maqsood, Irfan Mehmood, Seungmin Rho
2018 J jnl
Comput. Electr. Eng.
Tayyab Ateeq, Muhammad Nadeem Majeed, Syed Muhammad Anwar, Muazzam Maqsood, Zahoor-Ur Rehman, Jong Weon Lee, Khan Muhammad, Shuihua Wang, Sung Wook Baik, Irfan Mehmood
2018 J jnl
Clust. Comput.
Muhammad Sajjad, Adnan Shah, Zahoor Jan, Syed Inayat Ali Shah, Sung Wook Baik, Irfan Mehmood
2018 J jnl
Comput. Electr. Eng.
Muhammad Fahad Khan, Farhan Aadil, Zahoor-Ur Rehman, Salabat Khan, Peer Azmat Shah, Khan Muhammad, Jaime Lloret, Haoxiang Wang, Jong Weon Lee, Irfan Mehmood
2018 J jnl
Future Gener. Comput. Syst.
Khan Muhammad, Muhammad Sajjad, Irfan Mehmood, Seungmin Rho, Sung Wook Baik
2018 J jnl
Comput. Electr. Eng.
Zahoor-Ur Rehman, Sidra Nasim Khan, Khan Muhammad, Jong Weon Lee, Zhihan Lv, Sung Wook Baik, Peer Azmat Shah, Khalid Mahmood Awan, Irfan Mehmood
2018 J jnl
EURASIP J. Image Video Process.
Naveed Ejaz, Sung Wook Baik, Hammad Majeed, Hangbae Chang, Irfan Mehmood
2018 J jnl
IEEE Access
Aniqa Dilawari, Muhammad Usman Ghani Khan, Ammarah Farooq, Zahoor-Ur Rehman, Seungmin Rho, Irfan Mehmood
2018 J jnl
Comput. Ind.
Lien Minh Dang, Ibrahim Hassan, Suhyeon Im, Irfan Mehmood, Hyeonjoon Moon
2018 J jnl
J. Sensors
Sana Amanat, Muhammad Idrees, Muhammad Usman Ghani Khan, Zahoor-Ur Rehman, Hangbae Chang, Irfan Mehmood, Sung Wook Baik
2018 J jnl
Comput. Ind.
Jamil Ahmad, Khan Muhammad, Imran Ahmed, Wakeel Ahmad, Melvyn L. Smith, Lyndon N. Smith, Deepak Kumar Jain, Haoxiang Wang, Irfan Mehmood
2017 J jnl
Multim. Tools Appl.
Jamil Ahmad, Muhammad Sajjad, Zahoor Jan, Irfan Mehmood, Seungmin Rho, Sung Wook Baik
2017 J jnl
J. Vis. Commun. Image Represent.
Jamil Ahmad, Irfan Mehmood, Sung Wook Baik
2017 J jnl
Comput. Electr. Eng.
Jamil Ahmad, Irfan Mehmood, Seungmin Rho, Naveen K. Chilamkurti, Sung Wook Baik
2017 conf
ICME Workshops
Irfan Mehmood, Tanveer Hussain, Ibrahim Hassan, Seungmin Rho, Muhammad Sajjad
2017 J jnl
IEEE Access
Muhammad Sajjad, Siraj Khan, Zahoor Jan, Khan Muhammad, Hyeonjoon Moon, Jin Tae Kwak, Seungmin Rho, Sung Wook Baik, Irfan Mehmood
2017 Misc conf
FIT
Zaheer Ahmed, Khalid Iqbal, Irfan Mehmood, Muhammad Adnan Ayub
2017 J jnl
Multim. Tools Appl.
Muhammad Sajjad, Khan Muhammad, Sung Wook Baik, Seungmin Rho, Zahoor Jan, Sang-Soo Yeo, Irfan Mehmood
2017 J jnl
J. Real Time Image Process.
Jamil Ahmad, Muhammad Sajjad, Irfan Mehmood, Seungmin Rho, Sung Wook Baik
2016 J jnl
Multim. Tools Appl.
Khan Muhammad, Muhammad Sajjad, Irfan Mehmood, Seungmin Rho, Sung Wook Baik
2016 J jnl
Signal Image Video Process.
Muhammad Sajjad, Irfan Mehmood, Naveed Abbas, Sung Wook Baik
2016 Misc conf
FIT
Muhammad Sajjad, Siraj Khan, Muhammad Shoaib, Hazrat Ali, Zahoor Jan, Khan Muhammad, Irfan Mehmood
2016 J jnl
Neurocomputing
Irfan Mehmood, Muhammad Sajjad, Seungmin Rho, Sung Wook Baik
2015 J jnl
CoRR
Khan Muhammad, Muhammad Sajjad, Irfan Mehmood, Seungmin Rho, Sung Wook Baik
2015 J jnl
CoRR
Jamil Ahmad, Muhammad Sajjad, Irfan Mehmood, Seungmin Rho, Sung Wook Baik
2015 J jnl
Multim. Tools Appl.
Muhammad Sajjad, Naveed Ejaz, Irfan Mehmood, Sung Wook Baik
2015 J jnl
J. Vis. Commun. Image Represent.
Muhammad Sajjad, Irfan Mehmood, Sung Wook Baik
2015 J jnl
CoRR
Khan Muhammad, Irfan Mehmood, Mi Young Lee, Su Mi Ji, Sung Wook Baik
2015 conf
NBiS
Jamil Ahmad, Muhammad Sajjad, Irfan Mehmood, Sung Wook Baik
2015 J jnl
Inf. Fusion
Irfan Mehmood, Muhammad Sajjad, Waleed Ejaz, Sung Wook Baik
2014 J jnl
J. Medical Syst.
Irfan Mehmood, Muhammad Sajjad, Sung Wook Baik
2014 J jnl
Comput. Electr. Eng.
Naveed Ejaz, Irfan Mehmood, Sung Wook Baik
2014 J jnl
Sensors
Irfan Mehmood, Muhammad Sajjad, Sung Wook Baik
2014 J jnl
Sensors
Muhammad Sajjad, Irfan Mehmood, Sung Wook Baik
2014 J jnl
J. Medical Syst.
Irfan Mehmood, Muhammad Sajjad, Sung Wook Baik
2013 J jnl
Signal Process. Image Commun.
Naveed Ejaz, Irfan Mehmood, Sung Wook Baik
2013 J jnl
Comput. Biol. Medicine
Irfan Mehmood, Naveed Ejaz, Muhammad Sajjad, Sung Wook Baik
2012 J jnl
Int. J. Comput. Intell. Syst.
M. Arfan Jaffar, Sultan Zia, Ghazanfar Latif, Anwar M. Mirza, Irfan Mehmood, Naveed Ejaz, Sung Wook Baik
2012 conf
ICITCS
Irfan Mehmood, Ran Baik, Sung Wook Baik
2012 conf
NGMAST
Naveed Ejaz, Irfan Mehmood, Waleed Ejaz, Sung Wook Baik
2010 conf
KES (1)
Qurat Ul Ain, Irfan Mehmood, Syed Muhammad Naqi, M. Arfan Jaffar
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 != ""