Xiangnan Liu

116 papers B 2C 5Misc 1Journal 99Unranked 9
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Cogn. Commun. Netw.
Xiangnan Liu, Chen Chen, Carlo Fischione
2026 J jnl
IEEE Trans. Wirel. Commun.
Xiangnan Liu, Carlo Fischione
2026 J jnl
IEEE Trans. Wirel. Commun.
Qirui Liu, Bile Peng, Xiangnan Liu, Chenren Xu, Eduard Axel Jorswieck, Haijun Zhang
2026 J jnl
IEEE Trans. Commun.
Xiangnan Liu, Haijun Zhang, Haojin Li, Chen Sun
2026 J jnl
IEEE Internet Things J.
Yasenjiang Abudureheman, Jianxiang Chu, Ruoxi Song, Xiangnan Liu, Wei Huangfu, Haijun Zhang
2025 J jnl
IEEE Trans. Veh. Technol.
Haitong Sun, Haijun Zhang, Wanqing Guan, Xiangnan Liu, Hui Ma, Victor C. M. Leung
2025 J jnl
CoRR
Haijun Zhang, Ziyang Zhang, Xiangnan Liu, Wei Li, Haojin Li, Chen Sun
2025 J jnl
IEEE Wirel. Commun.
Haijun Zhang, Ziyang Zhang, Xiangnan Liu, Wei Li, Haojin Li, Chen Sun
2025 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Xiaojing Xue, Caiyong Wei, Qian Zhang, Xuanke Sun, Huiqin Zhang, Hai Wu, Xiangnan Liu
2025 J jnl
CoRR
Haijun Zhang, Jiaxin Ni, Zijun Wu, Xiangnan Liu, Victor C. M. Leung
2025 J jnl
IEEE Wirel. Commun.
Haijun Zhang, Jiaxin Ni, Zijun Wu, Xiangnan Liu, Victor C. M. Leung
2024 J jnl
IEEE Netw.
Xiangnan Liu, Haijun Zhang, Kai Sun, Keping Long, George K. Karagiannidis
2024 J jnl
Remote. Sens.
Yuxin Zhao, Zeyu Cui, Xiangnan Liu, Meiling Liu, Ben Yang, Lei Feng, Botian Zhou, Tingwei Zhang, Zheng Tan, Ling Wu
2024 J jnl
Remote. Sens.
Yiman Li, Xiangnan Liu, Meiling Liu, Ling Wu, Lihong Zhu, Zhi Huang, Xiaojing Xue, Lingwen Tian
2024 J jnl
IEEE Trans. Commun.
Zijun Wu, Haijun Zhang, Xiangnan Liu, Linpei Li, Haojin Li
2024 J jnl
CoRR
Haijun Zhang, Bowen Chen, Xiangnan Liu, Chao Ren
2024 J jnl
IEEE J. Sel. Areas Commun.
Haijun Zhang, Bowen Chen, Xiangnan Liu, Chao Ren
2024 J jnl
IEEE Trans. Wirel. Commun.
Haijun Zhang, Mingyang Han, Xiangnan Liu, Linpei Li, Chen Sun, Haojin Li, Victor C. M. Leung
2024 conf
SPAWC
Chen Sun, Xiangnan Liu, Xinyu Huang, Carlo Fischione
2024 J jnl
IEEE Trans. Wirel. Commun.
Xiangnan Liu, Haijun Zhang, Chao Ren, Haojin Li, Chen Sun, Victor C. M. Leung
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuqi Xu, Ling Wu, Xiangnan Liu, Chen Chen, Yiman Li, Qian Zhang, Meiling Liu, Tingwei Zhang, Baowen Yang
2024 J jnl
IEEE Wirel. Commun.
Haijun Zhang, Yuxin Zhang, Xiangnan Liu, Kai Sun, Yaomin Zhang
2024 J jnl
IEEE Trans. Wirel. Commun.
Haijun Zhang, Yuxin Zhang, Xiangnan Liu, Chao Ren, Haojin Li, Chen Sun
2023 J jnl
Remote. Sens.
Bowen Hou, Caiyong Wei, Xiangnan Liu, Yuanyuan Meng, Xiaoyue Li
2023 J jnl
Appl. Soft Comput.
Xiangnan Liu, Shifei Ding, Xiao Xu, Lijuan Wang
2023 J jnl
IEEE Trans. Wirel. Commun.
Xiangnan Liu, Haijun Zhang, Keping Long, Arumugam Nallanathan, Victor C. M. Leung
2023 J jnl
IEEE J. Sel. Areas Commun.
Haijun Zhang, Xu Ma, Xiangnan Liu, Linpei Li, Kai Sun
2023 J jnl
Remote. Sens.
Caiyong Wei, Xiaojing Xue, Lingwen Tian, Qin Yang, Bowen Hou, Wenlong Wang, Dawei Ma, Yuanyuan Meng, Xiangnan Liu
2023 J jnl
IEEE Netw.
Haijun Zhang, Wei Song, Xiangnan Liu, Min Sheng, Wei Li, Keping Long, Octavia A. Dobre
2023 J jnl
IEEE Trans. Wirel. Commun.
Haijun Zhang, Jiali Xu, Xiangnan Liu, Keping Long, Victor C. M. Leung
2023 J jnl
IEEE Trans. Wirel. Commun.
Heng Wang, Haijun Zhang, Xiangnan Liu, Keping Long, Arumugam Nallanathan
2023 J jnl
Remote. Sens.
Xiaoyue Li, Xiangnan Liu, Bowen Hou, Lingwen Tian, Qin Yang, Lihong Zhu, Yuanyuan Meng
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Haijun Zhang, Minghui Jiang, Xiangnan Liu, Xiangming Wen, Ning Wang, Keping Long
2023 J jnl
Comput. Electron. Agric.
Xiangnan Liu, Jiangtao Qi, Weirong Zhang, Zhiyuan Bao, Kaichen Wang, Ning Li
2023 J jnl
Int. J. Geogr. Inf. Sci.
Xinyu Zou, Xiangnan Liu, Meiling Liu, Lingwen Tian, Lihong Zhu, Qian Zhang
2023 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Baowen Yang, Ling Wu, Zhengshan Ju, Xiangnan Liu, Meiling Liu, Tingwei Zhang, Yuqi Xu
2023 J jnl
IEEE Wirel. Commun.
Haijun Zhang, Dong Wang, Shuqing Wu, Wanqing Guan, Xiangnan Liu
2023 J jnl
IEEE J. Sel. Areas Commun.
Haijun Zhang, Lizhe Feng, Xiangnan Liu, Keping Long, George K. Karagiannidis
2022 conf
ICC
Haijun Zhang, Minghui Jiang, Xiangnan Liu, Keping Long, Victor C. M. Leung
2022 J jnl
Remote. Sens.
Xiaojing Xue, Caiyong Wei, Qin Yang, Lingwen Tian, Lihong Zhu, Yuanyuan Meng, Xiangnan Liu
2022 J jnl
Comput. Electron. Agric.
Jiangtao Qi, Xiangnan Liu, Kai Liu, Farong Xu, Hui Guo, Xinliang Tian, Mao Li, Zhiyuan Bao, Yang Li
2022 J jnl
Comput. Electron. Agric.
Mengqi Li, Meiling Liu, Xiangnan Liu, Tao Peng, Shuyu Wang
2022 J jnl
IEEE Internet Things J.
Xiangnan Liu, Haijun Zhang, Keping Long, Arumugam Nallanathan, Victor C. M. Leung
2022 J jnl
IEEE Trans. Veh. Technol.
Xiangnan Liu, Haijun Zhang, Keping Long, Arumugam Nallanathan, Victor C. M. Leung
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Meiling Liu, Xiangnan Liu, Ling Wu, Tao Peng, Qian Zhang, Xinyu Zou, Lingwen Tian, Xuan Wang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Ling Wu, Xiangnan Liu, Meiling Liu, Jinghui Yang, Lihong Zhu, Botian Zhou
2022 J jnl
IEEE Internet Things J.
Xiangnan Liu, Haijun Zhang, Xiangming Wen, Keping Long, Jianquan Wang, Lei Sun
2022 J jnl
IEEE J. Sel. Areas Commun.
Xiangnan Liu, Haijun Zhang, Keping Long, Mingyu Zhou, Yonghui Li, H. Vincent Poor
2022 J jnl
CoRR
Xiangnan Liu, Haijun Zhang, Keping Long, Mingyu Zhou, Yonghui Li, H. Vincent Poor
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Tao Peng, Meiling Liu, Xiangnan Liu, Qian Zhang, Ling Wu, Xinyu Zou
2022 J jnl
Remote. Sens.
Zhuoyao Zhang, Xiangnan Liu, Lihong Zhu, Junji Li, Yue Zhang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Lingwen Tian, Xiangnan Liu, Meiling Liu, Ling Wu
2021 J jnl
Int. J. Digit. Earth
Gaoxiang Zhou, Ming Liu, Xiangnan Liu
2021 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Yu Li, Meiling Liu, Xiangnan Liu, Wenfu Yang, Wenwen Wang
2021 J jnl
Remote. Sens.
Qian Zhang, Xiangnan Liu, Meiling Liu, Xinyu Zou, Lihong Zhu, Xiaohao Ruan
2021 J jnl
Ecol. Informatics
Lu Ye, Meiling Liu, Xiangnan Liu, Lihong Zhu
2021 J jnl
Remote. Sens.
Yue Zhang, Xiangnan Liu, Qin Yang, Zhaolun Liu, Yu Li
2021 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Zhiyu Yi, Meiling Liu, Xiangnan Liu, Yuebin Wang, Ling Wu, Zheng Wang, Lihong Zhu
2021 J jnl
Remote. Sens.
Yangcen Zhang, Xiangnan Liu, Meiling Liu, Xinyu Zou, Qian Zhang, Tao Peng
2021 B conf
GLOBECOM
Haijun Zhang, Xiangnan Liu, Keping Long, H. Vincent Poor
2021 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Zhi Huang, Xiangnan Liu, Qin Yang, Yuanyuan Meng, Lihong Zhu, Xinyu Zou
2021 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Jie Zhang, Meiling Liu, Xiangnan Liu, Weiqun Luo, Ling Wu, Lihong Zhu
2020 J jnl
Remote. Sens.
Mengxue Liu, Xiangnan Liu, Xiaobin Dong, Bingyu Zhao, Xinyu Zou, Ling Wu, Hejie Wei
2020 J jnl
Ecol. Informatics
Yuanyuan Meng, Xiangnan Liu, Chao Ding, Boliang Xu, Gaoxiang Zhou, Lihong Zhu
2020 J jnl
Remote. Sens.
Ling Wu, Zhaoliang Li, Xiangnan Liu, Lihong Zhu, Yibo Tang, Biyao Zhang, Boliang Xu, Meiling Liu, Yuanyuan Meng, Boyuan Liu
2020 J jnl
IEEE Access
Bingyu Zhao, Meiling Liu, Jianjun Wu, Xiangnan Liu, Mengxue Liu, Ling Wu
2019 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Meiling Liu, Andrew K. Skidmore, Tiejun Wang, Xiangnan Liu, Ling Wu, Lingwen Tian
2019 J jnl
Remote. Sens.
Gaoxiang Zhou, Xiangnan Liu, Ming Liu
2019 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Xuqing Li, Long Li, Xiangnan Liu
2019 J jnl
Remote. Sens.
Biyao Zhang, Xiangnan Liu, Meiling Liu, Yuanyuan Meng
2019 J jnl
Remote. Sens.
Lihong Zhu, Xiangnan Liu, Ling Wu, Yibo Tang, Yuanyuan Meng
2018 J jnl
Remote. Sens.
Mengxue Liu, Xiangnan Liu, Ling Wu, Xinyu Zou, Tian Jiang, Bingyu Zhao
2018 J jnl
Sensors
Zhijiang Zhang, Meiling Liu, Xiangnan Liu, Gaoxiang Zhou
2018 J jnl
Sensors
Tianjiao Liu, Xiangnan Liu, Meiling Liu, Ling Wu
2018 C conf
IGARSS
Gaoxiang Zhou, Ming Liu, Xiangnan Liu, Jonathan Li
2018 B conf
GLOBECOM
Haijun Zhang, Xiangnan Liu, Keping Long, Arumugam Nallanathan, Victor C. M. Leung
2018 J jnl
Sensors
Tianjiao Liu, Xiangnan Liu, Meiling Liu, Ling Wu
2018 J jnl
Sensors
Shuang Zhao, Xu Qian, Xiangnan Liu, Zhao Xu
2018 C conf
IGARSS
Meiling Liu, Xiangnan Liu, Yuanyuan Meng, Andrew K. Skidmore, Tiejun Wang
2018 J jnl
ISPRS Int. J. Geo Inf.
Tian Jiang, Xiangnan Liu, Ling Wu
2018 J jnl
Sci. China Inf. Sci.
Weiren Wu, Ming Chen, Zhe Zhang, Xiangnan Liu, Yuhui Dong
2018 J jnl
Sensors
Hao Chen, Xiangnan Liu, Chao Ding, Fang Huang
2018 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Ling Wu, Xiangnan Liu, Qiming Qin, Bingyu Zhao, Yujia Ma, Mengxue Liu, Tian Jiang
2018 J jnl
IET Image Process.
Yutan Wang, Yingpeng Dai, Xiangnan Liu, Bohan Liu, Xiaoyun Guo
2017 C conf
IGARSS
Ping Wang, Fang Huang, Xiangnan Liu
2017 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Ming Jin, Xiangnan Liu, Ling Wu, Meiling Liu
2017 J jnl
Remote. Sens.
Gaoxiang Zhou, Xiangnan Liu, Shuang Zhao, Ming Liu, Ling Wu
2017 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Ming Jin, Xiangnan Liu, Biyao Zhang
2017 J jnl
Sensors
Shuyuan Liu, Xiangnan Liu, Meiling Liu, Ling Wu, Chao Ding, Zhi Huang
2017 J jnl
Remote. Sens.
Chao Ding, Xiangnan Liu, Fang Huang
2016 J jnl
Sensors
Zhi Huang, Xiangnan Liu, Ming Jin, Chao Ding, Jiale Jiang, Ling Wu
2016 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Feng Liu, Xiangnan Liu, Ling Wu, Zhao Xu, Lu Gong
2016 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Meiling Liu, Xiangnan Liu, Biyao Zhang, Chao Ding
2016 J jnl
Remote. Sens.
Ling Wu, Qiming Qin, Xiangnan Liu, Huazhong Ren, Jianhua Wang, Xiao Po Zheng, Xin Ye, Yuejun Sun
2015 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Xuqing Li, Xiangnan Liu, Meiling Liu, Cuicui Wang, Xiaopeng Xia
2015 conf
FSKD
Jiale Jiang, Xiangnan Liu, Zhao Xu, Ming Jin, Feng Liu
2015 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Ming Jin, Xiangnan Liu, Ling Wu, Meiling Liu
2015 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Jiale Jiang, Xiangnan Liu, Chuanhao Liu, Ling Wu, Xiaopeng Xia, Meiling Liu, Zhihong Du
2015 conf
OPTICS
Xiangnan Liu, Chengyong Xiang, Liang Zhang, Yingfei Li
2015 J jnl
Comput. Geosci.
Meiling Liu, Xiangnan Liu, Da Liu, Chao Ding, Jiale Jiang
2015 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Feng Liu, Xiangnan Liu, Liting Zhao, Chao Ding, Jiale Jiang, Ling Wu
2014 conf
GRMSE
Cuicui Wang, Xiangnan Liu, Weiguo Jiang, Wenjie Wang, Qiuling Li, Lihua Yuan, Ran Cao, Yunfei Zhang
2014 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Meiling Liu, Xiangnan Liu, Jin Li, Chao Ding, Jiale Jiang
2013 conf
FSKD
Xuqing Li, Xiangnan Liu, Zhihong Du, Cuicui Wang
2013 J jnl
Comput. Geosci.
Hui Zhang, Xiangnan Liu, Erli Cai, Gang Huang, Chao Ding
2013 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Ling Wu, Xiangnan Liu, Ping Wang, Botian Zhou, Meiling Liu, Xuqing Li
2012 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Meiling Liu, Xiangnan Liu, Jonathan Li, Ting Li
2012 conf
FSKD
Hui Zhang, Xiangnan Liu
2011 conf
CHINACOM
Xiyuan Chen, Honglin Zhao, Yongkui Ma, Xiangnan Liu
2011 J jnl
Comput. Geosci.
Meiling Liu, Xiangnan Liu, Menxin Wu, Lufeng Li, Lina Xiu
2011 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Meiling Liu, Xiangnan Liu, Weicui Ding, Ling Wu
2011 J jnl
Comput. Geosci.
Meiling Liu, Xiangnan Liu, Ling Wu, Liqing Duan, Binqing Zhong
2010 Misc conf
ICNC
Ping Wang, Fang Huang, Xiangnan Liu, Ling Zhao
2010 conf
FSKD
Meiling Liu, Xiangnan Liu, Binqing Zhong, Shi Cao
2006 C conf
IGARSS
Wenhua Zeng, Xia Cui, Xiangnan Liu, Haishan Cui, Ping Wang
2006 C conf
IGARSS
Li Guan, Ping Wang, Fang Huang, Xiangnan Liu
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 != ""