Xiaohui Kuang

110 papers A* 9A 4B 12C 9Journal 34Unranked 42
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Tong Wang, Chi Jin, Yongkang Chen, Huan Deng, Xiaohui Kuang, Gang Zhao
2026 J jnl
Inf. Process. Manag.
Tong Wang, Chi Jin, Yongkang Chen, Huan Deng, Xiaohui Kuang, Gang Zhao
2025 conf
ACL (Findings)
Yongkang Chen, Chongyang Zhao, Jianwentian Jianwentian, Guiling Cao, Hu Li, Xiaohui Kuang
2025 J jnl
IEEE Trans. Dependable Secur. Comput.
Jianwen Tian, Haoyu Ma, Debin Gao, Xiaohui Kuang
2025 A* conf
NDSS
Jianwen Tian, Wei Kong, Debin Gao, Tong Wang, Taotao Gu, Kefan Qiu, Zhi Wang, Xiaohui Kuang
2025 A* conf
EMNLP
Yongkang Chen, Xiaohu Du, Xiaotian Zou, Chongyang Zhao, Huan Deng, Hu Li, Xiaohui Kuang
2025 conf
NLPCC (1)
Yongkang Chen, Xiaotian Zou, Tong Wang, Jianwen Tian, Hu Li, Xiaohui Kuang
2024 A* conf
ICRA
Wei Kong, Hu Li, Qianjin Du, Huayang Cao, Xiaohui Kuang
2024 A conf
ISSTA
Tong Wang, Taotao Gu, Huan Deng, Hu Li, Xiaohui Kuang, Gang Zhao
2024 J jnl
CoRR
Tong Wang, Taotao Gu, Huan Deng, Hu Li, Xiaohui Kuang, Gang Zhao
2024 J jnl
Neurocomputing
Ming Zhang, Yongkang Chen, Hu Li, Cheng Qian, Xiaohui Kuang
2024 B conf
TrustCom
Yongkang Chen, Tong Wang, Wei Kong, Taotao Gu, Guiling Cao, Xiaohui Kuang
2024 J jnl
Remote. Sens.
Yafeng Li, Changchun Li, Qian Cheng, Fuyi Duan, Weiguang Zhai, Zongpeng Li, Bohan Mao, Fan Ding, Xiaohui Kuang, Zhen Chen
2024 A* conf
NeurIPS
Jingjing Wang, Minhuan Huang, Yuanping Nie, Xiang Li, Qianjin Du, Wei Kong, Huan Deng, Xiaohui Kuang
2023 J jnl
IEEE Trans. Dependable Secur. Comput.
Zan Zhou, Changqiao Xu, Ming-Ze Wang, Xiaohui Kuang, Yirong Zhuang, Shui Yu
2023 J jnl
IEEE Trans. Computers
Tengchao Ma, Changqiao Xu, Shujie Yang, Yiting Huang, Qingzhao An, Xiaohui Kuang, Luigi Alfredo Grieco
2023 conf
DEXA (1)
Yaning Zheng, Dongxia Wang, Huayang Cao, Cheng Qian, Xiaohui Kuang, Honglin Zhuang
2023 conf
ICONIP (13)
Huan Deng, Minhuan Huang, Tong Wang, Hu Li, Jianwen Tian, Qian Yan, Xiaohui Kuang
2023 A conf
ICME
Qianjin Du, Wei Kun, Xiaohui Kuang, Xiang Li, Gang Zhao
2023 C conf
ISCC
Tong Wang, Xiaohui Kuang, Hu Li, Qianjin Du, Zhanhao Hu, Huan Deng, Gang Zhao
2023 conf
DASFAA (4)
Qianjin Du, Xiaohui Kuang, Xiang Li, Gang Zhao
2023 C conf
SEKE
Jingjing Wang, Minhuan Huang, Yuanping Nie, Xiaohui Kuang, Xiang Li, Wenjing Zhong
2023 J jnl
IEEE Trans. Inf. Forensics Secur.
Tao Zhang, Changqiao Xu, Jiahao Shen, Xiaohui Kuang, Luigi Alfredo Grieco
2023 J jnl
IEEE Trans. Ind. Informatics
Tao Zhang, Changqiao Xu, Ping Zou, Haijiang Tian, Xiaohui Kuang, Shujie Yang, Lujie Zhong, Dusit Niyato
2023 A* conf
EMNLP
Qianjin Du, Shiji Zhou, Xiaohui Kuang, Gang Zhao, Jidong Zhai
2023 conf
DSC
Hu Li, Qiongmin Ma, Ming Zhang, Xiaohui Kuang
2023 B conf
IJCNN
Tong Wang, Xiaohui Kuang, Huan Deng, Taotao Gu, Wei Kong, Jianwen Tian, Gang Zhao
2023 A* conf
USENIX Security Symposium
Jianwen Tian, Kefan Qiu, Debin Gao, Zhi Wang, Xiaohui Kuang, Gang Zhao
2023 conf
DSC
Jiahe Ji, Wei Kong, Jianwen Tian, Taotao Gu, Yuanping Nie, Xiaohui Kuang
2023 C conf
APNOMS
Wei Kong, Qianjin Du, Huayang Cao, Hu Li, Tong Wang, Jianwen Tian, Xiaohui Kuang
2023 J jnl
IEEE Trans. Dependable Secur. Comput.
Tao Zhang, Changqiao Xu, Bingchi Zhang, Xinran Li, Xiaohui Kuang, Luigi Alfredo Grieco
2023 J jnl
IEEE J. Sel. Areas Commun.
Tao Zhang, Changqiao Xu, Yibo Lian, Haijiang Tian, Jiawen Kang, Xiaohui Kuang, Dusit Niyato
2022 conf
HPCC/DSS/SmartCity/DependSys
Chenxu Wang, Ming Zhang, Jinjing Zhao, Xiaohui Kuang, Han Zhang, Xuhong Zhang
2022 conf
ICC
Tengchao Ma, Changqiao Xu, Qingzhao An, Xiaohui Kuang, Lujie Zhong, Luigi Alfredo Grieco
2022 J jnl
Int. J. Intell. Syst.
Tengchao Ma, Changqiao Xu, Shujie Yang, Yiting Huang, Xiaohui Kuang, Hong Tang, Luigi Alfredo Grieco
2022 conf
ICDIS
Chenxu Wang, Ming Zhang, Jinjing Zhao, Xiaohui Kuang
2022 conf
EMNLP (Findings)
Qianjin Du, Xiaohui Kuang, Gang Zhao
2022 A* conf
NeurIPS
Yucheng Shi, Yahong Han, Yu-an Tan, Xiaohui Kuang
2022 B conf
ICTAI
Mingyuan Ma, Hu Li, Xiaohui Kuang
2022 B conf
TrustCom
Yongkang Chen, Ming Zhang, Jin Li, Xiaohui Kuang, Xuhong Zhang, Han Zhang
2022 conf
DSC
Yabin Li, Yuanping Nie, Xiaohui Kuang
2022 conf
ESEC/SIGSOFT FSE
Taotao Gu, Xiang Li, Shuaibing Lu, Jianwen Tian, Yuanping Nie, Xiaohui Kuang, Zhechao Lin, Chenyifan Liu, Jie Liang, Yu Jiang
2022 J jnl
Int. J. Intell. Syst.
Zhi Wang, Leshi Shao, Kai Cheng, Yuanzhao Liu, Jianan Jiang, Yuanping Nie, Xiang Li, Xiaohui Kuang
2022 A* conf
IJCAI
Ming Zhang, Xiaohui Kuang, Hu Li, Zhendong Wu, Yuanping Nie, Gang Zhao
2022 J jnl
Concurr. Comput. Pract. Exp.
Qikun Zhang, Kunyuan Zhao, Xiaohui Kuang, Yongjiao Li, Yuanpan Zheng, Junling Yuan, Ruifang Wang
2022 A* conf
USENIX Security Symposium
Xuewei Feng, Qi Li, Kun Sun, Zhiyun Qian, Gang Zhao, Xiaohui Kuang, Chuanpu Fu, Ke Xu
2022 C conf
ISCC
Shangyuan Zhuang, Jiyan Sun, Hangsheng Zhang, Xiaohui Kuang, Ling Pang, Haitao Liu, Yinlong Liu
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Tao Zhang, Changqiao Xu, Bingchi Zhang, Jiahao Shen, Xiaohui Kuang, Luigi Alfredo Grieco
2021 J jnl
Inf. Sci.
Xiaohui Kuang, Xianfeng Gao, Lianfang Wang, Gang Zhao, Lishan Ke, Quanxin Zhang
2021 J jnl
Mob. Networks Appl.
Yutian Zhou, Yu-an Tan, Quanxin Zhang, Xiaohui Kuang, Yahong Han, Jingjing Hu
2021 J jnl
IEEE Internet Things J.
Changqiao Xu, Tao Zhang, Xiaohui Kuang, Zan Zhou, Shui Yu
2021 J jnl
CoRR
Yucheng Shi, Yahong Han, Yu-an Tan, Xiaohui Kuang
2021 conf
DSC
Wei Kong, Huayang Cao, Jianwen Tian, Xiaohui Kuang
2021 conf
ICIG (2)
Haitao Zhang, Yucheng Shi, Benyu Dong, Yahong Han, Yuanzhang Li, Xiaohui Kuang
2021 conf
DSC
Yabin Li, Yinfan Qin, Jianwen Tian, Taotao Gu, Yuanping Nie, Xiaohui Kuang
2021 conf
DSC
Yinfan Qin, Xiang Li, Jianwen Tian, Taotao Gu, Xiaohui Kuang
2021 J jnl
IEEE Trans. Intell. Transp. Syst.
Xianmin Wang, Xiaohui Kuang, Jin Li, Jing Li, Xiaofeng Chen, Zheli Liu
2021 B conf
IWCMC
Jiahao Shen, Tao Zhang, Bingchi Zhang, Weixiao Ji, Xiaohui Kuang, Changqiao Xu
2021 J jnl
Inf. Sci.
Yajie Wang, Haoran Lv, Xiaohui Kuang, Gang Zhao, Yu-an Tan, Quanxin Zhang, Jingjing Hu
2020 conf
ML4CS (1)
Xiangxiang Jiang, Yuxi Ma, Gang Zhao, Xiaohui Kuang, Yuanzhang Li, Ruyun Zhang
2020 C conf
QRS
Shuaibing Lu, Xiaohui Kuang, Yuanping Nie, Zhechao Lin
2020 conf
SocialSec
Jianping Yu, Gang Zhao, Xiaohui Kuang, Ruyun Zhang
2020 B conf
ISPASS
Cheng Qian, Ming Zhang, Xiaohui Kuang, Gang Zhao
2020 conf
SocialSec
Shuo Feng, Yu-an Tan, Gang Zhao, Xiaohui Kuang, Xiao Yu, Juan Wang
2020 J jnl
Pattern Recognit.
Yucheng Shi, Yahong Han, Quanxin Zhang, Xiaohui Kuang
2020 conf
ML4CS (2)
Meng Ming, Gang Zhao, Xiaohui Kuang, Lu Liu, Ruyun Zhang
2020 conf
SocialSec
Kai Yang, Ling Pang, Bo Zhang, Gang Zhao, Xiaohui Kuang
2020 conf
SocialSec
Ming Yan, Bo Zhang, Gang Zhao, Xiaohui Kuang, Lu Liu, Ruyun Zhang
2020 J jnl
J. Netw. Comput. Appl.
Yajie Wang, Yu-an Tan, Wenjiao Zhang, Yuhang Zhao, Xiaohui Kuang
2020 J jnl
Wirel. Commun. Mob. Comput.
Xiang Li, Yuanping Nie, Zhi Wang, Xiaohui Kuang, Kefan Qiu, Cheng Qian, Gang Zhao
2020 B conf
IWCMC
Tao Zhang, Changqiao Xu, Bingchi Zhang, Xiaohui Kuang, Yue Wang, Shujie Yang, Gabriel-Miro Muntean
2020 J jnl
IEEE Commun. Mag.
Zan Zhou, Xiaohui Kuang, Limin Sun, Lujie Zhong, Changqiao Xu
2020 B conf
TrustCom
Xuewei Feng, Dongxia Wang, Zhechao Lin, Xiaohui Kuang, Gang Zhao
2020 J jnl
IEEE Access
Jingjing Hu, Shuangshuang Guo, Xiaohui Kuang, Fankun Meng, Dongsheng Hu, Zhiyu Shi
2020 B conf
GLOBECOM
Tengchao Ma, Changqiao Xu, Zan Zhou, Xiaohui Kuang, Lujie Zhong, Luigi Alfredo Grieco
2020 conf
SocialSec
Lianfang Wang, Ye Wang, Gang Zhao, Lu Liu, Xiaohui Kuang
2020 conf
ICC
Zan Zhou, Changqiao Xu, Tengchao Ma, Xiaohui Kuang
2020 conf
ICONIP (5)
Ming Zhang, Hu Li, Xiaohui Kuang, Yuanping Nie, Cheng Qian, Zhendong Wu, Gang Zhao
2020 J jnl
Inf. Sci.
Jing Li, Xiaohui Kuang, Shujie Lin, Xu Ma, Yi Tang
2020 A conf
ICME
Haitao Zhang, Fan Jia, Quanxin Zhang, Yahong Han, Xiaohui Kuang, Yu-an Tan
2019 J jnl
IEEE Access
Xiaohui Kuang, Hongyi Liu, Ye Wang, Qikun Zhang, Quanxin Zhang, Jun Zheng
2019 conf
SQUADE@ESEC/SIGSOFT FSE
Jinjing Zhao, Yan Wen, Xiang Li, Ling Pang, Xiaohui Kuang, Dongxia Wang
2019 conf
ICC
Zan Zhou, Changqiao Xu, Xiaohui Kuang, Tao Zhang, Limin Sun
2019 B conf
GLOBECOM
Tao Zhang, Xiaohui Kuang, Zan Zhou, Hongquan Gao, Changqiao Xu
2019 conf
CSS (2)
Xinxin Wang, Yuanzhang Li, Quanxin Zhang, Xiaohui Kuang
2019 conf
CSS (2)
Xiaohui Kuang, Ming Zhang, Hu Li, Gang Zhao, Huayang Cao, Zhendong Wu, Xianmin Wang
2019 J jnl
Inf. Sci.
Feng Guo, Qingjie Zhao, Xuan Li, Xiaohui Kuang, Jianwei Zhang, Yahong Han, Yu-an Tan
2019 conf
CSS (1)
Yaxiao Wang, Yuanzhang Li, Quanxin Zhang, Jingjing Hu, Xiaohui Kuang
2019 C conf
ICICS
Ming Zhang, Hu Li, Xiaohui Kuang, Ling Pang, Zhendong Wu
2019 B conf
IWCMC
Tengchao Ma, Changqiao Xu, Zan Zhou, Xiaohui Kuang, Lujie Zhong
2019 J jnl
J. Parallel Distributed Comput.
Xianmin Wang, Jing Li, Xiaohui Kuang, Yu-an Tan, Jin Li
2019 A conf
ICME
Aming Wu, Yahong Han, Quanxin Zhang, Xiaohui Kuang
2019 J jnl
计算机科学
Qiang Liu, Xiaohui Kuang, Hua Chen, Xiang Li, Guangke Li
2018 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Liang Ming, Gang Zhao, Minhuan Huang, Xiaohui Kuang, Jingzhe Zhang, Huayang Cao, Fei Xu
2018 conf
DSC
Honghao Yang, Dong Liang, Xiaohui Kuang, Changqiao Xu
2018 C conf
NPC
Jinjing Zhao, Ling Pang, Xiaohui Kuang, Rong Jin
2018 conf
IScIDE
Xiaohui Kuang, Jin Li, Fei Xu
2018 conf
ICDIS
Liang Ming, Gang Zhao, Minhuan Huang, Xiaohui Kuang, Hu Li, Ming Zhang
2017 conf
ISCID (1)
Zhechao Lin, Xiang Li, Xiaohui Kuang
2016 conf
DSC
Jie Gong, Xiaohui Kuang, Qiang Liu
2016 J jnl
计算机科学
Xiaohui Kuang, Jin Li, Gang Zhao
2015 J jnl
Secur. Commun. Networks
Xiaohui Kuang, Li Liu, Qiang Liu, Xiang Li
2014 conf
WASA
Xiaohui Kuang, Bowen Li, Li Liu
2013 conf
ICT-EurAsia
Xiaohui Kuang, Xiang Li, Jinjing Zhao
2012 conf
IMIS
Qiang Liu, Li Liu, Xiaohui Kuang, Yan Wen
2011 C conf
SIN
Liang Ming, Minhuan Huang, Dongxia Wang, Xiaohui Kuang, Chunlei Wang, Xuewei Feng
2010 C conf
ICIS
Yan Wen, Minhuan Huang, Jinjing Zhao, Xiaohui Kuang
2009 conf
GCC
Gang Zhao, Xiaohui Kuang, Weimin Zheng
2009 B conf
ICPADS
Minhuan Huang, Xiaohui Kuang, Yan Wen, Hong Tang, Fei Xu
2005 conf
ICCNMC
Guangming Hu, Xiaohui Kuang, Zhenghu Gong
tests/integration/test_basicproperties.py
← Index tests/integration/test_basicproperties.py python
"""
Integration tests for the BasicPropertiesExtractor class.
"""
import pytest
import os
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration]


