Xiaodan Shao

103 papers B 5Journal 91Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Wenyan Ma, Lipeng Zhu, Xiaodan Shao, Rui Zhang
2026 J jnl
IEEE Commun. Lett.
Yanzhi Qian, Jingze Ding, Sujie Liu, Xiaodan Shao, Beixiong Zheng, Lipeng Zhu
2026 J jnl
IEEE Commun. Surv. Tutorials
Wenyan Ma, Lipeng Zhu, Yanhua Tan, Beixiong Zheng, Yujie Zhang, Yuchen Zhang, Keke Ying, Zhen Gao, He Sun, Xiaodan Shao, Zhenyu Xiao, Dusit Niyato, Rui Zhang
2026 J jnl
IEEE Commun. Surv. Tutorials
Lipeng Zhu, Wenyan Ma, Weidong Mei, Yong Zeng, Qingqing Wu, Boyu Ning, Zhenyu Xiao, Xiaodan Shao, Jun Zhang, Rui Zhang
2026 J jnl
IEEE Commun. Surv. Tutorials
Xiaodan Shao, Weidong Mei, Changsheng You, Qingqing Wu, Beixiong Zheng, Cheng-Xiang Wang, Junling Li, Rui Zhang, Robert Schober, Lipeng Zhu, Weihua Zhuang, Xuemin Shen
2026 J jnl
IEEE Wirel. Commun. Lett.
Ye Yao, Yan Dong, Haifan Yin, Kun Zou, Limei Hu, Xiaodan Shao
2026 J jnl
IEEE Trans. Veh. Technol.
Wen Wang, Yongming Huang, Xiaodan Shao, Cheng Zhang
2026 J jnl
IEEE Trans. Wirel. Commun.
Nan Cheng, Shuangyu Yang, Ruijin Sun, Zhisheng Yin, Xiaodan Shao, Weihua Zhuang, Xuemin Shen
2026 J jnl
CoRR
Xiaodan Shao, Chuangye Shan, Weihua Zhuang, Xuemin Shen
2026 J jnl
IEEE Trans. Wirel. Commun.
Peng Zhang, Yang Liu, Qingqing Wu, Xiaodan Shao, Wen Chen, Qingjiang Shi
2026 J jnl
CoRR
Xiaodan Shao, Yixiao Zhang, Nan Cheng, Weihua Zhuang, Xuemin Shen
2026 J jnl
IEEE Trans. Wirel. Commun.
Xiaodan Shao, Limei Hu, Yulong Sun, Xing Li, Yixiao Zhang, Jingze Ding, Xiaoming Shi, Feng Chen, Derrick Wing Kwan Ng, Robert Schober
2026 J jnl
IEEE Trans. Wirel. Commun.
Jingze Ding, Zijian Zhou, Xiaodan Shao, Bingli Jiao, Rui Zhang
2026 J jnl
IEEE J. Sel. Areas Commun.
Xiaodan Shao, Rui Zhang, Haibo Zhou, Qijun Jiang, Conghao Zhou, Weihua Zhuang, Xuemin Shen
2026 J jnl
IEEE Commun. Mag.
Jingze Ding, Zijian Zhou, Xiaodan Shao, Bingli Jiao, Rui Zhang
2026 J jnl
CoRR
Beixiong Zheng, Qingjie Wu, Xue Xiong, Yanhua Tan, Weihua Zhu, Tiantian Ma, Changsheng You, Xiaodan Shao, Lipeng Zhu, Jie Tang, Robert Schober, Kai-Kit Wong, Rui Zhang
2026 J jnl
IEEE Trans. Wirel. Commun.
Qijun Jiang, Xiaodan Shao, Rui Zhang
2026 J jnl
IEEE Wirel. Commun. Lett.
Weijia Wang, Changsheng You, Xiaodan Shao, Rui Zhang
2025 J jnl
IEEE Trans. Wirel. Commun.
Xiaodan Shao, Qijun Jiang, Rui Zhang
2025 J jnl
IEEE J. Sel. Areas Commun.
Xiaodan Shao, Rui Zhang, Qijun Jiang, Robert Schober
2025 J jnl
IEEE Commun. Mag.
Xiaodan Shao, Rui Zhang
2025 J jnl
IEEE Wirel. Commun. Lett.
Xiaoming Shi, Xiaodan Shao, Beixiong Zheng, Rui Zhang
2025 J jnl
CoRR
Qi Dai, Beixiong Zheng, Qiyao Wang, Xue Xiong, Xiaodan Shao, Lipeng Zhu, Rui Zhang
2025 J jnl
CoRR
Lipeng Zhu, Wenyan Ma, Weidong Mei, Yong Zeng, Qingqing Wu, Boyu Ning, Zhenyu Xiao, Xiaodan Shao, Jun Zhang, Rui Zhang
2025 J jnl
CoRR
Xiaodan Shao, Weidong Mei, Changsheng You, Qingqing Wu, Beixiong Zheng, Cheng-Xiang Wang, Junling Li, Rui Zhang, Robert Schober, Lipeng Zhu, Weihua Zhuang, Xuemin Shen
2025 conf
ICC
Xiaodan Shao, Rui Zhang, Jihong Park, Tony Q. S. Quek, Robert Schober, Xuemin Shen
2025 J jnl
CoRR
Xiaodan Shao, Rui Zhang, Jihong Park, Tony Q. S. Quek, Robert Schober, Xuemin Shen
2025 J jnl
IEEE J. Sel. Top. Signal Process.
Xiaodan Shao, Rui Zhang, Qijun Jiang, Jihong Park, Tony Q. S. Quek, Robert Schober
2025 J jnl
CoRR
Xue Xiong, Beixiong Zheng, Wen Wu, Xiaodan Shao, Liang Dai, Ming-Min Zhao, Jie Tang
2025 J jnl
IEEE Wirel. Commun. Lett.
Xue Xiong, Beixiong Zheng, Wen Wu, Xiaodan Shao, Liang Dai, Ming-Min Zhao, Jie Tang
2025 J jnl
IEEE Wirel. Commun. Lett.
Xiaodan Shao, Rui Zhang, Robert Schober
2025 J jnl
CoRR
Yunli Li, Xiaoming Shi, Xiaodan Shao, Jie Xu, Rui Zhang
2025 J jnl
IEEE Trans. Wirel. Commun.
Yumeng Zhang, Xiaodan Shao, Hongyu Li, Bruno Clerckx, Rui Zhang
2025 J jnl
CoRR
Xiaodan Shao, Limei Hu, Yulong Sun, Xing Li, Yixiao Zhang, Jingze Ding, Xiaoming Shi, Feng Chen, Derrick Wing Kwan Ng, Robert Schober
2025 J jnl
CoRR
Xiaodan Shao, Yixiao Zhang, Shisheng Hu, Zhixuan Tang, Mingcheng He, Xinyu Huang, Weihua Zhuang, Xuemin Shen
2025 J jnl
CoRR
Qijun Jiang, Xiaodan Shao, Rui Zhang
2025 conf
VTC2025-Fall
Shisheng Hu, Xue Qin, Conghao Zhou, Yingying Pei, Xiaodan Shao, Xinyu Huang, Xuemin Sherman Shen
2025 J jnl
IEEE Wirel. Commun. Lett.
Haozhe Wang, Xiaodan Shao, Beixiong Zheng, Xiaoming Shi, Rui Zhang
2025 J jnl
CoRR
Xiaodan Shao, Rui Zhang, Haibo Zhou, Qijun Jiang, Conghao Zhou, Weihua Zhuang, Xuemin Shen
2025 J jnl
CoRR
Jingze Ding, Zijian Zhou, Xiaodan Shao, Bingli Jiao, Rui Zhang
2025 B conf
GLOBECOM
Xiaodan Shao, Qijun Jiang, Derrick Wing Kwan Ng, Naofal Al-Dhahir
2025 J jnl
CoRR
Xiaodan Shao, Qijun Jiang, Derrick Wing Kwan Ng, Naofal Al-Dhahir
2025 J jnl
CoRR
Chao Zhou, Changsheng You, Beixiong Zheng, Xiaodan Shao, Rui Zhang
2025 J jnl
IEEE Wirel. Commun. Lett.
Chao Zhou, Changsheng You, Beixiong Zheng, Xiaodan Shao, Rui Zhang
2025 J jnl
CoRR
Qijun Jiang, Xiaodan Shao, Rui Zhang
2025 J jnl
CoRR
Xiaoming Shi, Yunli Li, Xiaodan Shao, Jie Xu, Rui Zhang
2025 J jnl
IEEE Trans. Commun.
Limei Hu, Xiaodan Shao, Tingzhi Qiu, Feng Chen, Lei Cheng, Qingqing Wu
2024 J jnl
CoRR
Xiaodan Shao, Qijun Jiang, Rui Zhang
2024 J jnl
CoRR
Xiaodan Shao, Rui Zhang, Qijun Jiang, Robert Schober
2024 J jnl
CoRR
Xiaodan Shao, Rui Zhang
2024 J jnl
CoRR
Xiaoming Shi, Xiaodan Shao, Beixiong Zheng, Rui Zhang
2024 J jnl
IEEE Wirel. Commun. Lett.
Xiaoming Shi, Xiaodan Shao, Rui Zhang
2024 J jnl
CoRR
Xiaoming Shi, Xiaodan Shao, Rui Zhang
2024 J jnl
CoRR
Xiaodan Shao, Rui Zhang, Qijun Jiang, Jihong Park, Tony Q. S. Quek, Robert Schober
2024 J jnl
CoRR
Xiaodan Shao, Rui Zhang, Robert Schober
2024 J jnl
CoRR
Yumeng Zhang, Xiaodan Shao, Hongyu Li, Bruno Clerckx, Rui Zhang
2024 J jnl
CoRR
Renwang Li, Xiaodan Shao, Shu Sun, Meixia Tao, Rui Zhang
2024 J jnl
IEEE Trans. Wirel. Commun.
Renwang Li, Xiaodan Shao, Shu Sun, Meixia Tao, Rui Zhang
2024 J jnl
IEEE Wirel. Commun.
Xiaodan Shao, Changsheng You, Rui Zhang
2024 J jnl
CoRR
Haozhe Wang, Beixiong Zheng, Xiaodan Shao, Rui Zhang
2024 J jnl
IEEE Wirel. Commun. Lett.
Haozhe Wang, Beixiong Zheng, Xiaodan Shao, Rui Zhang
2024 J jnl
Proc. IEEE
Qingqing Wu, Beixiong Zheng, Changsheng You, Lipeng Zhu, Kaiming Shen, Xiaodan Shao, Weidong Mei, Boya Di, Hongliang Zhang, Ertugrul Basar, Lingyang Song, Marco Di Renzo, Zhi-Quan Luo, Rui Zhang
2024 J jnl
CoRR
Jingze Ding, Zijian Zhou, Xiaodan Shao, Bingli Jiao, Rui Zhang
2024 J jnl
IEEE Internet Things J.
Jiapeng Li, Xiaodan Shao, Feng Chen, Shaohua Wan, Chang Liu, Zhiqiang Wei, Derrick Wing Kwan Ng
2024 J jnl
CoRR
Haozhe Wang, Xiaodan Shao, Beixiong Zheng, Xiaoming Shi, Rui Zhang
2024 J jnl
IEEE Trans. Wirel. Commun.
Xiaodan Shao, Rui Zhang
2023 conf
SPAWC
Renwang Li, Xiaodan Shao, Shu Sun, Meixia Tao, Rui Zhang
2023 J jnl
CoRR
Renwang Li, Xiaodan Shao, Shu Sun, Meixia Tao, Rui Zhang
2023 B conf
GLOBECOM
Xiaodan Shao, Rui Zhang
2023 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Feng Chen, Jiapeng Li, Yuanyuan Zhang, Xiaodan Shao, Shukai Duan
2023 J jnl
IEEE Trans. Commun.
Ming Ying, Xiaoming Chen, Xiaodan Shao
2023 J jnl
CoRR
Xiaodan Shao, Changsheng You, Rui Zhang
2023 J jnl
CoRR
Qingqing Wu, Beixiong Zheng, Changsheng You, Lipeng Zhu, Kaiming Shen, Xiaodan Shao, Weidong Mei, Boya Di, Hongliang Zhang, Ertugrul Basar, Lingyang Song, Marco Di Renzo, Zhi-Quan Luo, Rui Zhang
2023 J jnl
CoRR
Xiaodan Shao, Rui Zhang
2022 J jnl
IEEE Trans. Wirel. Commun.
Xiaodan Shao, Xiaoming Chen, Caijun Zhong, Zhaoyang Zhang
2022 J jnl
CoRR
Ming Ying, Xiaoming Chen, Xiaodan Shao
2022 J jnl
IEEE Trans. Wirel. Commun.
Xiaodan Shao, Lei Cheng, Xiaoming Chen, Chongwen Huang, Derrick Wing Kwan Ng
2022 J jnl
Sci. China Inf. Sci.
Zhihe Gao, Xiaoming Chen, Xiaodan Shao
2022 J jnl
IEEE Commun. Lett.
Xinran Zhang, Xiaodan Shao, Yabo Guo, Yanhui Lu, Lei Cheng
2022 J jnl
IEEE J. Sel. Areas Commun.
Xiaodan Shao, Changsheng You, Wenyan Ma, Xiaoming Chen, Rui Zhang
2021 B conf
GLOBECOM
Xiaodan Shao, Lei Cheng, Xiaoming Chen, Chongwen Huang, Derrick Wing Kwan Ng
2021 J jnl
CoRR
Xiaodan Shao, Lei Cheng, Xiaoming Chen, Chongwen Huang, Derrick Wing Kwan Ng
2021 conf
VTC Spring
Junjie Yao, Zhaoyang Zhang, Xiaodan Shao, Chongwen Huang, Caijun Zhong, Xiaoming Chen
2021 J jnl
CoRR
Xiaodan Shao, Xiaoming Chen, Caijun Zhong, Zhaoyang Zhang
2021 J jnl
IEEE J. Sel. Areas Commun.
Xiaodan Shao, Xiaoming Chen, Yiyang Qiang, Caijun Zhong, Zhaoyang Zhang
2021 J jnl
Sci. China Inf. Sci.
Guanghua Yu, Xiaoming Chen, Xiaodan Shao, Caijun Zhong
2020 J jnl
IEEE Trans. Signal Process.
Xiaodan Shao, Xiaoming Chen, Rundong Jia
2020 J jnl
IEEE Commun. Lett.
Yiyang Qiang, Xiaodan Shao, Xiaoming Chen
2020 J jnl
CoRR
Xiaodan Shao, Xiaoming Chen, Derrick Wing Kwan Ng, Caijun Zhong, Zhaoyang Zhang
2020 J jnl
IEEE Trans. Signal Process.
Xiaodan Shao, Xiaoming Chen, Derrick Wing Kwan Ng, Caijun Zhong, Zhaoyang Zhang
2020 B conf
GLOBECOM
Xiaodan Shao, Xiaoming Chen, Derrick Wing Kwan Ng, Caijun Zhong, Zhaoyang Zhang
2020 J jnl
CoRR
Xiaodan Shao, Xiaoming Chen, Derrick Wing Kwan Ng, Caijun Zhong, Zhaoyang Zhang
2020 conf
WCSP
Xiaodan Shao, Xiaoming Chen, Derrick Wing Kwan Ng, Caijun Zhong, Zhaoyang Zhang
2020 J jnl
CoRR
Xiaodan Shao, Xiaoming Chen, Yiyang Qiang, Caijun Zhong, Zhaoyang Zhang
2020 conf
ICC
Xiaodan Shao, Xiaoming Chen, Caijun Zhong, Zhaoyang Zhang
2020 J jnl
CoRR
Xiaodan Shao, Xiaoming Chen, Caijun Zhong, Zhaoyang Zhang
2019 J jnl
CoRR
Xiaodan Shao, Xiaoming Chen, Rundong Jia
2019 J jnl
IEEE Internet Things J.
Xiaodan Shao, Xiaoming Chen, Caijun Zhong, Junhui Zhao, Zhaoyang Zhang
2019 J jnl
Signal Process.
Xiaodan Shao, Feng Chen
2019 B conf
GLOBECOM
Xiaodan Shao, Xiaoming Chen, Rundong Jia
2019 conf
ICC
Xiaodan Shao, Xiaoming Chen, Caijun Zhong, Junhui Zhao, Zhaoyang Zhang
2017 J jnl
Sensors
Xiaodan Shao, Feng Chen, Qing Ye, Shukai Duan
2017 J jnl
Signal Process.
Feng Chen, Xiaodan Shao
tests/integration/test_pe_extractors.py
← Index tests/integration/test_pe_extractors.py python
"""
Integration tests for PE-specific extractors.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration, pytest.mark.pe]


# ============================================================================
# PEFeaturesExtractor Tests
# ============================================================================

class TestPEFeaturesExtractor:
    """Tests for PEFeaturesExtractor class."""

    def test_extract_valid_pe(self, pe_binary_path, mock_logger):
        """Test extracting features from valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.models.dataclasses import PE

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, PE)

    def test_extract_pe_type(self, pe_binary_path, mock_logger):
        """Test PE type detection (DLL, EXE, DRIVER)."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.type in ["DLL", "EXE", "DRIVER"]

    def test_extract_architecture(self, pe_binary_path, mock_logger):
        """Test architecture detection."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Architecture should be detected
            assert result.architecture is not None

    def test_extract_entry_point(self, pe_binary_path, mock_logger):
        """Test entry point extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Entry point should be a hex string
            assert result.entry_point.startswith("0x")

    def test_extract_compilation_time(self, pe_binary_path, mock_logger):
        """Test compilation time extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Compilation time should be an integer timestamp
            assert isinstance(result.compilation_time, int)
            assert result.compilation_time_utc is not None

    def test_extract_dotnet_detection(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Should be True for the test .NET binary
            assert isinstance(result.is_dotnet, bool)
            assert result.is_dotnet is True  # Test file is .NET

    def test_extract_headers(self, pe_binary_path, mock_logger):
        """Test header extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.dos_header is not None
            assert result.nt_header is not None
            assert result.file_header is not None
            assert result.optional_header is not None

    def test_extract_counts(self, pe_binary_path, mock_logger):
        """Test section/import/export counts."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert isinstance(result.number_of_sections, int)
            assert isinstance(result.number_of_imports, int)
            assert isinstance(result.number_of_exports, int)
            assert isinstance(result.number_of_resources, int)

    def test_extract_rich_header(self, pe_binary_path, mock_logger):
        """Test Rich header extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Rich header may or may not be present
            # If present, should be JSON string
            if result.rich_header_dump is not None:
                assert isinstance(result.rich_header_dump, str)

    def test_extract_version_info(self, pe_binary_path, mock_logger):
        """Test version info extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Version info may or may not be present
            if result.version_info is not None:
                assert isinstance(result.version_info, list)


# ============================================================================
# PEImportExtractor Tests
# ============================================================================

class TestPEImportExtractor:
    """Tests for PEImportExtractor class."""

    def test_extract_imports(self, pe_binary_path, mock_logger):
        """Test import extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.models.dataclasses import PEImport

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, PEImport)
                assert isinstance(result.pe_imports_total, int)

    def test_extract_import_libraries(self, pe_binary_path, mock_logger):
        """Test import library extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_libraryName is not None:
                assert isinstance(result.pe_import_libraryName, list)

    def test_extract_import_functions(self, pe_binary_path, mock_logger):
        """Test import function extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_functions is not None:
                assert isinstance(result.pe_import_functions, list)

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'library_name' in column_names
                assert 'function_name' in column_names


# ============================================================================
# PESectionExtractor Tests
# ============================================================================

class TestPESectionExtractor:
    """Tests for PESectionExtractor class."""

    def test_extract_sections(self, pe_binary_path, mock_logger):
        """Test section extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor
        from redb.models.dataclasses import PESection

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, list)
            assert len(result) > 0
            assert isinstance(result[0], PESection)

    def test_section_properties(self, pe_binary_path, mock_logger):
        """Test section property extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                section = result[0]
                assert section.section_name is not None
                assert section.section_entropy >= 0
                assert section.section_sha256 is not None
                assert section.section_md5 is not None
                assert section.section_size >= 0

    def test_section_entropy_range(self, pe_binary_path, mock_logger):
        """Test that section entropy is in valid range."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                for section in result:
                    assert 0 <= section.section_entropy <= 8

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'section_name' in column_names
                assert 'section_entropy' in column_names
                assert 'section_sha256' in column_names


