James Ze Wang

94 papers A* 17A 1B 7Misc 6Journal 32Unranked 25
YearRankTypeTitle / Venue / Authors
2024 J jnl
Patterns
Yimu Pan, Manas Mehta, Jeffery A. Goldstein, Joseph Ngonzi, Lisa M. Bebell, Drucilla J. Roberts, Chrystalle Katte Carreon, Kelly Gallagher, Rachel E. Walker, Alison D. Gernand, James Ze Wang
2023 conf
MICCAI (6)
Yimu Pan, Tongan Cai, Manas Mehta, Alison D. Gernand, Jeffery A. Goldstein, Leena B. Mithal, Delia Mwinyelle, Kelly Gallagher, James Ze Wang
2017 A* conf
ICML
Jianbo Ye, James Ze Wang, Jia Li
2016 J jnl
CoRR
Zihan Zhou, Siqiong He, Jia Li, James Ze Wang
2015 A* conf
ACM Multimedia
Zihan Zhou, Siqiong He, Jia Li, James Ze Wang
2015 ch.
Mobile Cloud Visual Media Computing
Jia Li, Lei Yao, James Ze Wang
2013 J jnl
IEEE Trans. Image Process.
Neela Sawant, James Ze Wang, Jia Li
2011 J jnl
IEEE Signal Process. Mag.
Dhiraj Joshi, Ritendra Datta, Elena A. Fedorovskaya, Quang-Tuan Luong, James Ze Wang, Jia Li, Jiebo Luo
2011 A* conf
ACM Multimedia
Guifang Duan, Neela Sawant, James Ze Wang, Dean R. Snow, Danni Ai, Yen-Wei Chen
2011 J jnl
Multim. Tools Appl.
Neela Sawant, Jia Li, James Ze Wang
2011 conf
ICBO
Brian A. Canada, Georgia K. Thomas, John Schleicher, James Ze Wang, Keith C. Cheng
2011 J jnl
Multim. Tools Appl.
Brian A. Canada, Georgia K. Thomas, Keith C. Cheng, James Ze Wang
2010 conf
Multimedia Information Retrieval
Ritendra Datta, James Ze Wang
2010 A* conf
ACM Multimedia
James Ze Wang, Weina Ge, Dean R. Snow, Prasenjit Mitra, C. Lee Giles
2010 ed.
Multimedia Information Retrieval
James Ze Wang, Nozha Boujemaa, Nuria Oliver Ramirez, Apostol Natsev
2010 conf
Multimedia Information Retrieval
Neela Sawant, Ritendra Datta, Jia Li, James Ze Wang
2010 A* conf
ACM Multimedia
Razvan Orendovici, James Ze Wang
2009 J jnl
Int. J. Document Anal. Recognit.
Xiaonan Lu, Saurabh Kataria, William J. Brouwer, James Ze Wang, Prasenjit Mitra, C. Lee Giles
2009 B conf
ICIP
Lei Yao, Jia Li, James Ze Wang
2009 J jnl
IEEE Trans. Inf. Forensics Secur.
Ritendra Datta, Jia Li, James Ze Wang
2008 conf
JCDL
Xiaonan Lu, Brewster Kahle, James Ze Wang, C. Lee Giles
2008 B conf
ICIP
Ritendra Datta, Jia Li, James Ze Wang
2008 B conf
ICIP
Brian A. Canada, Georgia K. Thomas, Keith C. Cheng, James Ze Wang, Yanxi Liu
2008 J jnl
ACM Comput. Surv.
Ritendra Datta, Dhiraj Joshi, Jia Li, James Ze Wang
2008 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Jia Li, James Ze Wang
2008 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
James Ze Wang, Donald Geman, Jiebo Luo, Robert M. Gray
2008 conf
CIVR
Brian A. Canada, Georgia K. Thomas, Keith C. Cheng, James Ze Wang, Yanxi Liu
2007 A conf
ICDAR
Xiaonan Lu, James Ze Wang, Prasenjit Mitra, C. Lee Giles
2007 A* conf
WWW
Xiaonan Lu, James Ze Wang, Prasenjit Mitra, C. Lee Giles
2007 J jnl
SIGMOD Rec.
James Ze Wang, Nozha Boujemaa, Yixin Chen
2007 conf
ICSC
Xiaonan Lu, James Ze Wang, C. Lee Giles
2007 A* conf
ACM Multimedia
Ritendra Datta, Jia Li, James Ze Wang
2007 ed.
Multimedia Information Retrieval
James Ze Wang, Nozha Boujemaa, Alberto Del Bimbo, Jia Li
2007 A* conf
ACM Multimedia
Ritendra Datta, Dhiraj Joshi, Jia Li, James Ze Wang
2007 J jnl
IEEE Multim.
Ritendra Datta, Weina Ge, Jia Li, James Ze Wang
2006 J jnl
IEEE Trans. Image Process.
Dhiraj Joshi, Jia Li, James Ze Wang
2006 conf
WIDM
Anuj R. Jaiswal, C. Lee Giles, Prasenjit Mitra, James Ze Wang
2006 conf
JCDL
Xiaonan Lu, Prasenjit Mitra, James Ze Wang, C. Lee Giles
2006 conf
Multimedia Information Retrieval
James Ze Wang, Nozha Boujemaa, Alberto Del Bimbo, Donald Geman, Alexander G. Hauptmann, Jelena Tesic
2006 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Yixin Chen, Jinbo Bi, James Ze Wang
2006 J jnl
Int. J. Digit. Libr.
James Ze Wang, Kurt Grieb, Ya Zhang, Ching-Chih Chen, Yixin Chen, Jia Li
2006 A* conf
VLDB
Dhiraj Joshi, Ritendra Datta, Ziming Zhuang, W. P. Weiss, Marc Friedenberg, Jia Li, James Ze Wang
2006 ed.
Multimedia Information Retrieval
James Ze Wang, Nozha Boujemaa, Yixin Chen
2006 Misc conf
AMIA
Brian A. Canada, Keith C. Cheng, James Ze Wang
2006 A* conf
ACM Multimedia
Jia Li, James Ze Wang
2006 conf
ECCV (3)
Ritendra Datta, Dhiraj Joshi, Jia Li, James Ze Wang
2006 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Dhiraj Joshi, James Ze Wang, Jia Li
2006 A* conf
ACM Multimedia
Ritendra Datta, Weina Ge, Jia Li, James Ze Wang
2005 conf
CVPR (1)
Jinbo Bi, Yixin Chen, James Ze Wang
2005 conf
CVPR (2)
Jia Li, James Ze Wang
2005 J jnl
IEEE Trans. Image Process.
Yixin Chen, James Ze Wang, Robert Krovetz
2005 conf
Multimedia Information Retrieval
Ritendra Datta, Jia Li, James Ze Wang
2005 J jnl
Int. J. Digit. Libr.
Ching-Chih Chen, Howard D. Wactlar, James Ze Wang, Kevin Kiernan
2005 A* conf
ACM Multimedia
Ritendra Datta, Jia Li, James Ze Wang
2005 J jnl
Inf. Process. Manag.
Dhiraj Joshi, James Ze Wang
2005 conf
ICIP (3)
Dhiraj Joshi, Jia Li, James Ze Wang
2004 J jnl
J. Mach. Learn. Res.
Yixin Chen, James Ze Wang
2004 book
Yixin Chen, Jia Li, James Ze Wang
2004 B conf
ICIP
Jia Li, Dhiraj Joshi, James Ze Wang
2004 J jnl
IEEE Trans. Image Process.
Jia Li, James Ze Wang
2004 conf
Multimedia Information Retrieval
Dhiraj Joshi, James Ze Wang, Jia Li
2003 conf
ISSPA (1)
Yixin Chen, James Ze Wang, Robert Krovetz
2003 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Jia Li, James Ze Wang
2003 conf
Multimedia Information Retrieval
Yixin Chen, James Ze Wang, Robert Krovetz
2003 conf
ICIP (3)
James Ze Wang, Jia Li, Sui Ching Lin
2003 B conf
FUZZ-IEEE
Yixin Chen, James Ze Wang
2003 B conf
FUZZ-IEEE
Yixin Chen, James Ze Wang
2003 J jnl
IEEE Trans. Fuzzy Syst.
Yixin Chen, James Ze Wang
2002 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Yixin Chen, James Ze Wang
2002 A* conf
ACM Multimedia
James Ze Wang, Jia Li
2002 Misc conf
AMIA
Ya Zhang, James Ze Wang
2002 J jnl
Bioinform.
Eldar Giladi, Michael G. Walker, James Ze Wang, Wayne Volkmuth
2001 conf
ICIP (1)
Yanping Du, James Ze Wang
2001 A* conf
ACM Multimedia
Yixin Chen, James Ze Wang, Jia Li
2001 book
James Ze Wang
2001 Misc conf
ICIAP
James Ze Wang, Yanping Du
2001 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
James Ze Wang, Jia Li, Gio Wiederhold
2001 conf
JCDL
James Ze Wang, Yanping Du
2001 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
James Ze Wang, Jia Li, Robert M. Gray, Gio Wiederhold
2001 J jnl
J. Biomed. Informatics
James Ze Wang
2000 B conf
ICIP
Jia Li, James Ze Wang, Gio Wiederhold
2000 A* conf
ACM Multimedia
Jia Li, James Ze Wang, Gio Wiederhold
2000 A* conf
ACM Multimedia
James Ze Wang
2000 conf
VISUAL
James Ze Wang, Jia Li, Gio Wiederhold
2000 A* conf
ACM Multimedia
James Ze Wang
1999 Misc conf
ICIAP
Jia Li, James Ze Wang, Robert M. Gray, Gio Wiederhold
1999 J jnl
D Lib Mag.
James Ze Wang, Jia Li, Desmond Chan, Gio Wiederhold
1998 conf
IDMS
James Ze Wang, Jia Li, Gio Wiederhold, Oscar Firschein
1998 Misc conf
AMIA
James Ze Wang, Gio Wiederhold
1998 J jnl
Comput. Commun.
James Ze Wang, Jia Li, Gio Wiederhold, Oscar Firschein
1997 Misc conf
AMIA
James Ze Wang, Michel Bilello, Gio Wiederhold
1997 J jnl
Int. J. Digit. Libr.
James Ze Wang, Gio Wiederhold, Oscar Firschein, Sha Xin Wei
1997 conf
IDMS
James Ze Wang, Gio Wiederhold, Oscar Firschein
1997 conf
ADL
James Ze Wang, Gio Wiederhold, Oscar Firschein, Sha Xin Wei
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