Kai Fang

76 papers A* 2C 4Journal 59Unranked 11
YearRankTypeTitle / Venue / Authors
2026 A* conf
WWW
Yongkang Zhao, Hailin Feng, Tingting Wang, Thippa Reddy Gadekallu, Kai Fang, Wei Wang
2026 J jnl
IEEE Trans. Netw. Serv. Manag.
Zhihao Wen, Weishi An, Chuanhua Wang, Quanbo Ge, Thippa Reddy Gadekallu, Hailin Feng, Kai Fang
2026 J jnl
IEEE Netw.
Yang Li, Ming Wei, Jing Nie, Sezai Ercisli, Kai Fang, Thippa Reddy Gadekallu
2026 J jnl
Inf. Fusion
Yuchao Xia, Hailin Feng, Quanbo Ge, Joel J. P. C. Rodrigues, Thippa Reddy Gadekallu, Kai Fang
2026 J jnl
Eng. Appl. Artif. Intell.
Thippa Reddy Gadekallu, Quoc-Viet Pham, Thien Huynh-The, Hailin Feng, Kai Fang, Sharnil Pandya, Madhusanka Liyanage, Wei Wang, Thanh Thi Nguyen
2026 J jnl
Comput. Electron. Agric.
Liuchang Xu, Ting Ni, Fangshuo Zhou, Qingming Lin, Luyao Chen, Qianqian Luo, Kai Xia, Xingyu Xue, Xinyu Zheng, Sensen Wu, Zhenhong Du, Kai Fang, Hailin Feng
2026 J jnl
IEEE Trans. Consumer Electron.
Tanveer Ahmad, Asma Abbas Hassan Elnour, Muhammad Usman Hadi, Kai Fang, Thippa Reddy Gadekallu
2026 J jnl
CoRR
Praveen Kumar Donta, Alaa Saleh, Ying Li, Shubham Vaishnav, Kai Fang, Hailin Feng, Yuchao Xia, Thippa Reddy Gadekallu, Qiyang Zhang, Xiaodan Shi, Ali Beikmohammadi, Sindri Magnússon, Ilir Murturi, Chinmaya Kumar Dehury, Marcin Paprzycki, Lauri Lovén, Sasu Tarkoma, Schahram Dustdar
2026 J jnl
IEEE Internet Things J.
Zijia Yang, Xingyi Li, Xiaochen Du, Lijian Yao, Kai Fang, Hailin Feng, Wei Wang
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Jiayi Zhao, Yaxing Yue, Xuepan Zhang, Zhiguo Shi, Kai Fang, Guisheng Liao
2025 J jnl
IEEE Consumer Electron. Mag.
Tingting Wang, Jinyu Tian, Kai Fang, Thippa Reddy Gadekallu, Wei Wang
2025 J jnl
IEEE Wirel. Commun.
Tingting Wang, Kai Fang, Jinyu Tian, Hailin Feng, Maryam M. Al Dabel, Ali Kashif Bashir, Wei Wang
2025 J jnl
IEEE Internet Things J.
Yang Li, Ming Wei, Jing Nie, Jikai Zhao, Muhammad Attique Khan, Kai Fang, Thippa Reddy Gadekallu
2025 J jnl
IEEE Trans. Consumer Electron.
Hong Ye, Xiajun Ding, Nazik Alturki, Ali Kashif Bashir, Meilei Lv, Kai Fang, Wei Wang
2025 J jnl
IEEE Internet Things J.
Sahaya Beni Prathiba, Sri Ram Krishnamoorthy, Karuna Soundari Kannan, Arikumar K. Selvaraj, Dhanalakshmi Ranganayakulu, Kai Fang, Thippa Reddy Gadekallu
2025 J jnl
IEEE Trans. Consumer Electron.
Hong Ye, Jijing Cai, Jiangtao Deng, Xiaodong Wang, Ali Kashif Bashir, Kai Fang, Wei Wang
2025 J jnl
IEEE Internet Things J.
Xiaoyan Yuan, Wei Wang, Junxin Chen, Kai Fang, Ali Kashif Bashir, Tapas Mondal, Xiping Hu, M. Jamal Deen
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Tongcun Liu, Xukai Bao, Jiaxin Zhang, Kai Fang, Hailin Feng
2025 J jnl
IEEE Internet Things J.
Jiangtao Deng, Wei Wang, Lina Wang, Ali Kashif Bashir, Thippa Reddy Gadekallu, Hailin Feng, Meilei Lv, Kai Fang
2025 J jnl
CoRR
Thippa Reddy Gadekallu, Kapal Dev, Sunder Ali Khowaja, Weizheng Wang, Hailin Feng, Kai Fang, Sharnil Pandya, Wei Wang
2025 J jnl
J. Circuits Syst. Comput.
Deepanshi, Yash Motiani, Gaurav Singh, Ishan Budhiraja, Haneef Khan, Pronaya Bhattacharya, Kai Fang, Thippa Reddy Gadekallu
2025 A* conf
WWW
Kai Fang, Jiangtao Deng, Chengzu Dong, Usman Naseem, Tongcun Liu, Hailin Feng, Wei Wang
2025 J jnl
CoRR
Kai Fang, Jiangtao Deng, Chengzu Dong, Usman Naseem, Tongcun Liu, Hailin Feng, Wei Wang
2025 J jnl
Comput. Electron. Agric.
Xiaomei Yi, Zekai Zheng, Peng Wu, Thippa Reddy Gadekallu, Kai Fang
2025 J jnl
IEEE Internet Things J.
Kai Fang, Lianghuai Tong, Xiaojie Xu, Jijing Cai, Xueyuan Peng, Marwan Omar, Ali Kashif Bashir, Wei Wang
2025 J jnl
IEEE J. Sel. Areas Commun.
Tingting Wang, Kai Fang, Jijing Cai, Lina Wang, Jinyu Tian, Hailin Feng, Jianqing Li, Mohsen Guizani, Wei Wang
2025 J jnl
Int. J. Digit. Earth
Qingming Lin, Rui Hu, Huaxia Li, Sensen Wu, Yadong Li, Kai Fang, Hailin Feng, Zhenhong Du, Liuchang Xu
2025 J jnl
IEEE Internet Things J.
Yang Li, Bohan Hou, Jing Nie, Xuewei Chao, Muhammad Attique Khan, Kai Fang, Thippa Reddy Gadekallu
2025 J jnl
IEEE Trans. Fuzzy Syst.
Jiefan Qiu, Yizhe Jia, Xingyu Chen, Xiangyun Zhao, Hailin Feng, Kai Fang
2025 J jnl
IEEE Open J. Commun. Soc.
Lina Wang, Xiaoting Mao, Kai Fang, Ali Kashif Bashir, Marwan Omar, Xiaoping Wu, Wei Wang
2025 J jnl
PeerJ Comput. Sci.
Thippa Reddy Gadekallu, Gokul Yenduri, Rajesh Kaluri, Dharmendra Singh Rajput, Kuruva Lakshmanna, Kai Fang, Junxin Chen, Wei Wang
2025 J jnl
Neural Networks
Hailin Feng, Jiefan Qiu, Long Wen, Jinhong Zhang, Jiening Yang, Zhihan Lyu, Tongcun Liu, Kai Fang
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Junchao Yuan, Lina Wang, Tingting Wang, Ali Kashif Bashir, Maryam M. Al Dabel, Jiaxing Wang, Hailin Feng, Kai Fang, Wei Wang
2024 J jnl
IEEE J. Biomed. Health Informatics
Lina Wang, Yan Mao, Jinfeng Xu, Jianan Wu, Kunxiu Wu, Keji Mao, Kai Fang
2024 conf
SmartIoT
Lina Wang, Junchao Yuan, Jijing Cai, Jiangtao Deng, Zijia Yang, Zhihao Wen, Kai Fang, Hailin Feng
2024 conf
GLOBECOM (Workshops)
Thippa Reddy Gadekallu, Kai Fang, Hailin Feng, Sharnil Pandya, Ramalingam Murugan, Praveen Kumar Reddy Maddikunta, Sweta Bhattacharya, Gokul Yenduri
2024 J jnl
Sensors
Xiaomin Lv, Kai Fang, Tongcun Liu
2024 conf
GLOBECOM (Workshops)
Hira Akhtar Butt, Kai Fang, Mumtaz Ali Shah, Mujeeb Ur Rehman, Rutvij H. Jhaveri, Hailin Feng, Jehad Ali
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Lina Wang, Jijing Cai, Tingting Wang, Jiayi Zhao, Thippa Reddy Gadekallu, Kai Fang
2024 conf
SmartIoT
Zijia Yang, Lina Wang, Long Wen, Junchao Yuan, Jiangtao Deng, Kai Fang, Hailin Feng
2024 J jnl
Sci. China Inf. Sci.
Kai Fang, Junxin Chen, Zhu Han, Thippa Reddy Gadekallu, Xiaoping Wu, Wei Wang
2024 J jnl
IEEE J. Biomed. Health Informatics
Kai Fang, Wei Wang, Marcin Wozniak, Qingchen Zhang, Keping Yu, Junxin Chen, Amr Tolba, Leo Yu Zhang
2024 J jnl
IEEE Trans. Consumer Electron.
Wei Wang, Shahid Mumtaz, Joe Xiang, Kai Fang, Tingting Wang
2024 conf
ICSOC (1)
Jiaxing Wang, Chengliang Lu, Yifeng Yu, Bin Cao, Kai Fang, Jing Fan
2024 J jnl
IEEE Trans. Consumer Electron.
Boyu Yang, Liyazhou Hu, Yuyang Peng, Tingting Wang, Xiaofen Fang, Lina Wang, Kai Fang
2024 J jnl
IEEE Trans. Consumer Electron.
Mingxia Yang, Jijing Cai, Zijia Yang, Xiaodong Wang, Ali Kashif Bashir, Maryam M. Al Dabel, Hailin Feng, Kai Fang
2024 conf
Internetware
Xiaodong Wang, Long Wen, Jijing Cai, Kai Fang
2024 J jnl
Ecol. Informatics
Weihai Sun, Yane Li, Hailin Feng, Xiang Weng, Yaoping Ruan, Kai Fang, Leijun Huang
2024 conf
ICC
Jinhong Zhang, Jiefan Qiu, Ke Wang, Kai Fang, Ali Kashif Bashir, Wei Wang
2024 J jnl
IEEE Internet Things J.
Jijing Cai, Tongcun Liu, Tingting Wang, Hailin Feng, Kai Fang, Ali Kashif Bashir, Wei Wang
2024 J jnl
IEEE Trans Autom. Sci. Eng.
Kai Fang, Tingting Wang, Lianghuai Tong, Xiaofen Fang, Yuanyuan Pan, Wei Wang, Jianqing Li
2024 C conf
CSCWD
Yantao Shao, Tianxiang He, Yan Mao, Kai Fang, Wei Wang, Keji Mao
2024 J jnl
Eng. Appl. Artif. Intell.
Wenxian Luo, Leijun Huang, Jiabin Shu, Hailin Feng, Wenjie Guo, Kai Xia, Kai Fang, Wei Wang
2024 conf
SmartIoT
Jijing Cai, Lina Wang, Zhihao Wen, Zijia Yang, Long Wen, Junchao Yuan, Jiangtao Deng, Kai Fang
2024 conf
SmartIoT
Junchao Yuan, Lina Wang, Jijing Cai, Zijia Yang, Jiangtao Deng, Zhihao Wen, Hailin Feng, Kai Fang
2024 J jnl
Inf. Fusion
Hailin Feng, Qing Li, Wei Wang, Ali Kashif Bashir, Amit Kumar Singh, Jinshan Xu, Kai Fang
2024 J jnl
CoRR
Qingming Lin, Rui Hu, Huaxia Li, Sensen Wu, Yadong Li, Kai Fang, Hailin Feng, Zhenhong Du, Liuchang Xu
2024 conf
ICC
Luchun Ye, Xiaoping Wu, Kai Fang, Marwan Omar, Ali Kashif Bashir, Wei Wang
2024 J jnl
IEEE Internet Things J.
Mingxia Yang, Boliang Zhang, Tingting Wang, Jijing Cai, Xiang Weng, Hailin Feng, Kai Fang
2024 C conf
CSCWD
Jijing Cai, Han Zhu, Hailin Feng, Long Wen, Wei Wang, Meilei Lv, Kai Fang
2024 C conf
CSCWD
Caipeng Gu, Jijing Cai, Zhihao Wen, Jiefan Qiu, Wei Wang, Meilei Lv, Kai Fang
2023 J jnl
Inf. Sci.
Jian Xiao, Guohui Yuan, Jinhui He, Kai Fang, Zhuoran Wang
2023 J jnl
IEEE J. Sel. Areas Commun.
Kai Fang, Jiefan Qiu, Tingting Wang, Kailu Zheng, Liyao Xing, Keji Mao, Kaikai Chi
2023 J jnl
IEEE Trans. Ind. Informatics
Tingting Wang, Kai Fang, Wei Wei, Jinyu Tian, Yuanyuan Pan, Jianqing Li
2023 conf
ICONIP (7)
Han Zhu, Huibin Wang, Chan-Tong Lam, Liyazhou Hu, Benjamin K. Ng, Kai Fang
2023 J jnl
IEEE Syst. J.
Keji Mao, Runhui Jin, Lingkang Ying, Xingda Yao, Guanglin Dai, Kai Fang
2023 J jnl
IEEE Internet Things J.
Kai Fang, Boyu Yang, Han Zhu, Zhihua Lin, Zhuoran Wang
2022 J jnl
IEEE Trans. Comput. Soc. Syst.
Kai Fang, Wei Lu, Xiaolong Zhou, Jinyu Xu, Keji Mao
2022 C conf
HPSR
Kai Fang, Tingting Wang, Penglai Guo, Xiaoling Peng, Yuanyuan Pan, Xun Yuan, Jianqing Li
2022 J jnl
IEEE Trans. Ind. Informatics
Kai Fang, Tingting Wang, Xiaolong Zhou, Yaping Ren, Hongfei Guo, Jianqing Li
2022 J jnl
IEEE Netw.
Tingting Wang, Jianqing Li, Wei Wei, Wei Wang, Kai Fang
2022 J jnl
Future Gener. Comput. Syst.
Kai Fang, Tingting Wang, Xiaochen Yuan, Chunyu Miao, Yuanyuan Pan, Jianqing Li
2022 J jnl
IEEE J. Biomed. Health Informatics
Jiefan Qiu, Xinlei Yan, Wei Wang, Wei Wei, Kai Fang
2021 J jnl
Comput. Commun.
Keji Mao, Jinyu Xu, Runhui Jin, Yuxiang Wang, Kai Fang
2021 J jnl
Ind. Robot
Xiaolong Zhou, Pinghao Wang, Sixian Chan, Kai Fang, Jianwen Fang
2019 J jnl
Int. J. Distributed Sens. Networks
Hengnian Qi, Kai Fang, Xiaoping Wu, Lili Xu, Qing Lang
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 != ""