# ============================================================================
# PEResourceExtractor Tests
# ============================================================================

class TestPEResourceExtractor:
    """Tests for PEResourceExtractor class."""

    def test_extract_resources(self, pe_binary_path, mock_logger):
        """Test resource extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEResourceExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no resources
            if result is not None:
                assert isinstance(result, list)

    def test_resource_properties(self, pe_binary_path, mock_logger):
        """Test resource property extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor
        from redb.models.dataclasses import PEResource

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEResourceExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                resource = result[0]
                assert isinstance(resource, PEResource)
                assert resource.resource_type is not None


# ============================================================================
# PEOverlayExtractor Tests
# ============================================================================

class TestPEOverlayExtractor:
    """Tests for PEOverlayExtractor class."""

    def test_extract_overlay(self, pe_binary_path, mock_logger):
        """Test overlay extraction."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEOverlayExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no overlay
            # If present, should have overlay properties
            if result is not None:
                assert hasattr(result, 'overlay_size')

    def test_has_overlay_check(self, pe_binary_path, mock_logger):
        """Test overlay detection."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEOverlayExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            has_overlay = extractor._has_overlay()
            assert isinstance(has_overlay, bool)


# ============================================================================
# PESignatureExtractor Tests
# ============================================================================

class TestPESignatureExtractor:
    """Tests for PESignatureExtractor class."""

    def test_extract_signature(self, pe_binary_path, mock_logger):
        """Test signature extraction."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESignatureExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if not signed
            # Result type depends on implementation

    def test_is_signed_check(self, pe_binary_path, mock_logger):
        """Test signature detection."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESignatureExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_signed = extractor._is_signed()
            assert isinstance(is_signed, bool)


