Vincent Guigue

86 papers A* 3A 3B 7Misc 1Journal 27Unranked 44
YearRankTypeTitle / Venue / Authors
2026 conf
ECIR (1)
Ahmed Rayane Kebir, Vincent Guigue, Lynda Said L'Hadj, Laure Soulier
2026 J jnl
CoRR
Ahmed Rayane Kebir, Vincent Guigue, Lynda Said L'Hadj, Laure Soulier
2025 J jnl
CoRR
Tanguy Herserant, Vincent Guigue
2025 conf
CORIA
Anfu Tang, Laure Soulier, Vincent Guigue
2025 A* conf
SIGIR
Anfu Tang, Laure Soulier, Vincent Guigue
2025 J jnl
CoRR
Anfu Tang, Laure Soulier, Vincent Guigue
2025 J jnl
CoRR
Julian Agudelo, Vincent Guigue, Cristina E. Manfredotti, Hadrien Piot
2025 J jnl
CoRR
Ben Kabongo, Vincent Guigue, Pirmin Lemberger
2025 conf
IC
Alexandre Combeau, Fatiha Saïs, Naggeta Kumari, Stéphane Dervaux, Cristina E. Manfredotti, Vincent Guigue, Paolo Viappiani
2025 J jnl
CoRR
Ben Kabongo, Vincent Guigue
2025 conf
CORIA
Ben Kabongo, Vincent Guigue, Pirmin Lemberger
2025 A* conf
ICLR
Song Duong, Florian Le Bronnec, Alexandre Allauzen, Vincent Guigue, Alberto Lumbreras, Laure Soulier, Patrick Gallinari
2025 J jnl
CoRR
Song Duong, Florian Le Bronnec, Alexandre Allauzen, Vincent Guigue, Alberto Lumbreras, Laure Soulier, Patrick Gallinari
2025 conf
PAKDD (5)
Tanguy Herserant, Vincent Guigue
2025 J jnl
CoRR
Tanguy Herserant, Vincent Guigue
2025 conf
CORIA
Tanguy Herserant, Vincent Guigue
2025 J jnl
CoRR
Alex-Razvan Ispas, Charles-Elie Simon, Fabien Caspani, Vincent Guigue
2025 conf
CORIA
Anne-Sophie Foussat, Vincent Guigue, Nicolas Sauvion, Robert Bossy, Claire Nédellec
2024 conf
TPDL (1)
Tristan Luiggi, Tanguy Herserant, Thong Tran, Laure Soulier, Vincent Guigue
2024 conf
TALN (2)
Florian Le Bronnec, Song Duong, Alexandre Allauzen, Vincent Guigue, Alberto Lumbreras, Laure Soulier, Patrick Gallinari
2024 conf
EACL (1)
Florian Le Bronnec, Song Duong, Mathieu Ravaut, Alexandre Allauzen, Nancy F. Chen, Vincent Guigue, Alberto Lumbreras, Laure Soulier, Patrick Gallinari
2024 J jnl
CoRR
Florian Le Bronnec, Song Duong, Mathieu Ravaut, Alexandre Allauzen, Nancy F. Chen, Vincent Guigue, Alberto Lumbreras, Laure Soulier, Patrick Gallinari
2024 conf
EGC
Noémie Jacquet, Vincent Guigue, Cristina E. Manfredotti, Fatiha Saïs, Stéphane Dervaux, Paolo Viappiani
2024 conf
ECIR (3)
Pierre Erbacher, Louis Falissard, Vincent Guigue, Laure Soulier
2024 J jnl
CoRR
Pierre Erbacher, Louis Falissard, Vincent Guigue, Laure Soulier
2024 conf
CORIA
Pierre Erbacher, Louis Falissard, Vincent Guigue, Laure Soulier
2024 conf
CORIA
Tanguy Herserant, Tristan Luiggi, Thong Tran, Vincent Guigue, Laure Soulier
2024 J jnl
Trans. Mach. Learn. Res.
Etienne Le Naour, Louis Serrano, Léon Migus, Yuan Yin, Ghislain Agoua, Nicolas Baskiotis, Patrick Gallinari, Vincent Guigue
2023 conf
CORIA-TALN
Louis Falissard, Vincent Guigue, Laure Soulier
2023 Misc conf
SAC
Tristan Luiggi, Vincent Guigue, Laure Soulier, Siwar Jendoubi, Aurélien Baelde
2023 J jnl
CoRR
Tristan Luiggi, Laure Soulier, Vincent Guigue, Siwar Jendoubi, Aurélien Baelde
2023 conf
CORIA-TALN
Maya Sahraoui, Vincent Guigue, Régine Vignes-Lebbe, Marc Pignal
2023 J jnl
CoRR
Louis Falissard, Vincent Guigue, Laure Soulier
2023 conf
EMNLP (Findings)
Louis Falissard, Vincent Guigue, Laure Soulier
2023 B conf
DSAA
Etienne Le Naour, Ghislain Agoua, Nicolas Baskiotis, Vincent Guigue
2023 J jnl
CoRR
Etienne Le Naour, Ghislain Agoua, Nicolas Baskiotis, Vincent Guigue
2023 conf
CORIA-TALN
Sarah Abchiche, Lynda Said L'Hadj, Vincent Guigue, Laure Soulier
2023 A conf
RecSys
Darius Afchar, Romain Hennequin, Vincent Guigue
2023 J jnl
CoRR
Darius Afchar, Romain Hennequin, Vincent Guigue
2023 J jnl
CoRR
Etienne Le Naour, Louis Serrano, Léon Migus, Yuan Yin, Ghislain Agoua, Nicolas Baskiotis, Patrick Gallinari, Vincent Guigue
2022 conf
ISMIR
Darius Afchar, Romain Hennequin, Vincent Guigue
2022 J jnl
CoRR
Darius Afchar, Romain Hennequin, Vincent Guigue
2021 book
Vincent Guigue
2021 conf
EMNLP (1)
Bruno Taillé, Vincent Guigue, Geoffrey Scoutheeten, Patrick Gallinari
2021 J jnl
CoRR
Bruno Taillé, Vincent Guigue, Geoffrey Scoutheeten, Patrick Gallinari
2021 A* conf
ICML
Darius Afchar, Vincent Guigue, Romain Hennequin
2021 J jnl
CoRR
Darius Afchar, Romain Hennequin, Vincent Guigue
2020 conf
ECIR (2)
Bruno Taillé, Vincent Guigue, Patrick Gallinari
2020 J jnl
CoRR
Bruno Taillé, Vincent Guigue, Patrick Gallinari
2020 conf
EMNLP (1)
Bruno Taillé, Vincent Guigue, Geoffrey Scoutheeten, Patrick Gallinari
2020 J jnl
CoRR
Bruno Taillé, Vincent Guigue, Geoffrey Scoutheeten, Patrick Gallinari
2020 conf
CIRCLE
Clara Gainon de Forsan de Gabriac, Amina Djelloul, Constance Scherer, Vincent Guigue, Patrick Gallinari
2020 B conf
ESANN
Clara Gainon de Forsan de Gabriac, Constance Scherer, Amina Djelloul, Vincent Guigue, Patrick Gallinari
2020 B conf
ESANN
Perrine Cribier-Delande, Raphaël Puget, Vincent Guigue, Ludovic Denoyer
2020 conf
ITSC
Perrine Cribier-Delande, Raphaël Puget, Camille Noûs, Vincent Guigue, Ludovic Denoyer
2019 conf
ACL (1)
Étienne Simon, Vincent Guigue, Benjamin Piwowarski
2018 J jnl
Neurocomputing
Emeric Tonnelier, Nicolas Baskiotis, Vincent Guigue, Patrick Gallinari
2018 conf
CORIA-TALN-RJC (DeFT)
Charles-Emmanuel Dias, Clara Gainon de Forsan de Gabriac, Patrick Gallinari, Vincent Guigue
2018 conf
CORIA
Charles-Emmanuel Dias, Clara Gainon de Forsan de Gabriac, Vincent Guigue, Patrick Gallinari
2018 B conf
ESANN
Charles-Emmanuel Dias, Vincent Guigue, Patrick Gallinari
2017 B conf
ESANN
Emeric Tonnelier, Nicolas Baskiotis, Vincent Guigue, Patrick Gallinari
2017 conf
CORIA
Charles-Emmanuel Dias, Vincent Guigue, Patrick Gallinari
2016 conf
CORIA-CIFED
Charles-Emmanuel Dias, Vincent Guigue, Patrick Gallinari
2016 conf
ITSC
Emeric Tonnelier, Nicolas Baskiotis, Vincent Guigue, Patrick Gallinari
2016 conf
ITSC
Cynthia Delauney, Nicolas Baskiotis, Vincent Guigue
2015 B conf
ESANN
Luepol Pipanmaekaporn, Ludmilla Tajtelbom, Vincent Guigue, Thierry Artières
2015 conf
CBRecSys@RecSys
Mickaël Poussevin, Vincent Guigue, Patrick Gallinari
2015 conf
CORIA
Mickaël Poussevin, Vincent Guigue, Patrick Gallinari
2015 A conf
RecSys
Élie Guàrdia-Sebaoun, Vincent Guigue, Patrick Gallinari
2014 conf
SEFM Workshops
Debora Nozza, Daniele Maccagnola, Vincent Guigue, Enza Messina, Patrick Gallinari
2014 J jnl
CoRR
Mickaël Poussevin, Vincent Guigue, Patrick Gallinari
2014 conf
MSM/MUSE/SenseML
Mickaël Poussevin, Emeric Tonnelier, Nicolas Baskiotis, Vincent Guigue, Patrick Gallinari
2014 conf
CORIA-CIFED
Mickaël Poussevin, Élie Guàrdia-Sebaoun, Vincent Guigue, Patrick Gallinari
2013 conf
CORIA
Abdelhalim Rafrafi, Vincent Guigue, Patrick Gallinari
2013 conf
OAIR
Élie Guàrdia-Sebaoun, Abdelhalim Rafrafi, Vincent Guigue, Patrick Gallinari
2012 A conf
ICWSM
Abdelhalim Rafrafi, Vincent Guigue, Patrick Gallinari
2012 conf
CORIA
Abdelhalim Rafrafi, Vincent Guigue, Patrick Gallinari
2011 conf
CORIA
Abdelhalim Rafrafi, Vincent Guigue, Patrick Gallinari
2008 J jnl
IEEE Trans. Biomed. Eng.
Alain Rakotomamonjy, Vincent Guigue
2006 J jnl
Rev. d'Intelligence Artif.
Vincent Guigue, Alain Rakotomamonjy, Stéphane Canu
2006 J jnl
Neurocomputing
Vincent Guigue, Alain Rakotomamonjy, Stéphane Canu
2005 conf
ICANN (1)
Alain Rakotomamonjy, Vincent Guigue, Grégory Mallet, Victor Alvarado
2005 conf
CAP
Vincent Guigue, Alain Rakotomamonjy, Stéphane Canu
2005 conf
ECML
Vincent Guigue, Alain Rakotomamonjy, Stéphane Canu
2005 B conf
ESANN
Vincent Guigue, Alain Rakotomamonjy, Stéphane Canu
2001 conf
Shape Modeling International
Philippe Marin, André Meyer, Vincent Guigue
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 != ""