Ralph-Johan Back

103 papers A* 6B 9C 8Misc 1Journal 42Unranked 32
YearRankTypeTitle / Venue / Authors
2018 B conf
IFM
Johannes Eriksson, Masoumeh Parsa, Ralph-Johan Back
2015 J jnl
J. Log. Algebraic Methods Program.
Viorel Preoteasa, Ralph-Johan Back, Johannes Eriksson
2014 B conf
IFM
Johannes Eriksson, Masoumeh Parsa, Ralph-Johan Back
2012 B conf
ENASE
Mikolaj Olszewski, Ralph-Johan Back
2012 J jnl
Formal Aspects Comput.
Viorel Preoteasa, Ralph-Johan Back
2012 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Eugen Czeizler, Andrzej Mizera, Elena Czeizler, Ralph-Johan Back, John E. Eriksson, Ion Petre
2011 J jnl
Nat. Comput.
Ion Petre, Andrzej Mizera, Claire L. Hyder, Annika Meinander, Andrey Mikhailov, Richard I. Morimoto, Lea Sistonen, John E. Eriksson, Ralph-Johan Back
2011 conf
ThEdu
Ralph-Johan Back, Johannes Eriksson
2011 ed.
ThEdu
Pedro Quaresma, Ralph-Johan Back
2011 Misc conf
SAC
Ralph-Johan Back, Viorel Preoteasa
2011 ed.
Trans. Computational Systems Biology
Corrado Priami, Ralph-Johan Back, Ion Petre, Erik P. de Vink
2010 C conf
ICFEM
Johannes Eriksson, Ralph-Johan Back
2010 J jnl
Arch. Formal Proofs
Viorel Preoteasa, Ralph-Johan Back
2010 J jnl
Formal Aspects Comput.
Ralph-Johan Back
2010 J jnl
Arch. Formal Proofs
Viorel Preoteasa, Ralph-Johan Back
2009 conf
Algorithmic Bioprocesses
Ion Petre, Andrzej Mizera, Claire L. Hyder, Andrey Mikhailov, John E. Eriksson, Lea Sistonen, Ralph-Johan Back
2009 C conf
CiE
Ion Petre, Andrzej Mizera, Ralph-Johan Back
2009 conf
CMSB
Elena Czeizler, Eugen Czeizler, Ralph-Johan Back, Ion Petre
2009 conf
REFINE@FMWeek
Viorel Preoteasa, Ralph-Johan Back
2009 J jnl
Formal Aspects Comput.
Ralph-Johan Back
2009 ed.
COMPMOD
Ralph-Johan Back, Ion Petre, Erik P. de Vink
2009 ed.
Trans. Computational Systems Biology
Corrado Priami, Ralph-Johan Back, Ion Petre
2008 J jnl
Simul. Model. Pract. Theory
Mauno Rönkkö, Marina Waldén, Ralph-Johan Back
2008 conf
UTP
Ralph-Johan Back
2007 C conf
TAP
Ralph-Johan Back, Johannes Eriksson, Magnus Myreen
2006 conf
AMAST
Ralph-Johan Back
2006 conf
ICATPN
Ralph-Johan Back
2005 J jnl
Formal Aspects Comput.
Ralph-Johan Back, Viorel Preoteasa
2005 B conf
PROFES
Ralph-Johan Back, Luka Milovanov, Ivan Porres
2005 C conf
APSEC
Ralph-Johan Back, Magnus Myreen
2005 conf
RISE
Ralph-Johan Back, Johannes Eriksson, Luka Milovanov
2004 conf
ECBS
Ralph-Johan Back, Cristina Cerschi Seceleanu
2004 conf
EUROMICRO
Ralph-Johan Back, Piia Hirkman, Luka Milovanov
2003 conf
UML
Ralph-Johan Back, Dag Björklund, Johan Lilius, Luka Milovanov, Ivan Porres
2003 J jnl
Formal Aspects Comput.
Ralph-Johan Back, Joakim von Wright
2003 C conf
APSEC
Ralph-Johan Back, Xiaocong Fan, Viorel Preoteasa
2003 conf
MERLIN
Ralph-Johan Back, Viorel Preoteasa
2002 conf
Refine
Ralph-Johan Back, Joakim von Wright
2002 C conf
ICFEM
Ralph-Johan Back
2002 conf
ZB
Ralph-Johan Back
2002 C conf
APSEC
Ralph-Johan Back, Cristina Cerschi Seceleanu, Jan Westerholm
2001 J jnl
Nord. J. Comput.
Ralph-Johan Back, Luigia Petre, Ivan Porres
2000 J jnl
Formal Aspects Comput.
Ralph-Johan Back, Anna Mikhajlova, Joakim von Wright
2000 J jnl
Inf. Comput.
Ralph-Johan Back, Joakim von Wright
2000 J jnl
Formal Aspects Comput.
Ralph-Johan Back, Joakim von Wright
2000 conf
FTRTFT
Ralph-Johan Back, Luigia Petre, Ivan Porres
1999 conf
UML
Luigia Petre, Ralph-Johan Back, Ivan Paltor
1999 conf
World Congress on Formal Methods
Martin Büchi, Ralph-Johan Back
1999 conf
World Congress on Formal Methods
Ralph-Johan Back, Anna Mikhajlova, Joakim von Wright
1999 J jnl
Acta Informatica
Ralph-Johan Back, Joakim von Wright
1998 J jnl
Acta Informatica
Ralph-Johan Back, Michael J. Butler
1998 book
Ralph-Johan Back, Joakim von Wright
1998 J jnl
Acta Informatica
Ralph-Johan Back, Qiwen Xu
1997 conf
ARTS
Ralph-Johan Back, Martin Büchi, Emil Sekerinski
1997 conf
EXPRESS
Ralph-Johan Back, Joakim von Wright
1997 J jnl
Formal Aspects Comput.
Ralph-Johan Back, Jim Grundy, Joakim von Wright
1996 J jnl
Softw. Concepts Tools
Ralph-Johan Back, Kaisa Sere
1996 J jnl
Sci. Comput. Program.
Ralph-Johan Back, Alain J. Martin, Kaisa Sere
1996 J jnl
Formal Aspects Comput.
Ralph-Johan Back, Kaisa Sere
1995 B conf
MPC
Ralph-Johan Back, Alain J. Martin, Kaisa Sere
1995 B conf
MPC
Ralph-Johan Back, Michael J. Butler
1995 J jnl
Inf. Process. Lett.
Ralph-Johan Back, Joakim von Wright
1994 conf
PROCOMET
Ralph-Johan Back, Kaisa Sere
1994 conf
FME
Ralph-Johan Back, Kaisa Sere
1994 B conf
CONCUR
Ralph-Johan Back, Joakim von Wright
1993 J jnl
Networks
Hong Shen, Ralph-Johan Back
1993 J jnl
Sci. Comput. Program.
Ralph-Johan Back, Joakim von Wright
1992 J jnl
Theor. Comput. Sci.
Ralph-Johan Back, Joakim von Wright
1992 J jnl
Microprocess. Microprogramming
Hong Shen, Ralph-Johan Back
1992 J jnl
Formal Aspects Comput.
Nissim Francez, Ralph-Johan Back, Reino Kurki-Suonio
1992 conf
REX Workshop
Ralph-Johan Back, Joakim von Wright
1992 conf
NATO ASI PDC
Ralph-Johan Back
1992 conf
NATO ASI PDC
Ralph-Johan Back
1991 J jnl
Struct. Program.
Ralph-Johan Back, Kaisa Sere
1991 C conf
FORTE
Ralph-Johan Back, Kaisa Sere
1990 J jnl
Acta Cybern.
M. Aspnäs, Ralph-Johan Back
1990 J jnl
Acta Informatica
Ralph-Johan Back, Joakim von Wright
1990 J jnl
Microprocess. Microsystems
M. Aspnäs, Ralph-Johan Back, T.-E. Malén
1990 J jnl
Formal Aspects Comput.
Ralph-Johan Back, Joakim von Wright
1990 conf
Programming Concepts and Methods
Ralph-Johan Back, Joakim von Wright
1990 conf
Jerusalem Conference on Information Technology
Ralph-Johan Back, Reino Kurki-Suonio
1989 B conf
MPC
Ralph-Johan Back, Joakim von Wright
1989 conf
PARLE (2)
Ralph-Johan Back
1989 J jnl
Distributed Comput.
Ralph-Johan Back, Reino Kurki-Suonio
1989 conf
REX Workshop
Ralph-Johan Back, Joakim von Wright
1989 conf
REX Workshop
Ralph-Johan Back
1989 B conf
MPC
Ralph-Johan Back, Kaisa Sere
1989 J jnl
Sci. Comput. Program.
Ralph-Johan Back, Kaisa Sere
1988 J jnl
Acta Informatica
Ralph-Johan Back
1988 J jnl
ACM Trans. Program. Lang. Syst.
Ralph-Johan Back, Reino Kurki-Suonio
1988 A* conf
ICALP
Ralph-Johan Back, Reino Kurki-Suonio
1987 conf
IRTAW
Ralph-Johan Back, Reino Kurki-Suonio
1985 J jnl
Theor. Comput. Sci.
Ralph-Johan Back, Heikki Mannila
1984 J jnl
Inf. Control.
Ralph-Johan Back, Heikki Mannila
1983 J jnl
Theor. Comput. Sci.
Ralph-Johan Back
1983 A* conf
PODC
Ralph-Johan Back, Reino Kurki-Suonio
1983 A* conf
POPL
Ralph-Johan Back, Heikki Mannila, Kari-Jouko Räihä
1982 A* conf
PODC
Ralph-Johan Back, Heikki Mannila
1982 A* conf
ICALP
Ralph-Johan Back, Heikki Mannila
1981 J jnl
J. Comput. Syst. Sci.
Ralph-Johan Back
1981 J jnl
Acta Informatica
Ralph-Johan Back
1980 conf
Fachtagung über Programmiersprachen
Ralph-Johan Back
1980 A* conf
ICALP
Ralph-Johan Back
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