class TestBasicPropertiesExtractorInitialization:
    """Tests for BasicPropertiesExtractor initialization."""

    def test_initialization(self, elf_binary_path, mock_logger):
        """Test basic initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.filepath == elf_binary_path
            assert extractor.basic_properties is None
            assert extractor.is_packed is None
            assert extractor.is_fat is None
            assert extractor.parent_sha256 is None
            assert extractor.child_sha256 is None
            assert extractor.child_architecture is None
            assert extractor.child_filetype is None

    def test_initialization_with_fat_params(self, elf_binary_path, mock_logger):
        """Test initialization with FAT Mach-O parameters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123", "def456"]
            child_archs = ["x86_64", "arm64"]
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True,
                child_sha256=child_hashes,
                child_architecture=child_archs,
                child_filetype=child_types
            )

            assert extractor.is_fat is True
            assert extractor.child_sha256 == child_hashes
            assert extractor.child_architecture == child_archs
            assert extractor.child_filetype == child_types

    def test_initialization_with_parent_sha256(self, elf_binary_path, mock_logger):
        """Test initialization with parent_sha256 for slice binaries."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            parent_hash = "parent_sha256_hash_here"

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                parent_sha256=parent_hash
            )

            assert extractor.parent_sha256 == parent_hash

    def test_elastic_index_suffix(self, elf_binary_path, mock_logger):
        """Test that elastic_index has correct suffix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert "-basic_properties" in extractor.elastic_index


