Weijie J. Su

111 papers A* 24A 1Journal 85Unranked 1
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Weiqing He, Xiang Li, Li Shen, Weijie J. Su, Qi Long
2026 J jnl
CoRR
Garrett G. Wen, Buxin Su, Natalie Collina, Zhun Deng, Weijie J. Su
2026 J jnl
CoRR
Yangxinyu Xie, Tao Wang, Soham Mallick, Yan Sun, Georgy Noarov, Mengxin Yu, Tanwi Mallick, Weijie J. Su, Edgar Dobriban
2026 J jnl
Oper. Res.
Weijie J. Su
2025 J jnl
CoRR
Wenlong Ji, Weizhe Yuan, Emily J. Getzen, Kyunghyun Cho, Michael I. Jordan, Song Mei, Jason Aaron Edward Weston, Weijie J. Su, Jing Xu, Linjun Zhang
2025 J jnl
CoRR
Xiang Li, Jiayi Xin, Qi Long, Weijie J. Su
2025 A* conf
ICLR
Ruochen Jin, Bojian Hou, Jiancong Xiao, Weijie J. Su, Li Shen
2025 J jnl
CoRR
Zhekun Shi, Kaizhao Liu, Qi Long, Weijie J. Su, Jiancong Xiao
2025 A* conf
ICLR
Mingzhi Wang, Chengdong Ma, Qizhi Chen, Linjian Meng, Yang Han, Jiancong Xiao, Zhaowei Zhang, Jing Huo, Weijie J. Su, Yaodong Yang
2025 J jnl
CoRR
Xiang Li, Buxin Su, Chendi Wang, Qi Long, Weijie J. Su
2025 J jnl
CoRR
Weiqing He, Xiang Li, Tianqi Shang, Li Shen, Weijie J. Su, Qi Long
2025 J jnl
CoRR
T. Tony Cai, Xiang Li, Qi Long, Weijie J. Su, Garrett Wen
2025 J jnl
CoRR
Xiang Li, Garrett Wen, Weiqing He, Jiayuan Wu, Qi Long, Weijie J. Su
2025 J jnl
J. Mach. Learn. Res.
Fan Yang, Hongyang R. Zhang, Sen Wu, Christopher Ré, Weijie J. Su
2025 A* conf
ICML
Jiancong Xiao, Bojian Hou, Zhanliang Wang, Ruochen Jin, Qi Long, Weijie J. Su, Li Shen
2025 J jnl
CoRR
Jiancong Xiao, Bojian Hou, Zhanliang Wang, Ruochen Jin, Qi Long, Weijie J. Su, Li Shen
2025 J jnl
CoRR
Kaizhao Liu, Qi Long, Zhekun Shi, Weijie J. Su, Jiancong Xiao
2025 J jnl
CoRR
Jiancong Xiao, Zhekun Shi, Kaizhao Liu, Qi Long, Weijie J. Su
2025 conf
NAACL (Long Papers)
Bowen Jiang, Yangxinyu Xie, Xiaomeng Wang, Yuan Yuan, Zhuoqun Hao, Xinyi Bai, Weijie J. Su, Camillo Jose Taylor, Tanwi Mallick
2024 J jnl
CoRR
Hangfeng He, Weijie J. Su
2024 J jnl
CoRR
Bowen Jiang, Yangxinyu Xie, Zhuoqun Hao, Xiaomeng Wang, Tanwi Mallick, Weijie J. Su, Camillo J. Taylor, Dan Roth
2024 J jnl
CoRR
Xiang Li, Feng Ruan, Huiyuan Wang, Qi Long, Weijie J. Su
2024 J jnl
CoRR
Weijie J. Su
2024 J jnl
CoRR
Xiangyu Qi, Yangsibo Huang, Yi Zeng, Edoardo Debenedetti, Jonas Geiping, Luxi He, Kaixuan Huang, Udari Madhushani, Vikash Sehwag, Weijia Shi, Boyi Wei, Tinghao Xie, Danqi Chen, Pin-Yu Chen, Jeffrey Ding, Ruoxi Jia, Jiaqi Ma, Arvind Narayanan, Weijie J. Su, Mengdi Wang, Chaowei Xiao, Bo Li, Dawn Song, Peter Henderson, Prateek Mittal
2024 J jnl
CoRR
Jiachen T. Wang, Zhun Deng, Hiroaki Chiba-Okabe, Boaz Barak, Weijie J. Su
2024 J jnl
CoRR
Buxin Su, Jiayao Zhang, Natalie Collina, Yuling Yan, Didong Li, Kyunghyun Cho, Jianqing Fan, Aaron Roth, Weijie J. Su
2024 J jnl
CoRR
Jiancong Xiao, Ruoyu Sun, Qi Long, Weijie J. Su
2024 J jnl
CoRR
Haonan Wang, James Zou, Michael Mozer, Anirudh Goyal, Alex Lamb, Linjun Zhang, Weijie J. Su, Zhun Deng, Michael Qizhe Xie, Hannah Brown, Kenji Kawaguchi
2024 J jnl
CoRR
Yangxinyu Xie, Xiang Li, Tanwi Mallick, Weijie J. Su, Ruixun Zhang
2024 J jnl
Sci. China Inf. Sci.
Weijie J. Su
2024 J jnl
CoRR
Ruochen Jin, Bojian Hou, Jiancong Xiao, Weijie J. Su, Li Shen
2024 J jnl
CoRR
Mingzhi Wang, Chengdong Ma, Qizhi Chen, Linjian Meng, Yang Han, Jiancong Xiao, Zhaowei Zhang, Jing Huo, Weijie J. Su, Yaodong Yang
2024 J jnl
CoRR
Bowen Jiang, Yangxinyu Xie, Xiaomeng Wang, Weijie J. Su, Camillo J. Taylor, Tanwi Mallick
2024 J jnl
CoRR
Chendi Wang, Yuqing Zhu, Weijie J. Su, Yu-Xiang Wang
2024 A* conf
ICML
Chendi Wang, Yuqing Zhu, Weijie J. Su, Yu-Xiang Wang
2024 J jnl
CoRR
Jiancong Xiao, Ziniu Li, Xingyu Xie, Emily J. Getzen, Cong Fang, Qi Long, Weijie J. Su
2024 J jnl
CoRR
Huiying Zhong, Zhun Deng, Weijie J. Su, Zhiwei Steven Wu, Linjun Zhang
2024 J jnl
CoRR
Xiang Li, Feng Ruan, Huiyuan Wang, Qi Long, Weijie J. Su
2024 J jnl
Trans. Mach. Learn. Res.
Matteo Sordello, Niccolò Dalmasso, Hangfeng He, Weijie J. Su
2024 A* conf
ICML
Jinho Bok, Weijie J. Su, Jason M. Altschuler
2024 J jnl
CoRR
Hiroaki Chiba-Okabe, Weijie J. Su
2024 J jnl
CoRR
Buxin Su, Weijie J. Su, Chendi Wang
2024 J jnl
CoRR
Yangxinyu Xie, Tanwi Mallick, Joshua David Bergerson, John K. Hutchison, Duane R. Verner, Jordan Branham, M. Ross Alexander, Robert B. Ross, Yan Feng, Leslie-Anne Levy, Weijie J. Su
2023 J jnl
CoRR
Rachel Cummings, Damien Desfontaines, David Evans, Roxana Geambasu, Matthew Jagielski, Yangsibo Huang, Peter Kairouz, Gautam Kamath, Sewoong Oh, Olga Ohrimenko, Nicolas Papernot, Ryan Rogers, Milan Shen, Shuang Song, Weijie J. Su, Andreas Terzis, Abhradeep Thakurta, Sergei Vassilvitskii, Yu-Xiang Wang, Li Xiong, Sergey Yekhanin, Da Yu, Huanyu Zhang, Wanrong Zhang
2023 A* conf
NeurIPS
Hua Wang, Sheng Gao, Huanyu Zhang, Weijie J. Su, Milan Shen
2023 J jnl
CoRR
Hua Wang, Sheng Gao, Huanyu Zhang, Weijie J. Su, Milan Shen
2023 A* conf
ICLR
Zhun Deng, Jiayao Zhang, Linjun Zhang, Ting Ye, Yates Coley, Weijie J. Su, James Zou
2023 J jnl
J. Mach. Learn. Res.
Weijie J. Su, Yuancheng Zhu
2023 J jnl
J. Mach. Learn. Res.
Shuxiao Chen, Qinqing Zheng, Qi Long, Weijie J. Su
2023 J jnl
Quantum
Yizhou Liu, Weijie J. Su, Tongyang Li
2023 J jnl
CoRR
Ziang Song, Tianle Cai, Jason D. Lee, Weijie J. Su
2023 A* conf
ICML
Lei Wu, Weijie J. Su
2023 J jnl
CoRR
Lei Wu, Weijie J. Su
2023 J jnl
CoRR
Yuling Yan, Weijie J. Su, Jianqing Fan
2023 A* conf
NeurIPS
Chendi Wang, Buxin Su, Jiayuan Ye, Reza Shokri, Weijie J. Su
2023 J jnl
CoRR
Chendi Wang, Buxin Su, Jiayuan Ye, Reza Shokri, Weijie J. Su
2023 J jnl
CoRR
Xinming Tu, James Zou, Weijie J. Su, Linjun Zhang
2022 J jnl
CoRR
Hangfeng He, Weijie J. Su
2022 J jnl
CoRR
Weijie J. Su
2022 A* conf
ICLR
Wenlong Ji, Yiping Lu, Yiliang Zhang, Zhun Deng, Weijie J. Su
2022 J jnl
CoRR
Hua Wang, Sheng Gao, Huanyu Zhang, Milan Shen, Weijie J. Su
2022 J jnl
CoRR
Jiayao Zhang, Hongming Zhang, Dan Roth, Weijie J. Su
2022 J jnl
CoRR
Zhun Deng, Jiayao Zhang, Linjun Zhang, Ting Ye, Yates Coley, Weijie J. Su, James Zou
2022 J jnl
CoRR
Yizhou Liu, Weijie J. Su, Tongyang Li
2022 A* conf
ICML
Jiayao Zhang, Hongming Zhang, Weijie J. Su, Dan Roth
2022 J jnl
IEEE Trans. Inf. Theory
Hua Wang, Yachong Yang, Weijie J. Su
2022 J jnl
Math. Program.
Bin Shi, Simon S. Du, Michael I. Jordan, Weijie J. Su
2022 A* conf
ICLR
Shuxiao Chen, Koby Crammer, Hangfeng He, Dan Roth, Weijie J. Su
2021 A* conf
NeurIPS
Jinshuo Dong, Weijie J. Su, Linjun Zhang
2021 J jnl
CoRR
Jinshuo Dong, Weijie J. Su, Linjun Zhang
2021 J jnl
CoRR
Shuxiao Chen, Qinqing Zheng, Qi Long, Weijie J. Su
2021 J jnl
IEEE Trans. Inf. Theory
Zhiqi Bu, Jason M. Klusowski, Cynthia Rush, Weijie J. Su
2021 J jnl
CoRR
Wenlong Ji, Yiping Lu, Yiliang Zhang, Zhun Deng, Weijie J. Su
2021 J jnl
CoRR
Zhiqi Bu, Jason M. Klusowski, Cynthia Rush, Weijie J. Su
2021 J jnl
J. Priv. Confidentiality
Cynthia Dwork, Weijie J. Su, Li Zhang
2021 J jnl
CoRR
Qinqing Zheng, Shuxiao Chen, Qi Long, Weijie J. Su
2021 A conf
AISTATS
Qinqing Zheng, Shuxiao Chen, Qi Long, Weijie J. Su
2021 A* conf
NeurIPS
Jiayao Zhang, Hua Wang, Weijie J. Su
2021 J jnl
CoRR
Jiayao Zhang, Hua Wang, Weijie J. Su
2021 J jnl
CoRR
Cong Fang, Hangfeng He, Qi Long, Weijie J. Su
2021 J jnl
CoRR
Weijie J. Su
2021 J jnl
CoRR
Zhiqi Bu, Hua Wang, Qi Long, Weijie J. Su
2021 A* conf
ICML
Gang Qiao, Weijie J. Su, Li Zhang
2021 J jnl
CoRR
Gang Qiao, Weijie J. Su, Li Zhang
2021 J jnl
CoRR
Jinshuo Dong, Aaron Roth, Weijie J. Su
2021 A* conf
ICML
Zhun Deng, Hangfeng He, Weijie J. Su
2021 J jnl
CoRR
Shuxiao Chen, Koby Crammer, Hangfeng He, Dan Roth, Weijie J. Su
2021 A* conf
NeurIPS
Weijie J. Su
2021 J jnl
CoRR
Weijie J. Su
2020 J jnl
CoRR
Zhu Li, Weijie J. Su, Dino Sejdinovic
2020 A* conf
NeurIPS
Shuxiao Chen, Hangfeng He, Weijie J. Su
2020 J jnl
CoRR
Shuxiao Chen, Hangfeng He, Weijie J. Su
2020 J jnl
CoRR
Bin Shi, Weijie J. Su, Michael I. Jordan
2020 J jnl
CoRR
Hongyang R. Zhang, Fan Yang, Sen Wu, Weijie J. Su, Christopher Ré
2020 A* conf
ICML
Qinqing Zheng, Jinshuo Dong, Qi Long, Weijie J. Su
2020 J jnl
CoRR
Qinqing Zheng, Jinshuo Dong, Qi Long, Weijie J. Su
2020 A* conf
NeurIPS
Hua Wang, Yachong Yang, Zhiqi Bu, Weijie J. Su
2020 J jnl
CoRR
Hua Wang, Yachong Yang, Zhiqi Bu, Weijie J. Su
2020 A* conf
ICLR
Hangfeng He, Weijie J. Su
2020 J jnl
CoRR
Hua Wang, Yachong Yang, Weijie J. Su
2020 J jnl
CoRR
Zhun Deng, Hangfeng He, Weijie J. Su
2020 A* conf
ICML
Zhun Deng, Hangfeng He, Jiaoyang Huang, Weijie J. Su
2020 J jnl
CoRR
Zhun Deng, Hangfeng He, Jiaoyang Huang, Weijie J. Su
2019 A* conf
NeurIPS
Bin Shi, Simon S. Du, Weijie J. Su, Michael I. Jordan
2019 J jnl
CoRR
Bin Shi, Simon S. Du, Weijie J. Su, Michael I. Jordan
2019 A* conf
NeurIPS
Zhiqi Bu, Jason M. Klusowski, Cynthia Rush, Weijie J. Su
2019 J jnl
CoRR
Zhiqi Bu, Jason M. Klusowski, Cynthia Rush, Weijie J. Su
2019 J jnl
CoRR
Zhiqi Bu, Jinshuo Dong, Qi Long, Weijie J. Su
2019 J jnl
CoRR
Jinshuo Dong, Aaron Roth, Weijie J. Su
2019 J jnl
CoRR
Hangfeng He, Weijie J. Su
2018 J jnl
CoRR
Bin Shi, Simon S. Du, Michael I. Jordan, Weijie J. Su
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