Xiaobin Zhu

110 papers A* 16A 2B 3Misc 1Journal 76Unranked 12
YearRankTypeTitle / Venue / Authors
2026 J jnl
Pattern Recognit.
Hongyang Zhou, Xiaobin Zhu, Liuling Chen, Xiaoxing Zhang, Jingyan Qin, Xu-Cheng Yin
2026 A* conf
AAAI
Zheng Han, Xiaobin Zhu, Chun Yang, Jingyan Qin, Xu-Cheng Yin
2026 J jnl
Expert Syst. Appl.
Hao Liu, Xiaobin Zhu, Xu Qizhi, Chun Yang, Hongyang Zhou, Yongjie Xia, Xucheng Yin
2026 A* conf
AAAI
Shi-Xue Zhang, Hongfa Wang, Duojun Huang, Xin Li, Xiaobin Zhu, Xu-Cheng Yin
2025 J jnl
Sci. China Inf. Sci.
Zhiyu Fang, Xiaobin Zhu, Chun Yang, Hongyang Zhou, Jingyan Qin, Xu-Cheng Yin
2025 A* conf
CVPR
Henrique Morimitsu, Xiaobin Zhu, Roberto M. Cesar, Xiangyang Ji, Xu-Cheng Yin
2025 J jnl
Int. J. Comput. Vis.
Hongyang Zhou, Xiaobin Zhu, Jingyan Qin, Yu Xu, Roberto M. Cesar Jr., Xu-Cheng Yin
2025 J jnl
Neurocomputing
Jinhui Lin, Zhenyang Wei, Silei Shen, Fang Zhou, Xiaobin Zhu, Xu-Cheng Yin
2025 J jnl
CoRR
Hao Liu, Chun Yang, Zhang xiaoxing, Xiaobin Zhu
2025 J jnl
CoRR
Junyi He, Liuling Chen, Hongyang Zhou, Zhang xiaoxing, Xiaobin Zhu, Shengxiang Yu, Jingyan Qin, Xu-Cheng Yin
2025 J jnl
CoRR
Hao Liu, Chun Yang, Zhang xiaoxing, Rui Ma, Xiaobin Zhu
2025 conf
ICDAR (1)
Mengze Wei, Chun Yang, Min Liang, Fang Zhou, Xiaobin Zhu, Xu-Cheng Yin
2025 J jnl
CoRR
Hongyang Zhou, Xiaobin Zhu, Liuling Chen, Junyi He, Jingyan Qin, Xu-Cheng Yin, Xiaoxing Zhang
2025 J jnl
CoRR
Shi-Xue Zhang, Hongfa Wang, Duojun Huang, Xin Li, Xiaobin Zhu, Xu-Cheng Yin
2024 J jnl
IEEE Trans. Multim.
Shi-Xue Zhang, Chun Yang, Xiaobin Zhu, Xu-Cheng Yin
2024 conf
LREC/COLING
Zhiyu Fang, Jingyan Qin, Xiaobin Zhu, Chun Yang, Xu-Cheng Yin
2024 J jnl
CoRR
Zhiyu Fang, Jingyan Qin, Xiaobin Zhu, Chun Yang, Xu-Cheng Yin
2024 A* conf
ACM Multimedia
Zheng Han, Xiaobin Zhu, Chun Yang, Hongyang Zhou, Jingyan Qin, Xu-Cheng Yin
2024 J jnl
IEEE Trans. Image Process.
Shi-Xue Zhang, Chun Yang, Xiaobin Zhu, Hongyang Zhou, Hongfa Wang, Xu-Cheng Yin
2024 J jnl
CoRR
Shi-Xue Zhang, Chun Yang, Xiaobin Zhu, Hongyang Zhou, Hongfa Wang, Xu-Cheng Yin
2024 A* conf
CVPR
Min Liang, Jia-Wei Ma, Xiaobin Zhu, Jingyan Qin, Xu-Cheng Yin
2024 A* conf
ICRA
Henrique Morimitsu, Xiaobin Zhu, Roberto M. Cesar, Xiangyang Ji, Xu-Cheng Yin
2024 A* conf
AAAI
Henrique Morimitsu, Xiaobin Zhu, Xiangyang Ji, Xu-Cheng Yin
2024 J jnl
IET Comput. Vis.
Zheng Han, Xiaobin Zhu, Chun Yang, Zhiyu Fang, Jingyan Qin, Xucheng Yin
2024 A* conf
SIGIR
Zhiyu Fang, Shuai-Long Lei, Xiaobin Zhu, Chun Yang, Shi-Xue Zhang, Xu-Cheng Yin, Jingyan Qin
2024 J jnl
CoRR
Zhiyu Fang, Shuai-Long Lei, Xiaobin Zhu, Chun Yang, Shi-Xue Zhang, Xu-Cheng Yin, Jingyan Qin
2024 J jnl
CoRR
Shi-Xue Zhang, Hongfa Wang, Xiaobin Zhu, Weibo Gu, Tianjin Zhang, Chun Yang, Wei Liu, Xu-Cheng Yin
2023 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Xiaoyu Zhang, Changsheng Li, Haichao Shi, Xiaobin Zhu, Peng Li, Jing Dong
2023 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Shi-Xue Zhang, Xiaobin Zhu, Lei Chen, Jie-Bo Hou, Xu-Cheng Yin
2023 J jnl
Int. J. Comput. Vis.
Jianqing Zhu, Liu Liu, Yibing Zhan, Xiaobin Zhu, Huanqiang Zeng, Dacheng Tao
2023 J jnl
IEEE Trans. Image Process.
Fei Shen, Yi Xie, Jianqing Zhu, Xiaobin Zhu, Huanqiang Zeng
2023 J jnl
Appl. Intell.
Shi-Xue Zhang, Xiaobin Zhu, Jie-Bo Hou, Xu-Cheng Yin
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Min Liang, Xiaobin Zhu, Hongyang Zhou, Jingyan Qin, Xu-Cheng Yin
2023 J jnl
Pattern Recognit. Lett.
Kai Li, Xiaobin Zhu, Song-Lu Chen, Feng Chen, Xu-Cheng Yin, Lei Chen
2023 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Shi-Xue Zhang, Xiaobin Zhu, Jie-Bo Hou, Chun Yang, Xu-Cheng Yin
2023 A* conf
ICCV
Hongyang Zhou, Xiaobin Zhu, Jianqing Zhu, Zheng Han, Shi-Xue Zhang, Jingyan Qin, Xu-Cheng Yin
2023 J jnl
Pattern Recognit.
Chang Liu, Chun Yang, Haibo Qin, Xiaobin Zhu, Cheng-Lin Liu, Xu-Cheng Yin
2023 J jnl
Image Vis. Comput.
Jianqing Zhu, Hanxiao Wu, Qianqian Zhao, Huanqiang Zeng, Xiaobin Zhu, Jingchang Huang, Canhui Cai
2022 J jnl
IET Image Process.
Hanxiao Wu, Fei Shen, Jianqing Zhu, Huanqiang Zeng, Xiaobin Zhu, Zhen Lei
2022 J jnl
IEEE Internet Things J.
Fei Shen, Jianqing Zhu, Xiaobin Zhu, Jingchang Huang, Huanqiang Zeng, Zhen Lei, Canhui Cai
2022 J jnl
CoRR
Shi-Xue Zhang, Xiaobin Zhu, Chun Yang, Xu-Cheng Yin
2022 J jnl
CoRR
Shi-Xue Zhang, Xiaobin Zhu, Lei Chen, Jie-Bo Hou, Xu-Cheng Yin
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Fei Shen, Jianqing Zhu, Xiaobin Zhu, Yi Xie, Jingchang Huang
2022 J jnl
CoRR
Shi-Xue Zhang, Xiaobin Zhu, Jie-Bo Hou, Xu-Cheng Yin
2022 conf
CICAI (1)
Wenjie Pan, Hanxiao Wu, Jianqing Zhu, Huanqiang Zeng, Xiaobin Zhu
2022 J jnl
CoRR
Shi-Xue Zhang, Xiaobin Zhu, Jie-Bo Hou, Chun Yang, Xu-Cheng Yin
2022 A* conf
AAAI
Zhiyu Fang, Xiaobin Zhu, Chun Yang, Zheng Han, Jingyan Qin, Xu-Cheng Yin
2022 A* conf
ACM Multimedia
Kangneng Zhou, Xiaobin Zhu, Daiheng Gao, Kai Lee, Xinjie Li, Xu-Cheng Yin
2022 J jnl
CoRR
Kangneng Zhou, Xiaobin Zhu, Daiheng Gao, Kai Lee, Xinjie Li, Xu-Cheng Yin
2022 J jnl
Int. J. Document Anal. Recognit.
Min Liang, Jie-Bo Hou, Xiaobin Zhu, Chun Yang, Jingyan Qin
2022 J jnl
CoRR
Chang Liu, Chun Yang, Haibo Qin, Xiaobin Zhu, Jie-Bo Hou, Xu-Cheng Yin
2022 J jnl
IEEE Trans. Image Process.
Yaqi Liu, Chao Xia, Xiaobin Zhu, Shengwei Xu
2021 J jnl
Sci. China Inf. Sci.
Jianqing Zhu, Liu Liu, Xiaobin Zhu, Huanqiang Zeng
2021 A* conf
ICCV
Shi-Xue Zhang, Xiaobin Zhu, Chun Yang, Hongfa Wang, Xu-Cheng Yin
2021 J jnl
CoRR
Shi-Xue Zhang, Xiaobin Zhu, Chun Yang, Hongfa Wang, Xu-Cheng Yin
2021 J jnl
IEEE Trans. Intell. Transp. Syst.
Jie-Bo Hou, Xiaobin Zhu, Chang Liu, Chun Yang, Long-Huang Wu, Hongfa Wang, Xu-Cheng Yin
2021 conf
ICDAR (2)
Haibo Qin, Chun Yang, Xiaobin Zhu, Xu-Cheng Yin
2021 J jnl
CoRR
Fei Shen, Yi Xie, Jianqing Zhu, Xiaobin Zhu, Huanqiang Zeng
2021 J jnl
CoRR
Zhiyu Fang, Xiaobin Zhu, Chun Yang, Zheng Han, Jingyan Qin, Xu-Cheng Yin
2021 J jnl
Neurocomputing
Min Liang, Jie-Bo Hou, Xiaobin Zhu, Chun Yang, Jingyan Qin, Xu-Cheng Yin
2021 A conf
ICME
Hongyang Zhou, Xiaobin Zhu, Zheng Han, Xu-Cheng Yin
2021 J jnl
Remote. Sens.
Jie-Bo Hou, Xiaobin Zhu, Xu-Cheng Yin
2021 J jnl
Pattern Recognit.
Xiaobin Zhu, Zhuangzi Li, Jungang Lou, Qing Shen
2020 J jnl
Inf. Sci.
Xiaobin Zhu, Zhuangzi Li, Xianbo Li, Shanshan Li, Feng Dai
2020 J jnl
IEEE Internet Things J.
Jianqing Zhu, Huanqiang Zeng, Jingchang Huang, Xiaobin Zhu, Zhen Lei, Canhui Cai, Lixin Zheng
2020 J jnl
IEEE Access
Feng Dai, Lei Wang, Xiaobin Zhu, Haisheng Li, Qiang Cai
2020 A* conf
CVPR
Shi-Xue Zhang, Xiaobin Zhu, Jie-Bo Hou, Chang Liu, Chun Yang, Hongfa Wang, Xu-Cheng Yin
2020 J jnl
CoRR
Shi-Xue Zhang, Xiaobin Zhu, Jie-Bo Hou, Chang Liu, Chun Yang, Hongfa Wang, Xu-Cheng Yin
2020 J jnl
CoRR
Fei Shen, Jianqing Zhu, Xiaobin Zhu, Yi Xie, Jingchang Huang
2020 B conf
ICPR
Nuo Pang, Chun Yang, Xiaobin Zhu, Jixuan Li, Xu-Cheng Yin
2020 J jnl
IEEE Trans. Image Process.
Jie-Bo Hou, Xiaobin Zhu, Chang Liu, Kekai Sheng, Long-Huang Wu, Hongfa Wang, Xu-Cheng Yin
2020 J jnl
CoRR
Yaqi Liu, Chao Xia, Xiaobin Zhu, Shengwei Xu
2019 J jnl
J. Vis. Commun. Image Represent.
Xiaobin Zhu, Xinming Zhang, Xiaoyu Zhang, Ziyu Xue, Lei Wang
2019 J jnl
Neurocomputing
Xiaoyu Zhang, Haichao Shi, Xiaobin Zhu, Peng Li
2019 J jnl
CoRR
Xiaoyu Zhang, Changsheng Li, Haichao Shi, Xiaobin Zhu, Peng Li, Jing Dong
2019 J jnl
IEEE Trans. Inf. Forensics Secur.
Yaqi Liu, Xiaobin Zhu, Xianfeng Zhao, Yun Cao
2019 conf
ICIG (3)
Feng Dai, Zhuangzi Li, Naiguang Zhang, Qian Wang, Xiaobin Zhu, Peng Li
2019 J jnl
Multim. Tools Appl.
Xiaobin Zhu, Zhuangzi Li, Xiaoyu Zhang, Peng Li, Ziyu Xue, Lei Wang
2019 J jnl
Aust. J. Intell. Inf. Process. Syst.
Ben Xu, Chun Yang, Hongfa Wang, Xiaobin Zhu, Xu-Cheng Yin
2019 A conf
ICDAR
Miaotong Jiang, Jie-Bo Hou, Chun Yang, Xiaobin Zhu, Xu-Cheng Yin
2019 J jnl
IEEE Signal Process. Lett.
Peng Li, Xiaobin Zhu, Xiaoyu Zhang, Peng Ren, Lei Wang
2019 A* conf
AAAI
Xiaoyu Zhang, Haichao Shi, Changsheng Li, Kai Zheng, Xiaobin Zhu, Lixin Duan
2019 J jnl
CoRR
Xiaoyu Zhang, Haichao Shi, Changsheng Li, Kai Zheng, Xiaobin Zhu, Lixin Duan
2019 A* conf
AAAI
Xiaobin Zhu, Zhuangzi Li, Xiaoyu Zhang, Changsheng Li, Yaqi Liu, Ziyu Xue
2018 conf
ICIMCS
Xinming Zhang, Xiaobin Zhu, Naiguang Zhang, Haisheng Li, Qiang Cai, Lei Wang
2018 J jnl
CoRR
Yaqi Liu, Xianfeng Zhao, Xiaobin Zhu, Yun Cao
2018 conf
ICCS (3)
Xiaoyu Zhang, Shupeng Wang, Xin Jin, Xiaobin Zhu, Binbin Li
2018 J jnl
IEEE Access
Haisheng Li, Li Sun, Shuilong Dong, Xiaobin Zhu, Qiang Cai, Junping Du
2018 J jnl
Comput. Graph. Forum
Xiaobin Zhu, Zhuangzi Li, Xiaoyu Zhang, Haisheng Li, Ziyu Xue, Lei Wang
2018 B conf
ICIP
Zhuangzi Li, Xiaobin Zhu, Lei Wang, Peiyu Guo
2018 J jnl
Remote. Sens.
Peng Li, Xiaoyu Zhang, Xiaobin Zhu, Peng Ren
2018 J jnl
Remote. Sens.
Peng Li, Peng Ren, Xiaoyu Zhang, Qian Wang, Xiaobin Zhu, Lei Wang
2018 conf
BigMM
Xinming Zhang, Xiaobin Zhu, Xiaoyu Zhang, Naiguang Zhang, Peng Li, Lei Wang
2017 conf
CCCV (1)
Qiang Cai, Ziyu Xue, Xiaoyu Zhang, Xiaobin Zhu, Wei Shao, Lei Wang
2017 Misc conf
ICCS
Kai Zhang, Chao Li, Yong Wang, Xiaobin Zhu, Haiping Wang
2017 conf
ISPACS
Qian Wang, Jianqing Zhu, Wei Shao, Lei Wang, Xiaobin Zhu
2017 J jnl
Neurocomputing
Yaqi Liu, Xiaoyu Zhang, Xiaobin Zhu, Qingxiao Guan, Xianfeng Zhao
2016 J jnl
Inf. Sci.
Chunjie Zhang, Zhe Xue, Xiaobin Zhu, Huanian Wang, Qingming Huang, Qi Tian
2016 conf
INFOCOM Workshops
Xiaoyu Zhang, Zijiao Hou, Xiaobin Zhu, Guangjun Wu, Shupeng Wang
2016 J jnl
Neurocomputing
Chunjie Zhang, Yifan Zhang, Xiaobin Zhu, Zhe Xue, Lei Qin, Qingming Huang, Qi Tian
2016 A* conf
AAAI
Changsheng Li, Fan Wei, Weishan Dong, Xiangfeng Wang, Junchi Yan, Xiaobin Zhu, Qingshan Liu, Xin Zhang
2016 J jnl
Neurocomputing
Kai Zhang, Xiao-chun Yun, Xiaoyu Zhang, Xiaobin Zhu, Chao Li, Shupeng Wang
2015 J jnl
Sci. China Inf. Sci.
Xiaobin Zhu, Xin Jin, Xiaoyu Zhang, Changsheng Li, Fugang He, Lei Wang
2015 J jnl
IEEE Trans. Cybern.
Changsheng Li, Qingshan Liu, Weishan Dong, Xiaobin Zhu, Jing Liu, Hanqing Lu
2015 J jnl
Neurocomputing
Chunjie Zhang, Xiaobin Zhu, Liang Li, Yifan Zhang, Jing Liu, Qingming Huang, Qi Tian
2015 B conf
ICIP
Yaqi Liu, Qiang Cai, Xiaobin Zhu, Jian Cao, Haisheng Li
2015 J jnl
Neurocomputing
Xiaoyu Zhang, Shupeng Wang, Xiaobin Zhu, Xiao-chun Yun, Guangjun Wu, Yipeng Wang
2014 J jnl
Mach. Vis. Appl.
Xiaobin Zhu, Jing Liu, Jinqiao Wang, Hanqing Lu
2014 J jnl
Pattern Recognit.
Xiaobin Zhu, Jing Liu, Jinqiao Wang, Changsheng Li, Hanqing Lu
2012 conf
ACCV (3)
Xiaobin Zhu, Jing Liu, Jinqiao Wang, Wei Fu, Hanqing Lu
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"]