class TestBasicPropertiesExtractorTag:
    """Tests for tag method."""

    def test_tag_value(self, elf_binary_path, mock_logger):
        """Test that tag returns correct value."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.tag() == Tag.BASIC_PROPERTIES.value
            assert extractor.tag() == "basic_properties"


class TestBasicPropertiesExtract:
    """Tests for extract method."""

    def test_extract_elf_binary(self, elf_binary_path, mock_logger):
        """Test extracting properties from ELF binary."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.models.dataclasses import BasicProperties

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, BasicProperties)
            assert result.sample_name == os.path.basename(elf_binary_path)
            assert result.filesize > 0
            assert result.file_entropy >= 0
            assert result.filetype is not None
            assert result.filetype_mime is not None
            assert result.filetype_magika is not None

    def test_extract_pe_binary(self, pe_binary_path, mock_logger):
        """Test extracting properties from PE binary."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.models.dataclasses import BasicProperties

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

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, BasicProperties)
            assert result.filesize > 0
            # PE file should be detected
            assert "PE" in result.filetype or "executable" in result.filetype.lower()

    def test_extract_text_file(self, temp_text_file, mock_logger):
        """Test extracting properties from text file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(temp_text_file, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert "text" in result.filetype.lower() or "ASCII" in result.filetype
            assert result.file_entropy >= 0

    def test_extract_stores_in_basic_properties(self, elf_binary_path, mock_logger):
        """Test that extract stores result in basic_properties attribute."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.basic_properties is None
            result = extractor.extract()
            assert extractor.basic_properties is result


class TestBasicPropertiesFiletype:
    """Tests for file type detection."""

    def test_elf_filetype(self, elf_binary_path, mock_logger):
        """Test ELF file type detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Should detect as ELF
            assert "ELF" in result.filetype

    def test_pe_filetype_mime(self, pe_binary_path, mock_logger):
        """Test PE file type MIME detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            result = extractor.extract()

            assert result is not None
            # PE MIME types (varies by libmagic version)
            assert "dosexec" in result.filetype_mime or "x-msdownload" in result.filetype_mime or "portable-executable" in result.filetype_mime

    def test_text_filetype_mime(self, temp_text_file, mock_logger):
        """Test text file type MIME detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(temp_text_file, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Text MIME types
            assert "text" in result.filetype_mime


class TestBasicPropertiesEntropy:
    """Tests for entropy calculation in BasicPropertiesExtractor."""

    def test_entropy_reasonable_range(self, elf_binary_path, mock_logger):
        """Test that entropy is within reasonable range (0-8)."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert 0 <= result.file_entropy <= 8

    def test_entropy_rounded(self, elf_binary_path, mock_logger):
        """Test that entropy is rounded to 3 decimal places."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Check rounding to 3 decimal places
            entropy_str = str(result.file_entropy)
            if '.' in entropy_str:
                decimal_places = len(entropy_str.split('.')[1])
                assert decimal_places <= 3


class TestBasicPropertiesFilesize:
    """Tests for file size calculation."""

    def test_filesize_matches_actual(self, elf_binary_path, mock_logger):
        """Test that filesize matches actual file size."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            actual_size = os.path.getsize(elf_binary_path)
            assert result.filesize == actual_size

    def test_filesize_matches_binary_length(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that filesize matches binary content length."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result.filesize == len(elf_binary_content)


class TestBasicPropertiesPrepareExportData:
    """Tests for prepare_export_data method."""

    def test_prepare_export_elasticsearch(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            extractor.extract()

            result = extractor.prepare_export_data("ElasticsearchExporter")

            assert result is extractor.basic_properties

    def test_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            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 len(data) == 1  # One row
            assert isinstance(column_names, list)
            assert isinstance(column_type_names, list)

            # Check expected columns
            assert 'sha256' in column_names
            assert 'md5' in column_names
            assert 'sha1' in column_names
            assert 'filesize' in column_names
            assert 'file_entropy' in column_names
            assert 'filetype' in column_names
            assert 'filetype_mime' in column_names
            assert 'filetype_magika' in column_names
            # New FAT/child columns
            assert 'parent_sha256' in column_names
            assert 'child_sha256' in column_names
            assert 'child_architecture' in column_names
            assert 'child_filetype' in column_names
            assert 'is_fat' in column_names

    def test_prepare_export_clickhouse_data_types(self, elf_binary_path, mock_logger):
        """Test that ClickHouse export data has correct types."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")

            row = data[0]

            # Check that sha256 is a string with correct length
            sha256_idx = column_names.index('sha256')
            assert isinstance(row[sha256_idx], str)
            assert len(row[sha256_idx]) == 64

            # Check that filesize is an integer
            filesize_idx = column_names.index('filesize')
            assert isinstance(row[filesize_idx], int)

            # Check that file_entropy is a float
            entropy_idx = column_names.index('file_entropy')
            assert isinstance(row[entropy_idx], float)


class TestBasicPropertiesClickHouseTable:
    """Tests for get_clickhouse_table method."""

    def test_clickhouse_table_name(self, elf_binary_path, mock_logger):
        """Test correct ClickHouse table name."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.get_clickhouse_table() == "redb_basic_properties"


class TestBasicPropertiesExportData:
    """Tests for export_data method."""

    def test_export_data_with_print_exporter(self, elf_binary_path, mock_logger, mock_print_exporter, capsys):
        """Test export_data with PrintExporter."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            result = extractor.export_data()

            assert result is True

    def test_export_data_empty_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[]
            )

            result = extractor.export_data()

            # Should succeed with no exporters
            assert result is True


