Wasif Afzal

109 papers A 8B 6C 13Misc 3Journal 41Unranked 36
YearRankTypeTitle / Venue / Authors
2025 J jnl
SN Comput. Sci.
Muhammad Nouman Zafar, Wasif Afzal, Eduard Paul Enoiu, Zulqarnain Haider, Inderjeet Singh
2025 J jnl
SN Comput. Sci.
Mikael Ebrahimi Salari, Eduard Paul Enoiu, Wasif Afzal, Cristina Seceleanu
2025 conf
FSEN
Eduard Enoiu, Nasir Mehmood Minhas, Michael Felderer, Wasif Afzal
2025 conf
MODELS-C
Rahmanu Hermawan, Alessio Bucaioni, Eduard Enoiu, Wasif Afzal
2025 J jnl
Softw. Qual. J.
Sahar Tahvili, Leo Hatvani, Michael Felderer, Francisco Gomes de Oliveira Neto, Wasif Afzal, Robert Feldt
2025 conf
CSEE&T
Ayodele A. Barrett, Eduard Paul Enoiu, Wasif Afzal
2025 C conf
ICTSS
Aleksandra Nicaj, Daniel Flemström, Eduard Paul Enoiu, Wasif Afzal
2025 B conf
COMPSAC
Mikael Ebrahimi Salari, Eduard Paul Enoiu, Alessio Bucaioni, Wasif Afzal, Cristina Seceleanu
2024 J jnl
Inf. Softw. Technol.
Affan Yasin, Rubia Fatima, Jiangbin Zheng, Wasif Afzal, Shahid Raza
2024 conf
ICSTW
Muhammad Nouman Zafar, Wasif Afzal, Eduard Paul Enoiu, Zulqarnain Haider, Inderjeet Singh
2024 Misc conf
SAC
Eric Felding, Per Erik Strandberg, Nils-Hassan Quttineh, Wasif Afzal
2023 B conf
ENASE
Muhammad Nouman Zafar, Wasif Afzal, Eduard Paul Enoiu
2023 conf
ICSTW
Mikael Ebrahimi Salari, Eduard Paul Enoiu, Wasif Afzal, Cristina Seceleanu
2023 C conf
APSEC
Mikael Ebrahimi Salari, Eduard Paul Enoiu, Cristina Seceleanu, Wasif Afzal, Filip Sebek
2023 C conf
DSD
Aitor Arrieta, Goiuria Sagardui, Aitor Agirre, Wasif Afzal, Shaukat Ali
2023 conf
ICSTW
Ayodele A. Barrett, Eduard Paul Enoiu, Wasif Afzal
2023 Misc conf
SAC
Mikael Ebrahimi Salari, Eduard Paul Enoiu, Wasif Afzal, Cristina Seceleanu
2023 J jnl
Inf. Softw. Technol.
Rubia Fatima, Affan Yasin, Lin Liu, Jianmin Wang, Wasif Afzal
2023 J jnl
Microprocess. Microsystems
Mehrdad Saadatmand, Muhammad Abbas, Eduard Paul Enoiu, Bernd-Holger Schlingloff, Wasif Afzal, Benedikt Dornauer, Michael Felderer
2022 conf
A-TEST@ESEC/SIGSOFT FSE
Viktor Aronsson Karlsson, Ahmed Almasri, Eduard Paul Enoiu, Wasif Afzal, Peter Charbachi
2022 conf
ICST Workshops
Mikael Ebrahimi Salari, Eduard Paul Enoiu, Wasif Afzal, Cristina Seceleanu
2022 C conf
AST
Muhammad Nouman Zafar, Wasif Afzal, Eduard Enoiu
2022 J jnl
IEEE Access
Daniel Brahneborg, Romaric Duvignau, Wasif Afzal, Saad Mubeen
2022 J jnl
Appl. Intell.
Gul Jabeen, Sabit Rahim, Wasif Afzal, Dawar Khan, Aftab Ahmed Khan, Zahid Hussain, Tehmina Bibi
2022 J jnl
PeerJ Comput. Sci.
Jonathan Thörn, Per Erik Strandberg, Daniel Sundmark, Wasif Afzal
2022 C conf
ICSOFT
Daniel Brahneborg, Wasif Afzal, Saad Mubeen
2022 C conf
DSD
Mehrdad Saadatmand, Eduard Paul Enoiu, Holger Schlingloff, Michael Felderer, Wasif Afzal
2022 J jnl
Int. J. Softw. Tools Technol. Transf.
Per Erik Strandberg, Wasif Afzal, Daniel Sundmark
2022 conf
SWQD
Daniel Flemström, Wasif Afzal, Eduard Paul Enoiu
2022 conf
REFSQ Workshops
Aleksandar Bajceta, Miguel Leon, Wasif Afzal, Pernilla Lindberg, Markus Bohlin
2021 conf
ICST Workshops
Muhammad Nouman Zafar, Wasif Afzal, Eduard Paul Enoiu, Athanasios Stratis, Ola Sellin
2021 J jnl
CoRR
Iram Arshad, Saeed Hamood Alsamhi, Wasif Afzal
2021 conf
MECO
Wasif Afzal, Amirali Piadehbasmenj
2021 A conf
ICST
Daniel Flemström, Henrik Jonsson, Eduard Paul Enoiu, Wasif Afzal
2021 conf
ISEC
Muhammad Nouman Zafar, Wasif Afzal, Eduard Enoiu, Athanasios Stratis, Aitor Arrieta, Goiuria Sagardui
2021 conf
A-TEST@ESEC/SIGSOFT FSE
Muhammad Nouman Zafar, Wasif Afzal, Eduard Enoiu
2020 conf
ICSA Companion
Daniel Brahneborg, Wasif Afzal
2020 J jnl
Eng. Appl. Artif. Intell.
Sahar Tahvili, Leo Hatvani, Enislay Ramentol, Rita Pimentel, Wasif Afzal, Francisco Herrera
2020 J jnl
CoRR
Bestoun S. Ahmed, Eduard Enoiu, Wasif Afzal, Kamal Z. Zamli
2020 J jnl
Soft Comput.
Bestoun S. Ahmed, Eduard Enoiu, Wasif Afzal, Kamal Z. Zamli
2020 J jnl
CoRR
Adnan Iftekhar, Xiaohui Cui, Mir Hassan, Wasif Afzal
2020 conf
SPLC (A)
Damir Bilic, Jan Carlson, Daniel Sundmark, Wasif Afzal, Peter Wallin
2020 J jnl
CoRR
Per Erik Strandberg, Thomas J. Ostrand, Elaine J. Weyuker, Wasif Afzal, Daniel Sundmark
2020 A conf
ISSTA
Per Erik Strandberg, Thomas J. Ostrand, Elaine J. Weyuker, Wasif Afzal, Daniel Sundmark
2020 J jnl
IEEE Access
Affan Yasin, Rubia Fatima, Lijie Wen, Wasif Afzal, Muhammad Azhar, Richard Torkar
2020 C conf
ICSOFT
Daniel Brahneborg, Wasif Afzal, Adnan Causevic, Mats Björkman
2020 conf
ISEC
Damir Bilic, Daniel Sundmark, Wasif Afzal, Peter Wallin, Adnan Causevic, Christoffer Amlinger, Dani Barkah
2020 A conf
RE
Jon Ayerdi, Aitor Gartziandia, Aitor Arrieta, Wasif Afzal, Eduard Enoiu, Aitor Agirre, Goiuria Sagardui, Maite Arratibel, Ola Sellin
2020 J jnl
CoRR
Vahid Garousi, Wasif Afzal, Adem Çaglar, Ihsan Berk Isik, Berker Baydan, Seçkin Çaylak, Ahmet Zeki Boyraz, Burak Yolaçan, Kadir Herkiloglu
2019 J jnl
Softw. Test. Verification Reliab.
Gul Jabeen, Ping Luo, Wasif Afzal
2019 conf
AITest
Sahar Tahvili, Leo Hatvani, Michael Felderer, Wasif Afzal, Markus Bohlin
2019 J jnl
IET Softw.
Rubia Fatima, Affan Yasin, Lin Liu, Jianmin Wang, Wasif Afzal, Atif Yasin
2019 J jnl
IEEE Access
Per Erik Strandberg, Eduard Paul Enoiu, Wasif Afzal, Daniel Sundmark, Robert Feldt
2019 conf
TOOLS
Andrey Sadovykh, Dragos Truscan, Wasif Afzal, Hugo Bruneliere, Adnan Ashraf, Abel Gómez, Alexandra Espinosa Hortelano, Gunnar Widforss, Pierluigi Pierini, Elizabeta Fourneret, Alessandra Bagnato
2019 conf
ICST Workshops
Miraldi Fifo, Eduard Enoiu, Wasif Afzal
2019 J jnl
Microprocess. Microsystems
Andrey Sadovykh, Wasif Afzal, Dragos Truscan, Pierluigi Pierini, Hugo Bruneliere, Alessandra Bagnato, Abel Gómez, Jordi Cabot, Orlando Avila-García
2019 A conf
DATE
Andrey Sadovykh, Dragos Truscan, Pierluigi Pierini, Gunnar Widforss, Adnan Ashraf, Hugo Bruneliere, Pavel Smrz, Alessandra Bagnato, Wasif Afzal, Alexandra Espinosa Hortelano
2019 J jnl
J. Inf. Secur. Appl.
Rubia Fatima, Affan Yasin, Lin Liu, Jianmin Wang, Wasif Afzal, Awaid Yasin
2019 J jnl
IEEE Access
Sahar Tahvili, Rita Pimentel, Wasif Afzal, Marcus Ahlberg, Eric Fornander, Markus Bohlin
2018 conf
SEDA
Andrey Sadovykh, Alessandra Bagnato, Dragos Truscan, Pierluigi Pierini, Hugo Bruneliere, Abel Gómez, Jordi Cabot, Orlando Avila-García, Wasif Afzal
2018 A conf
ISSTA
Per Erik Strandberg, Thomas J. Ostrand, Elaine J. Weyuker, Daniel Sundmark, Wasif Afzal
2018 conf
RET@ICSE
Sahar Tahvili, Leo Hatvani, Michael Felderer, Wasif Afzal, Mehrdad Saadatmand, Markus Bohlin
2018 A conf
ESEM
Per Erik Strandberg, Wasif Afzal, Daniel Sundmark
2018 J jnl
J. Syst. Softw.
Sahar Tahvili, Wasif Afzal, Mehrdad Saadatmand, Markus Bohlin, Sharvathul Hasan Ameerjan
2018 C conf
QRS
Daniel Flemström, Eduard Enoiu, Wasif Afzal, Daniel Sundmark, Thomas Gustafsson, Avenir Kobetski
2018 conf
QRS Companion
Sahar Tahvili, Marcus Ahlberg, Eric Fornander, Wasif Afzal, Mehrdad Saadatmand, Markus Bohlin, Mahdi Sarabi
2018 J jnl
CoRR
Kamal Z. Zamli, Bestoun S. Ahmed, Thair Mahmoud, Wasif Afzal
2018 J jnl
CoRR
Bestoun S. Ahmed, Luca Maria Gambardella, Wasif Afzal, Kamal Z. Zamli
2018 conf
SPLC (2)
Damir Bilic, Daniel Sundmark, Wasif Afzal, Peter Wallin, Adnan Causevic, Christoffer Amlinger
2018 B conf
ICPE
Daniel Brahneborg, Wasif Afzal, Adnan Causevic, Daniel Sundmark, Mats Björkman
2018 J jnl
Softw. Qual. J.
Daniel Flemström, Pasqualina Potena, Daniel Sundmark, Wasif Afzal, Markus Bohlin
2018 J jnl
Microprocess. Microsystems
Wasif Afzal, Hugo Bruneliere, Davide Di Ruscio, Andrey Sadovykh, Silvia Mazzini, Eric Cariou, Dragos Truscan, Jordi Cabot, Abel Gómez, Jesús Gorroñogoitia, Luigi Pomante, Pavel Smrz
2018 conf
QRS Companion
Nils Müllner, Wasif Afzal
2018 conf
ApPLIED@PODC
Daniel Brahneborg, Wasif Afzal, Adnan Causevic, Mats Björkman
2017 J jnl
Softw. Qual. J.
Sara Abbaspour Asadollah, Daniel Sundmark, Sigrid Eldh, Hans Hansson, Wasif Afzal
2017 conf
QRS Companion
Daniel Brahneborg, Wasif Afzal, Adnan Causevic
2017 conf
QRS Companion
Daniel Brahneborg, Wasif Afzal, Adnan Causevic
2017 J jnl
IEEE Softw.
Per Erik Strandberg, Wasif Afzal, Thomas J. Ostrand, Elaine J. Weyuker, Daniel Sundmark
2017 conf
A-TEST@ESEC/SIGSOFT FSE
Vahid Garousi, Wasif Afzal, Adem Çaglar, Ihsan Berk Isik, Berker Baydan, Seçkin Çaylak, Ahmet Zeki Boyraz, Burak Yolaçan, Kadir Herkiloglu
2017 J jnl
IEEE Access
Bestoun S. Ahmed, Kamal Z. Zamli, Wasif Afzal, Miroslav Bures
2017 J jnl
Inf. Softw. Technol.
Bestoun S. Ahmed, Luca Maria Gambardella, Wasif Afzal, Kamal Z. Zamli
2017 conf
QRS Companion
Biljana Stanic, Wasif Afzal
2017 conf
ICST Workshops
Nils Müllner, Saifullah Khan, Md. Habibur Rahman, Wasif Afzal, Mehrdad Saadatmand
2017 C conf
DSD
Wasif Afzal, Hugo Bruneliere, Davide Di Ruscio, Andrey Sadovykh, Silvia Mazzini, Eric Cariou, Dragos Truscan, Jordi Cabot, Daniel Field, Luigi Pomante, Pavel Smrz
2017 B conf
SEAA
Sahar Tahvili, Mehrdad Saadatmand, Markus Bohlin, Wasif Afzal, Sharvathul Hasan Ameerjan
2016 A conf
EASE
Mohsin Irshad, Richard Torkar, Kai Petersen, Wasif Afzal
2016 B conf
PROFES
Sahar Tahvili, Markus Bohlin, Mehrdad Saadatmand, Stig Larsson, Wasif Afzal, Daniel Sundmark
2016 conf
ICST Workshops
Sahar Tahvili, Mehrdad Saadatmand, Stig Larsson, Wasif Afzal, Markus Bohlin, Daniel Sundmark
2016 A conf
ISSRE
Per Erik Strandberg, Daniel Sundmark, Wasif Afzal, Thomas J. Ostrand, Elaine J. Weyuker
2016 B conf
SEAA
Daniel Flemström, Wasif Afzal, Daniel Sundmark
2016 J jnl
Appl. Soft Comput.
Shariq Bashir, Wasif Afzal, Abdul Rauf Baig
2016 J jnl
J. Syst. Softw.
Wasif Afzal, Snehal Alone, Kerstin Glocksien, Richard Torkar
2016 Misc conf
SAC
Mohammad Mahdi Hassan, Wasif Afzal, Birgitta Lindström, Syed Muhammad Ali Shah, Sten F. Andler, Martin Blom
2016 ch.
Computational Intelligence and Quantitative Software Engineering
Wasif Afzal, Richard Torkar
2015 J jnl
Empir. Softw. Eng.
Wasif Afzal, Ahmad Nauman Ghazi, Juha Itkonen, Richard Torkar, Anneliese Amschler Andrews, Khurram Bhatti
2015 conf
EUROMICRO-SEAA
Mohammad Mahdi Hassan, Wasif Afzal, Martin Blom, Birgitta Lindström, Sten F. Andler, Sigrid Eldh
2015 conf
EUROMICRO-SEAA
Daniel Flemström, Daniel Sundmark, Wasif Afzal
2014 J jnl
Softw. Qual. J.
Wasif Afzal, Richard Torkar, Robert Feldt, Tony Gorschek
2014 C conf
ICTSS
Kivanc Doganay, Sigrid Eldh, Wasif Afzal, Markus Bohlin
2013 J jnl
Int. J. Inf. Manag.
Srinivas Nidhra, Muralidhar Yanamadala, Wasif Afzal, Richard Torkar
2012 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Wasif Afzal, Richard Torkar, Robert Feldt
2011 J jnl
Expert Syst. Appl.
Wasif Afzal, Richard Torkar
2011
Wasif Afzal
2010 C conf
APSEC
Wasif Afzal
2009 J jnl
Inf. Softw. Technol.
Wasif Afzal, Richard Torkar, Robert Feldt
2008 C conf
ICSEA
Wasif Afzal, Richard Torkar
2008 C conf
SEKE
Wasif Afzal, Richard Torkar, Robert Feldt
2008 conf
ICST Workshops
Wasif Afzal, Richard Torkar
2008 conf
ICST Workshops
Robert Feldt, Richard Torkar, Tony Gorschek, Wasif Afzal
tests/integration/test_elf_extractors.py
← Index tests/integration/test_elf_extractors.py python
"""
Integration tests for ELF-specific extractors.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

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


# ============================================================================
# ELFFeaturesExtractor Tests
# ============================================================================

class TestELFFeaturesExtractor:
    """Tests for ELFFeaturesExtractor class."""

    def test_extract_valid_elf(self, elf_binary_path, mock_logger):
        """Test extracting features from valid ELF file."""
        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)

    def test_extract_header_data(self, elf_binary_path, mock_logger):
        """Test ELF header data extraction."""
        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.extract()

            assert result is not None
            # Check header fields
            assert isinstance(result.ei_class, int)
            assert isinstance(result.ei_data, int)
            assert isinstance(result.e_type, int)
            assert isinstance(result.e_machine, int)
            assert isinstance(result.e_entry, int)

    def test_extract_human_readable_strings(self, elf_binary_path, mock_logger):
        """Test human-readable string fields."""
        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.extract()

            assert result is not None
            assert result.ei_class_str in ['32-bit', '64-bit', 'unknown']
            assert result.ei_data_str in ['Little-endian', 'Big-endian', 'unknown']
            assert result.e_type_str is not None
            assert result.e_machine_str is not None

    def test_extract_security_properties(self, elf_binary_path, mock_logger):
        """Test security property extraction."""
        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.extract()

            assert result is not None
            # Security flags should be 0 or 1
            assert result.is_pie in [0, 1]
            assert result.has_canary in [0, 1]
            assert result.has_nx in [0, 1]
            assert result.has_relro in [0, 1]
            assert result.has_fortify in [0, 1]

    def test_extract_counts(self, elf_binary_path, mock_logger):
        """Test section/segment/symbol counts."""
        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.extract()

            assert result is not None
            assert result.number_of_segments >= 0
            assert result.number_of_sections >= 0
            assert result.number_of_symbols >= 0
            assert result.number_of_dynamic_symbols >= 0
            assert result.number_of_relocations >= 0
            assert result.number_of_dependencies >= 0

    def test_extract_build_info(self, elf_binary_path, mock_logger):
        """Test build information extraction."""
        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.extract()

            assert result is not None
            # Build ID may or may not be present
            if result.build_id is not None:
                assert isinstance(result.build_id, str)
            assert result.gnu_hash_present in [0, 1]
            assert result.has_debug_info in [0, 1]

    def test_extract_invalid_elf(self, pe_binary_path, mock_logger):
        """Test extraction 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)

            result = extractor.extract()

            # Should return None for invalid ELF
            assert result is None