# ============================================================================
# PEDotNetExtractor Tests
# ============================================================================

class TestPEDotNetExtractor:
    """Tests for PEDotNetExtractor class."""

    def test_extract_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET metadata extraction."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # The test file is a .NET binary
            if extractor._check_dotnet():
                assert result is not None

    def test_check_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_dotnet = extractor._check_dotnet()
            assert isinstance(is_dotnet, bool)
            # Test file should be .NET
            assert is_dotnet is True


# ============================================================================
# PEInconsistencyTestsExtractor Tests
# ============================================================================

class TestPEInconsistencyTestsExtractor:
    """Tests for PEInconsistencyTestsExtractor class."""

    def test_extract_inconsistency_tests(self, pe_binary_path, mock_logger):
        """Test inconsistency tests extraction."""
        from redb.extractors.pe_extractors.pe_inconsistency_tests import PEInconstistencyTestsExtractor as PEInconsistencyTestsExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEInconsistencyTestsExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # extract() returns True if tests were performed, False otherwise
            # The actual test results are stored in extractor.pe_inconsistency_tests
            # and extractor.dotnet_inconsistency_tests
            assert result in (True, False)

            if result:
                # Check that test results were stored
                assert extractor.pe_inconsistency_tests is not None or extractor.dotnet_inconsistency_tests is not None


