Hanjiang Lai

115 papers A* 16A 5B 7C 6Misc 3Journal 64Unranked 14
YearRankTypeTitle / Venue / Authors
2026 J jnl
Neural Networks
Kun Zou, Yongheng Xu, Jianxing Yu, Yan Pan, Jian Yin, Hanjiang Lai
2025 J jnl
Int. J. Comput. Vis.
Qinkang Gong, Yan Pan, Hanjiang Lai, Jian Yin
2025 J jnl
CoRR
Yifei Chen, Kaiyu Song, Yan Pan, Jianxing Yu, Jian Yin, Hanjiang Lai
2025 conf
ACL (1)
Fan Li, Jianxing Yu, Jielong Tang, Wenqing Chen, Hanjiang Lai, Yanghui Rao, Jian Yin
2025 C conf
CSCWD
Rongbang Qiu, Qinkang Gong, Yan Pan, Hanjiang Lai
2025 A conf
ICME
Yongheng Xu, Kaiyu Song, Hanjiang Lai
2025 J jnl
IEEE Trans. Knowl. Data Eng.
Qinkang Gong, Yan Pan, Hanjiang Lai, Rongbang Qiu, Jian Yin
2025 B conf
COLING
Ziqi Qiu, Jianxing Yu, Yufeng Zhang, Hanjiang Lai, Yanghui Rao, Qinliang Su, Jian Yin
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Linyin Luo, Hanjiang Lai, Yan Pan, Jian Yin
2025 Misc conf
ICASSP
Baoshun Tong, Kaiyu Song, Hanjiang Lai
2025 J jnl
CoRR
Kun Zou, Yongheng Xu, Jianxing Yu, Yan Pan, Jian Yin, Hanjiang Lai
2025 B conf
COLING
Jianxing Yu, Shiqi Wang, Hanjiang Lai, Wenqing Chen, Yanghui Rao, Qinliang Su, Jian Yin
2025 Misc conf
ICASSP
Yongheng Xu, Hanjiang Lai
2025 J jnl
CoRR
Linyin Luo, Yujuan Ding, Yunshan Ma, Wenqi Fan, Hanjiang Lai
2025 A* conf
CVPR
Baoshun Tong, Hanjiang Lai, Yan Pan, Jian Yin
2025 A conf
ICME
Junyang Chen, Hanjiang Lai
2025 conf
ICIC (16)
Junyang Chen, Hanjiang Lai
2025 J jnl
CoRR
Kaiyu Song, Hanjiang Lai
2025 Misc conf
ICASSP
Baoshun Tong, Kaiyu Song, Hanjiang Lai
2025 J jnl
CoRR
Kaiyu Song, Hanjiang Lai, Yaqing Zhang, Chuangjian Cai, Yan Pan Kun Yue, Jian Yin
2024 J jnl
Data Sci. Eng.
Mengying Xu, Linyin Luo, Hanjiang Lai, Jian Yin
2024 conf
MMM (1)
Mengying Xu, Hanjiang Lai, Jian Yin
2024 A conf
ICME
Liyan Guo, Kaiyu Song, Mengying Xu, Hanjiang Lai
2024 J jnl
CoRR
Baoshun Tong, Kaiyu Song, Hanjiang Lai
2024 J jnl
CoRR
Kaiyu Song, Hanjiang Lai
2024 conf
LREC/COLING
Zhicheng Lin, Hegang Chen, Yuyin Lu, Yanghui Rao, Hao Xu, Hanjiang Lai
2024 J jnl
CoRR
Kaiyu Song, Hanjiang Lai
2024 conf
ICPR (21)
Zujun Fu, Hanjiang Lai, Yan Pan
2024 A conf
ICME
Kaifen Cai, Kaiyu Song, Yan Pan, Hanjiang Lai
2024 conf
MMM (1)
Yongyu Liu, Guoliang Lin, Hanjiang Lai, Yan Pan
2024 A* conf
CVPR
Kaiyu Song, Hanjiang Lai, Yan Pan, Jian Yin
2024 J jnl
IEEE Trans. Knowl. Data Eng.
Guoliang Lin, Yongheng Xu, Hanjiang Lai, Jian Yin
2024 J jnl
CoRR
Baoshun Tong, Kaiyu Song, Hanjiang Lai
2024 J jnl
CoRR
Kaiyu Song, Hanjiang Lai
2023 conf
APWeb-WAIM (2)
Miaopei Lin, Jianxing Yu, Shiqi Wang, Hanjiang Lai, Wei Liu, Jian Yin
2023 C conf
CSCWD
Mengying Xu, Hanjiang Lai, Jian Yin
2023 conf
ACL (1)
Wangzhen Guo, Qinkang Gong, Yanghui Rao, Hanjiang Lai
2023 A* conf
CVPR
Liangdao Wang, Yan Pan, Cong Liu, Hanjiang Lai, Jian Yin, Ye Liu
2023 A* conf
EMNLP
Wangzhen Guo, Linyin Luo, Hanjiang Lai, Jian Yin
2023 J jnl
CoRR
Wangzhen Guo, Linyin Luo, Hanjiang Lai, Jian Yin
2023 J jnl
CoRR
Guoliang Lin, Hanjiang Lai, Yan Pan, Jian Yin
2023 J jnl
CoRR
Kaiyu Song, Hanjiang Lai
2023 conf
MMM (2)
Wei Luo, Mengying Xu, Hanjiang Lai
2023 J jnl
CoRR
Junyang Chen, Hanjiang Lai
2023 J jnl
CoRR
Junyang Chen, Hanjiang Lai
2023 conf
ADMA (2)
Miaopei Lin, Mengxiang Wang, Jianxing Yu, Shiqi Wang, Hanjiang Lai, Wei Liu, Jian Yin
2023 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Zusheng Zhang, Yanghui Rao, Hanjiang Lai, Jiahai Wang, Jian Yin
2023 J jnl
CoRR
Kaiyu Song, Hanjiang Lai
2022 J jnl
CoRR
Wangzhen Guo, Qinkang Gong, Hanjiang Lai
2022 J jnl
IEEE Trans. Image Process.
Yuchen Liang, Yan Pan, Hanjiang Lai, Wei Liu, Jian Yin
2022 J jnl
Intell. Data Anal.
Hanlu Chu, Haien Zeng, Hanjiang Lai, Yong Tang
2022 conf
ACCV (6)
Liangdao Wang, Yan Pan, Hanjiang Lai, Jian Yin
2022 J jnl
CoRR
Guoliang Lin, Hanjiang Lai
2022 A* conf
CVPR
Guoliang Lin, Hanlu Chu, Hanjiang Lai
2022 J jnl
CoRR
Qinkang Gong, Liangdao Wang, Hanjiang Lai, Yan Pan, Jian Yin
2022 A* conf
NeurIPS
Jiangxin Sun, Chunyu Wang, Huang Hu, Hanjiang Lai, Zhi Jin, Jian-Fang Hu
2021 C conf
CSCWD
Ruiying Zhou, Keke Tian, Hanjiang Lai, Jian Yin
2021 B conf
ICMR
Shaoying Wang, Hanjiang Lai, Zhenyu Shi
2021 J jnl
CoRR
Guoliang Lin, Hanglu Chu, Hanjiang Lai
2021 C conf
CSCWD
Yujie Hu, Hanjiang Lai, Yan Pan
2020 B conf
ICPR
Haien Zeng, Hanjiang Lai
2020 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Hanjiang Lai, Jikai Chen, Libing Geng, Yan Pan, Xiaodan Liang, Jian Yin
2020 A* conf
ICLR
Zhenyu Shi, Runsheng Yu, Xinrun Wang, Rundong Wang, Youzhi Zhang, Hanjiang Lai, Bo An
2020 J jnl
World Wide Web
Wei Liu, Hanjiang Lai, Jing Wang, Ge-Yang Ke, Weiwei Yang, Jian Yin
2020 J jnl
Neurocomputing
Yuchen Liang, Yan Pan, Hanjiang Lai, Jian Yin
2019 J jnl
IEEE Trans. Cybern.
Chang-Qin Huang, Jikai Chen, Yan Pan, Hanjiang Lai, Jian Yin, Qionghao Huang
2019 J jnl
CoRR
Haien Zeng, Hanjiang Lai, Jian Yin
2019 B conf
ICMR
Shaoying Wang, Hanjiang Lai, Yifan Yang, Jian Yin
2019 J jnl
CoRR
Shaoying Wang, Hanjiang Lai, Yifan Yang, Jian Yin
2019 B conf
ICMR
Yifan Yang, Libing Geng, Hanjiang Lai, Yan Pan, Jian Yin
2019 J jnl
CoRR
Yifan Yang, Libing Geng, Hanjiang Lai, Yan Pan, Jian Yin
2019 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Hanjiang Lai, Yan Pan, Si Liu, Zhenbin Weng, Jian Yin
2019 J jnl
CoRR
Runsheng Yu, Zhenyu Shi, Xinrun Wang, Rundong Wang, Buhong Liu, Xinwen Hou, Hanjiang Lai, Bo An
2019 J jnl
CoRR
Haien Zeng, Hanjiang Lai, Hanlu Chu, Yong Tang, Jian Yin
2019 A conf
ICME
Haoye Dong, Xiaodan Liang, Chenxing Zhou, Hanjiang Lai, Jia Zhu, Jian Yin
2019 J jnl
CoRR
Haien Zeng, Hanjiang Lai, Jian Yin
2019 A* conf
ICCV
Haoye Dong, Xiaodan Liang, Xiaohui Shen, Bochao Wang, Hanjiang Lai, Jia Zhu, Zhiting Hu, Jian Yin
2019 J jnl
CoRR
Haoye Dong, Xiaodan Liang, Bochao Wang, Hanjiang Lai, Jia Zhu, Jian Yin
2019 J jnl
Pattern Recognit. Lett.
Chunyan Xu, Jian Yang, Hanjiang Lai, Junbin Gao, Linlin Shen, Shuicheng Yan
2018 conf
ECCV (15)
Xi Zhang, Hanjiang Lai, Jiashi Feng
2018 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Hanjiang Lai, Shengtao Xiao, Yan Pan, Zhen Cui, Jiashi Feng, Chunyan Xu, Jian Yin, Shuicheng Yan
2018 J jnl
Inf. Sci.
Lei Du, Yan Pan, Jintang Ding, Hanjiang Lai, Changqin Huang
2018 J jnl
CoRR
Jikai Chen, Hanjiang Lai, Libing Geng, Yan Pan
2018 J jnl
IEEE Trans. Image Process.
Chang-Qin Huang, Shang-Ming Yang, Yan Pan, Hanjiang Lai
2018 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Xiangbo Shu, Jinhui Tang, Zechao Li, Hanjiang Lai, Liyan Zhang, Shuicheng Yan
2018 J jnl
Neurocomputing
Chunyan Xu, Jian Yang, Junbin Gao, Hanjiang Lai, Shuicheng Yan
2018 A* conf
NeurIPS
Haoye Dong, Xiaodan Liang, Ke Gong, Hanjiang Lai, Jia Zhu, Jian Yin
2018 J jnl
CoRR
Haoye Dong, Xiaodan Liang, Ke Gong, Hanjiang Lai, Jia Zhu, Jian Yin
2018 B conf
ICMR
Hanjiang Lai
2017 A* conf
ACM Multimedia
Jiale Bai, Bingbing Ni, Minsi Wang, Yang Shen, Hanjiang Lai, Chongyang Zhang, Lin Mei, Chuanping Hu, Chen Yao
2017 J jnl
CoRR
Xi Zhang, Siyu Zhou, Jiashi Feng, Hanjiang Lai, Bo Li, Yan Pan, Jian Yin, Shuicheng Yan
2017 J jnl
CoRR
Hanjiang Lai, Yan Pan
2017 A* conf
CVPR
Zhen Wei, Yao Sun, Jinqiao Wang, Hanjiang Lai, Si Liu
2017 J jnl
CoRR
Xiangbo Shu, Jinhui Tang, Zechao Li, Hanjiang Lai, Liyan Zhang, Shuicheng Yan
2017 J jnl
CoRR
Siyu Zhou, Weiqiang Zhao, Jiashi Feng, Hanjiang Lai, Yan Pan, Jian Yin, Shuicheng Yan
2017 J jnl
CoRR
Hanjiang Lai, Yan Pan
2016 J jnl
CoRR
Hanjiang Lai, Pan Yan, Xiangbo Shu, Yunchao Wei, Shuicheng Yan
2016 J jnl
IEEE Trans. Image Process.
Hanjiang Lai, Pan Yan, Xiangbo Shu, Yunchao Wei, Shuicheng Yan
2016 J jnl
Pattern Recognit.
Xiangbo Shu, Jinhui Tang, Hanjiang Lai, Zhiheng Niu, Shuicheng Yan
2016 J jnl
Neurocomputing
Ye Liu, Yan Pan, Hanjiang Lai, Cong Liu, Jian Yin
2016 conf
ECCV (1)
Shengtao Xiao, Jiashi Feng, Junliang Xing, Hanjiang Lai, Shuicheng Yan, Ashraf A. Kassim
2015 J jnl
CoRR
Hanjiang Lai, Shengtao Xiao, Yan Pan, Zhen Cui, Jiashi Feng, Chunyan Xu, Jian Yin, Shuicheng Yan
2015 A* conf
ICCV
Xiangbo Shu, Jinhui Tang, Hanjiang Lai, Luoqi Liu, Shuicheng Yan
2015 J jnl
CoRR
Xiangbo Shu, Jinhui Tang, Hanjiang Lai, Luoqi Liu, Shuicheng Yan
2015 J jnl
CoRR
Hanjiang Lai, Yan Pan, Ye Liu, Shuicheng Yan
2015 A* conf
CVPR
Hanjiang Lai, Yan Pan, Ye Liu, Shuicheng Yan
2014 C conf
CSCWD
Shaowen Hong, Chengjie Mao, Zhenxiong Yang, Hanjiang Lai
2014 conf
ECCV (2)
Hanjiang Lai, Yan Pan, Canyi Lu, Yong Tang, Shuicheng Yan
2014 A* conf
AAAI
Rongkai Xia, Yan Pan, Hanjiang Lai, Cong Liu, Shuicheng Yan
2013 A* conf
CVPR
Yan Pan, Hanjiang Lai, Cong Liu, Shuicheng Yan
2013 J jnl
Knowl. Based Syst.
Hanjiang Lai, Yan Pan, Yong Tang, Ning Liu
2013 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Hanjiang Lai, Yan Pan, Yong Tang, Rong Yu
2013 A* conf
AAAI
Yan Pan, Hanjiang Lai, Cong Liu, Yong Tang, Shuicheng Yan
2013 J jnl
IEEE Trans. Computers
Hanjiang Lai, Yan Pan, Cong Liu, Liang Lin, Jie Wu
2011 C conf
CSCWD
Hanjiang Lai, Yong Tang, Hai-Xia Luo, Yan Pan
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 != ""