# ============================================================================
# ELFSectionExtractor Tests
# ============================================================================

class TestELFSectionExtractor:
    """Tests for ELFSectionExtractor class."""

    def test_extract_sections(self, elf_binary_path, mock_logger):
        """Test section extraction."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, list)
            assert len(result) > 0

    def test_section_properties(self, elf_binary_path, mock_logger):
        """Test section property extraction."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor
        from redb.models.dataclasses import ELFSection

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                section = result[0]
                assert isinstance(section, ELFSection)
                assert section.section_name is not None
                assert isinstance(section.section_type, int)
                assert isinstance(section.section_flags, int)
                assert section.section_entropy >= 0

    def test_section_hashes(self, elf_binary_path, mock_logger):
        """Test section hash computation."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                for section in result:
                    if section.section_sha256:
                        assert len(section.section_sha256) == 64
                    if section.section_md5:
                        assert len(section.section_md5) == 32


# ============================================================================
# ELFSegmentExtractor Tests
# ============================================================================

class TestELFSegmentExtractor:
    """Tests for ELFSegmentExtractor class."""

    def test_extract_segments(self, elf_binary_path, mock_logger):
        """Test segment extraction."""
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

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

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, list)

    def test_segment_properties(self, elf_binary_path, mock_logger):
        """Test segment property extraction."""
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor
        from redb.models.dataclasses import ELFSegment

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                segment = result[0]
                assert isinstance(segment, ELFSegment)
                assert isinstance(segment.segment_type, int)
                assert isinstance(segment.segment_flags, int)


# ============================================================================
# ELFSymbolExtractor Tests
# ============================================================================

class TestELFSymbolExtractor:
    """Tests for ELFSymbolExtractor class."""

    def test_extract_symbols(self, elf_binary_path, mock_logger):
        """Test symbol extraction."""
        from redb.extractors.elf_extractors.elf_symbols import ELFSymbolExtractor

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

            result = extractor.extract()

            # May be None if stripped
            if result is not None:
                assert isinstance(result, list)

    def test_symbol_properties(self, elf_binary_path, mock_logger):
        """Test symbol property extraction."""
        from redb.extractors.elf_extractors.elf_symbols import ELFSymbolExtractor
        from redb.models.dataclasses import ELFSymbol

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                symbol = result[0]
                assert isinstance(symbol, ELFSymbol)
                assert symbol.symbol_name is not None
                assert isinstance(symbol.symbol_type, int)
                assert isinstance(symbol.symbol_bind, int)


# ============================================================================
# ELFImportExtractor Tests
# ============================================================================

class TestELFImportExtractor:
    """Tests for ELFImportExtractor class."""

    def test_extract_imports(self, elf_binary_path, mock_logger):
        """Test import extraction."""
        from redb.extractors.elf_extractors.elf_imports import ELFImportExtractor

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

            result = extractor.extract()

            # May be None if no imports
            if result is not None:
                assert hasattr(result, 'elf_imports_total')

    def test_import_functions(self, elf_binary_path, mock_logger):
        """Test import function extraction."""
        from redb.extractors.elf_extractors.elf_imports import ELFImportExtractor
        from redb.models.dataclasses import ELFImport

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

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, ELFImport)
                assert isinstance(result.elf_imports_total, int)


# ============================================================================
# ELFExportExtractor Tests
# ============================================================================

class TestELFExportExtractor:
    """Tests for ELFExportExtractor class."""

    def test_extract_exports(self, elf_binary_path, mock_logger):
        """Test export extraction."""
        from redb.extractors.elf_extractors.elf_exports import ELFExportExtractor

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

            result = extractor.extract()

            # May be None if no exports
            if result is not None:
                assert hasattr(result, 'elf_exports_total')

    def test_export_functions(self, elf_binary_path, mock_logger):
        """Test export function extraction."""
        from redb.extractors.elf_extractors.elf_exports import ELFExportExtractor
        from redb.models.dataclasses import ELFExport

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

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, ELFExport)


# ============================================================================
# ELFDependencyExtractor Tests
# ============================================================================

class TestELFDependencyExtractor:
    """Tests for ELFDependencyExtractor class."""

    def test_extract_dependencies(self, elf_binary_path, mock_logger):
        """Test dependency extraction."""
        from redb.extractors.elf_extractors.elf_dependencies import ELFDependencyExtractor

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

            result = extractor.extract()

            # May be None if no dependencies
            if result is not None:
                assert isinstance(result, list)

    def test_dependency_properties(self, elf_binary_path, mock_logger):
        """Test dependency property extraction."""
        from redb.extractors.elf_extractors.elf_dependencies import ELFDependencyExtractor
        from redb.models.dataclasses import ELFDependency

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                dep = result[0]
                assert isinstance(dep, ELFDependency)
                assert dep.dependency_name is not None


# ============================================================================
# ELFRelocationExtractor Tests
# ============================================================================

class TestELFRelocationExtractor:
    """Tests for ELFRelocationExtractor class."""

    def test_extract_relocations(self, elf_binary_path, mock_logger):
        """Test relocation extraction."""
        from redb.extractors.elf_extractors.elf_relocations import ELFRelocationExtractor

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

            result = extractor.extract()

            # May be None if no relocations
            if result is not None:
                assert isinstance(result, list)

    def test_relocation_properties(self, elf_binary_path, mock_logger):
        """Test relocation property extraction."""
        from redb.extractors.elf_extractors.elf_relocations import ELFRelocationExtractor
        from redb.models.dataclasses import ELFRelocation

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                reloc = result[0]
                assert isinstance(reloc, ELFRelocation)
                assert isinstance(reloc.relocation_offset, int)
                assert isinstance(reloc.relocation_type, int)


# ============================================================================
# ELFNotesExtractor Tests
# ============================================================================

class TestELFNotesExtractor:
    """Tests for ELFNotesExtractor class."""

    def test_extract_notes(self, elf_binary_path, mock_logger):
        """Test notes extraction."""
        from redb.extractors.elf_extractors.elf_notes import ELFNotesExtractor

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

            result = extractor.extract()

            # May be None if no notes
            if result is not None:
                assert isinstance(result, list)

    def test_note_properties(self, elf_binary_path, mock_logger):
        """Test note property extraction."""
        from redb.extractors.elf_extractors.elf_notes import ELFNotesExtractor
        from redb.models.dataclasses import ELFNote

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                note = result[0]
                assert isinstance(note, ELFNote)
                assert note.note_name is not None
                assert isinstance(note.note_type, int)


# ============================================================================
# Integration Tests
# ============================================================================

class TestELFExtractorIntegration:
    """Integration tests for ELF extractors."""

    def test_all_extractors_valid_elf(self, elf_binary_path, mock_logger):
        """Test all ELF extractors with valid ELF file."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            features_ext = ELFFeaturesExtractor(elf_binary_path, mock_logger)
            sections_ext = ELFSectionExtractor(elf_binary_path, mock_logger)
            segments_ext = ELFSegmentExtractor(elf_binary_path, mock_logger)

            features_result = features_ext.extract()
            sections_result = sections_ext.extract()
            segments_result = segments_ext.extract()

            # All should extract something
            assert features_result is not None
            assert sections_result is not None
            assert segments_result is not None

    def test_hash_consistency_across_extractors(self, elf_binary_path, mock_logger):
        """Test that hashes are consistent across all extractors."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            # Hashes should be the same
            assert features_ext.sha256 == sections_ext.sha256
            assert features_ext.md5 == sections_ext.md5
            assert features_ext.sha1 == sections_ext.sha1

    def test_clickhouse_tables_unique(self, elf_binary_path, mock_logger):
        """Test that each extractor has a unique ClickHouse table."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            features_ext = ELFFeaturesExtractor(elf_binary_path, mock_logger)
            sections_ext = ELFSectionExtractor(elf_binary_path, mock_logger)
            segments_ext = ELFSegmentExtractor(elf_binary_path, mock_logger)

            tables = {
                features_ext.get_clickhouse_table(),
                sections_ext.get_clickhouse_table(),
                segments_ext.get_clickhouse_table(),
            }

            # All tables should be unique
            assert len(tables) == 3