# ============================================================================
# PEExtraFindings Tests
# ============================================================================

class TestPEExtraFindings:
    """Tests for PEExtraFindings class."""

    def test_extract_extra_findings(self, pe_binary_path, mock_logger):
        """Test extra findings extraction."""
        from redb.extractors.pe_extractors.pe_extra_findings import PEExtraFindings

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEExtraFindings(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May return None or list of findings
            if result is not None:
                assert isinstance(result, list)


# ============================================================================
# Integration Tests
# ============================================================================

class TestPEExtractorIntegration:
    """Integration tests for PE extractors."""

    def test_all_extractors_same_pe_object(self, pe_binary_path, mock_logger, pe_object):
        """Test that extractors can share the same PE object."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            # Create extractors sharing the same PE object
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger, pe=pe_object)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger, pe=pe_object)
            sections_ext = PESectionExtractor(pe_binary_path, mock_logger, pe=pe_object)

            # All should use the same PE object
            assert features_ext.pe is pe_object
            assert imports_ext.pe is pe_object
            assert sections_ext.pe is pe_object

            # All should extract successfully
            features_result = features_ext.extract()
            imports_result = imports_ext.extract()
            sections_result = sections_ext.extract()

            assert features_result is not None
            # imports and sections may be None if not present

    def test_hash_consistency_across_extractors(self, pe_binary_path, mock_logger):
        """Test that hashes are consistent across all extractors."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger)

            # Hashes should be the same
            assert features_ext.sha256 == imports_ext.sha256
            assert features_ext.md5 == imports_ext.md5
            assert features_ext.sha1 == imports_ext.sha1