Kai Wang

83 papers A* 21A 3B 2Misc 3Journal 49Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Knowl. Data Eng.
Jingye Zhao, Jianan Shen, Jianwei Wang, Tianyuan Zhou, Ruijia Wu, Kai Wang, Xuemin Lin
2026 J jnl
CoRR
Rongjie Jiang, Jianwei Wang, Gengda Zhao, Chengyang Luo, Kai Wang, Wenjie Zhang
2026 J jnl
ACM Trans. Database Syst.
Xuliang Zhu, Xin Huang, Kai Wang, Jianliang Xu, Xuemin Lin
2026 J jnl
Frontiers Comput. Sci.
Mo Zhou, Jianwei Wang, Xuanmeng Zhang, Dylan Campbell, Kai Wang, Long Yuan, Wenjie Zhang, Xuemin Lin
2025 J jnl
CoRR
Yuren Mao, Peigen Liu, Xinjian Wang, Rui Ding, Jing Miao, Hui Zou, Mingjie Qi, Wanxiang Luo, Longbin Lai, Kai Wang, Zhengping Qian, Peilun Yang, Yunjun Gao, Ying Zhang
2025 J jnl
CoRR
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang
2025 J jnl
IEEE Trans. Knowl. Data Eng.
Shunyang Li, Kai Wang, Wenjie Zhang, Xuemin Lin, Yizhang He
2025 J jnl
CoRR
Haozhe Yin, Kai Wang, Wenjie Zhang, Ying Zhang, Ruijia Wu, Xuemin Lin
2025 J jnl
CoRR
Mengshi Chen, Yuxiang Sun, Tengchao Li, Jianwei Wang, Kai Wang, Xuemin Lin, Ying Zhang, Wenjie Zhang
2025 J jnl
CoRR
Jianwei Wang, Yuehai Wang, Kai Wang, Xuemin Lin, Wenjie Zhang, Ying Zhang
2025 J jnl
INFORMS J. Comput.
Jiadong Xie, Fan Zhang, Kai Wang, Jialu Liu, Xuemin Lin, Wenjie Zhang
2025 J jnl
CoRR
Haozhe Yin, Kai Wang, Wenjie Zhang, Yizhang He, Ying Zhang, Xuemin Lin
2025 J jnl
CoRR
Jianwei Wang, Kai Wang, Ying Zhang, Wenjie Zhang, Xiwei Xu, Xuemin Lin
2025 J jnl
Proc. VLDB Endow.
Jianmin Wang, Kai Wang, Ying Zhang, Wenjie Zhang, Xiwei Xu, Xuemin Lin
2025 A* conf
ICDE
Gengda Zhao, Dong Wen, Xiaoyang Wang, Kai Wang, Xuemin Lin
2025 J jnl
CoRR
Mo Zhou, Jianwei Wang, Xuanmeng Zhang, Dylan Campbell, Kai Wang, Long Yuan, Wenjie Zhang, Xuemin Lin
2025 J jnl
Proc. ACM Manag. Data
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang, Wei Ni
2025 J jnl
CoRR
Yitong Song, Pengcheng Zhang, Chao Gao, Bin Yao, Kai Wang, Zongyuan Wu, Lin Qu
2025 J jnl
Proc. ACM Manag. Data
Yitong Song, Pengcheng Zhang, Chao Gao, Bin Yao, Kai Wang, Zongyuan Wu, Lin Qu
2025 conf
KDD (1)
Jinyu Duan, Haicheng Guo, Fan Zhang, Kai Wang, Zhengping Qian, Zhihong Tian
2025 A* conf
ICDE
Yuting Zhang, Wei Ni, Kai Wang, Yizhang He, Conggai Li
2024 A* conf
ICDE
Hanchen Wang, Kai Wang, Wenjie Zhang, Ying Zhang
2024 A* conf
ICDE
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Wei Ni, Ying Zhang
2024 J jnl
Proc. ACM Manag. Data
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang
2024 J jnl
CoRR
Lingkai Meng, Long Yuan, Xuemin Lin, Chengjie Li, Kai Wang, Wenjie Zhang
2024 J jnl
VLDB J.
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang
2024 J jnl
Proc. VLDB Endow.
Haozhe Yin, Kai Wang, Wenjie Zhang, Ying Zhang, Ruijia Wu, Xuemin Lin
2024 A* conf
ICDE
Yitong Song, Kai Wang, Bin Yao, Zhida Chen, Jiong Xie, Feifei Li
2024 J jnl
CoRR
Jianwei Wang, Kai Wang, Xuemin Lin, Wenjie Zhang, Ying Zhang
2024 J jnl
Proc. VLDB Endow.
Jianwei Wang, Kai Wang, Xuemin Lin, Wenjie Zhang, Ying Zhang
2024 J jnl
VLDB J.
Kai Wang, Minghao Cai, Xiaoshuang Chen, Xuemin Lin, Wenjie Zhang, Lu Qin, Ying Zhang
2024 Misc conf
WISA
Zhizhi Gao, Deming Chu, Fan Zhang, Kai Wang, Long Yuan
2024 J jnl
IEEE Trans. Inf. Forensics Secur.
Yuwen Qian, Guodong Huang, Chuan Ma, Ming Ding, Long Yuan, Zi Chen, Kai Wang
2024 A* conf
ICDE
Jiujian Chen, Kai Wang, Ronghua Li, Hongchao Qin, Xuemin Lin, Guoren Wang
2024 A* conf
ICDE
Yue Zeng, Hongchao Qin, Rong-Hua Li, Kai Wang, Guoren Wang, Xuemin Lin
2024 J jnl
Proc. ACM Manag. Data
Jianwei Wang, Ying Zhang, Kai Wang, Xuemin Lin, Wenjie Zhang
2024 J jnl
CoRR
Jianwei Wang, Kai Wang, Xuemin Lin, Wenjie Zhang, Ying Zhang
2024 A* conf
WWW
Siyi Teng, Jiadong Xie, Fan Zhang, Can Lu, Juntao Fang, Kai Wang
2024 A* conf
ICDE
Shunyang Li, Kai Wang, Xuemin Lin, Wenjie Zhang, Yizhang He, Long Yuan
2024 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Hao Yu, Ji Hou, Zheng Qin, Mahdi Saleh, Ivan Shugurov, Kai Wang, Benjamin Busam, Slobodan Ilic
2024 B conf
EDBT
Yuting Zhang, Kai Wang, Wenjie Zhang, Wei Ni, Xuemin Lin
2023 J jnl
VLDB J.
Kai Wang, Xuemin Lin, Lu Qin, Wenjie Zhang, Ying Zhang
2023 J jnl
IEEE Trans. Knowl. Data Eng.
Kai Wang, Gengda Zhao, Wenjie Zhang, Xuemin Lin, Ying Zhang, Yizhang He, Chunxiao Li
2023 Misc conf
ADC
Haozhe Yin, Kai Wang, Wenjie Zhang, Dong Wen, Xiaoyang Wang, Ying Zhang
2023 J jnl
IEEE Trans. Knowl. Data Eng.
Kai Wang, Wenjie Zhang, Ying Zhang, Lu Qin, Yuting Zhang
2023 J jnl
CoRR
Xin-Wei Cai, Xiangyu Ke, Kai Wang, Lu Chen, Tianming Zhang, Qing Liu, Yunjun Gao
2023 J jnl
Proc. VLDB Endow.
Xin-Wei Cai, Xiangyu Ke, Kai Wang, Lu Chen, Tianming Zhang, Qing Liu, Yunjun Gao
2023 Misc conf
WISA
Kaiyuan Shu, Qi Liang, Haicheng Guo, Fan Zhang, Kai Wang, Long Yuan
2023 A conf
CIKM
Siyi Teng, Jiadong Xie, Mingkai Zhang, Kai Wang, Fan Zhang
2023 A* conf
ICDE
Zi Chen, Yiwei Zhao, Long Yuan, Xuemin Lin, Kai Wang
2023 J jnl
CoRR
Jiadong Xie, Fan Zhang, Kai Wang, Jialu Liu, Xuemin Lin, Wenjie Zhang
2023 A* conf
ICDE
Jiadong Xie, Fan Zhang, Kai Wang, Xuemin Lin, Wenjie Zhang
2023 J jnl
CoRR
Jiadong Xie, Fan Zhang, Kai Wang, Xuemin Lin, Wenjie Zhang
2023 A* conf
KDD
Fan Zhang, Qingyuan Linghu, Jiadong Xie, Kai Wang, Xuemin Lin, Wenjie Zhang
2023 J jnl
Proc. ACM Manag. Data
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang
2022 book
Yixiang Fang, Kai Wang, Xuemin Lin, Wenjie Zhang
2022 A* conf
ICDE
Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang, Shunyang Li
2022 J jnl
World Wide Web
Fan Zhang, Jiadong Xie, Kai Wang, Shiyu Yang, Yu Jiang
2022 A* conf
ICDE
Gengda Zhao, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang, Yizhang He
2022 A* conf
ICDE
Kai Wang, Wenjie Zhang, Xuemin Lin, Lu Qin, Alexander Zhou
2022 J jnl
IEEE Trans. Knowl. Data Eng.
Kai Wang, Shuting Wang, Xin Cao, Lu Qin
2022 A* conf
ICDE
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang
2022 A* conf
NeurIPS
Yuren Mao, Yaobo Liang, Nan Duan, Haobo Wang, Kai Wang, Lu Chen, Yunjun Gao
2022 J jnl
GeoInformatica
Bo Tang, Man Lung Yiu, Kyriakos Mouratidis, Jiahao Zhang, Kai Wang
2022 J jnl
CoRR
Hao Yu, Ji Hou, Zheng Qin, Mahdi Saleh, Ivan Shugurov, Kai Wang, Benjamin Busam, Slobodan Ilic
2022 J jnl
VLDB J.
Kai Wang, Xuemin Lin, Lu Qin, Wenjie Zhang, Ying Zhang
2021 A conf
CIKM
Kai Wang, Yiheng Hu, Xuemin Lin, Wenjie Zhang, Lu Qin, Ying Zhang
2021 conf
SIGMOD Conference
Yixiang Fang, Kai Wang, Xuemin Lin, Wenjie Zhang
2021 A* conf
ICDE
Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang, Lu Qin, Yuting Zhang
2021 J jnl
Proc. VLDB Endow.
Xiaoshuang Chen, Kai Wang, Xuemin Lin, Wenjie Zhang, Lu Qin, Ying Zhang
2021 J jnl
Inf. Sci.
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang
2021 A conf
CIKM
Yuting Zhang, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang
2020
Kai Wang
2020 A* conf
ICDE
Kai Wang, Xuemin Lin, Lu Qin, Wenjie Zhang, Ying Zhang
2020 J jnl
CoRR
Kai Wang, Xuemin Lin, Lu Qin, Wenjie Zhang, Ying Zhang
2020 conf
DASFAA (2)
Maryam Ghafouri, Kai Wang, Fan Zhang, Ying Zhang, Xuemin Lin
2020 J jnl
CoRR
Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang, Lu Qin, Yuting Zhang
2020 J jnl
CoRR
Yizhang He, Kai Wang, Wenjie Zhang, Xuemin Lin, Ying Zhang
2019 J jnl
Proc. VLDB Endow.
Kai Wang, Xuemin Lin, Lu Qin, Wenjie Zhang, Ying Zhang
2018 A* conf
ICDE
Kai Wang, Xin Cao, Xuemin Lin, Wenjie Zhang, Lu Qin
2018 J jnl
CoRR
Kai Wang, Xuemin Lin, Lu Qin, Wenjie Zhang, Ying Zhang
2017 B conf
EDBT
Bo Tang, Man Lung Yiu, Kyriakos Mouratidis, Kai Wang
2016 A* conf
ICDE
Lu Chen, Yunjun Gao, Kai Wang, Christian S. Jensen, Gang Chen
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 != ""