# ============================================================================
# Advanced Binary Tests
# ============================================================================

class TestELFAdvancedBinary:
    """Tests using the hello_advanced binary."""

    def test_advanced_features_extraction(self, elf_advanced_binary_path, mock_logger):
        """Test feature extraction from 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)

            result = extractor.extract()

            assert result is not None
            assert result.number_of_sections > 0

    def test_advanced_sections_extraction(self, elf_advanced_binary_path, mock_logger):
        """Test section extraction from advanced ELF binary."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            result = extractor.extract()

            assert result is not None
            assert len(result) > 0

            # Check for common ELF sections
            section_names = [s.section_name for s in result]
            # Most ELF files have .text section
            assert any('.text' in name for name in section_names)

    def test_advanced_segments_extraction(self, elf_advanced_binary_path, mock_logger):
        """Test segment extraction from advanced ELF binary."""
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

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

            result = extractor.extract()

            assert result is not None
            assert len(result) > 0


# ============================================================================
# Export Data Tests
# ============================================================================

class TestELFExtractorExportData:
    """Tests for export data preparation."""

    def test_features_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test ClickHouse export preparation for features."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor.prepare_export_data("ClickHouseExporter")

            assert result is not None
            data, column_names, column_type_names = result

            assert 'sha256' in column_names
            assert 'ei_class' in column_names
            assert 'e_machine' in column_names
            assert 'is_pie' in column_names

    def test_sections_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test ClickHouse export preparation for sections."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'section_name' in column_names
                assert 'section_entropy' in column_names

    def test_segments_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test ClickHouse export preparation for segments."""
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

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

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'segment_type' in column_names