class TestBasicPropertiesMagika:
    """Tests for Magika file type detection."""

    def test_magika_elf_detection(self, elf_binary_path, mock_logger):
        """Test Magika detection of ELF files."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Magika should detect ELF
            assert result.filetype_magika == "elf" or "elf" in result.filetype_magika.lower()

    def test_magika_pe_detection(self, pe_binary_path, mock_logger):
        """Test Magika detection of PE files."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            result = extractor.extract()

            assert result is not None
            # Magika should detect PE
            assert "pe" in result.filetype_magika.lower() or "exe" in result.filetype_magika.lower()


class TestBasicPropertiesFATSupport:
    """Tests for FAT Mach-O and child file support."""

    def test_extract_with_fat_flag(self, elf_binary_path, mock_logger):
        """Test extraction with is_fat flag set."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True
            )

            result = extractor.extract()

            assert result is not None
            assert result.is_fat is True

    def test_extract_with_child_hashes(self, elf_binary_path, mock_logger):
        """Test extraction with child_sha256 provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123def456", "789ghi012jkl"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_sha256=child_hashes
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_sha256 == child_hashes

    def test_extract_with_child_architecture(self, elf_binary_path, mock_logger):
        """Test extraction with child_architecture provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_archs = ["x86_64", "arm64"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_architecture=child_archs
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_architecture == child_archs

    def test_extract_with_child_filetype(self, elf_binary_path, mock_logger):
        """Test extraction with child_filetype provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_filetype=child_types
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_filetype == child_types

    def test_clickhouse_export_with_fat_data(self, elf_binary_path, mock_logger):
        """Test ClickHouse export includes FAT-related fields correctly."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123", "def456"]
            child_archs = ["x86_64", "arm64"]
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True,
                child_sha256=child_hashes,
                child_architecture=child_archs,
                child_filetype=child_types,
                parent_sha256=None  # FAT container has no parent
            )
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")
            row = data[0]

            # Check FAT fields
            is_fat_idx = column_names.index('is_fat')
            assert row[is_fat_idx] is True

            child_sha256_idx = column_names.index('child_sha256')
            assert row[child_sha256_idx] == child_hashes

            child_arch_idx = column_names.index('child_architecture')
            assert row[child_arch_idx] == child_archs

            child_type_idx = column_names.index('child_filetype')
            assert row[child_type_idx] == child_types

    def test_clickhouse_export_for_slice(self, elf_binary_path, mock_logger):
        """Test ClickHouse export for a slice binary with parent_sha256."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            parent_hash = "parent_container_sha256_hash"

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                parent_sha256=parent_hash
            )
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")
            row = data[0]

            parent_idx = column_names.index('parent_sha256')
            assert row[parent_idx] == parent_hash

    def test_default_fat_fields_are_none_or_empty(self, elf_binary_path, mock_logger):
        """Test that FAT-related fields default to None/empty for non-FAT binaries."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert result.is_fat is None
            assert result.child_sha256 is None
            assert result.child_architecture is None
            assert result.child_filetype is None


@pytest.mark.unit
@pytest.mark.dataclass
class TestBasicPropertiesDataclass:
    """Tests for BasicProperties dataclass structure."""

    def test_dataclass_has_all_expected_fields(self):
        """Test that BasicProperties dataclass has all expected fields."""
        from redb.models.dataclasses import BasicProperties

        # Create a sample instance
        bp = BasicProperties(
            filename="test.exe",
            sample_name="test.exe",
            filesize=1024,
            filetype="PE32",
            filetype_mime="application/x-dosexec",
            filetype_magika="pebin",
            file_entropy=6.5
        )

        # Check required fields
        assert bp.filename == "test.exe"
        assert bp.sample_name == "test.exe"
        assert bp.filesize == 1024
        assert bp.filetype == "PE32"
        assert bp.filetype_mime == "application/x-dosexec"
        assert bp.filetype_magika == "pebin"
        assert bp.file_entropy == 6.5

        # Check optional fields default to None
        assert bp.is_packed is None
        assert bp.is_fat is None
        assert bp.child_sha256 is None
        assert bp.child_architecture is None
        assert bp.child_filetype is None

    def test_dataclass_with_optional_fat_fields(self):
        """Test BasicProperties dataclass with FAT-related optional fields."""
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="universal.app",
            sample_name="universal.app",
            filesize=2048,
            filetype="Mach-O universal",
            filetype_mime="application/x-mach-binary",
            filetype_magika="macho",
            file_entropy=7.2,
            is_fat=True,
            child_sha256=["hash1", "hash2"],
            child_architecture=["x86_64", "arm64"],
            child_filetype=["macho", "macho"]
        )

        assert bp.is_fat is True
        assert bp.child_sha256 == ["hash1", "hash2"]
        assert bp.child_architecture == ["x86_64", "arm64"]
        assert bp.child_filetype == ["macho", "macho"]