Xiaofeng Du

49 papers A* 1A 1Journal 27Unranked 19
YearRankTypeTitle / Venue / Authors
2026 J jnl
Vis. Comput.
Gui Song Wang, Yifan He, Xiaofeng Du, Xiaozhu Xie, Wang Man, Qin Nie
2026 J jnl
Ecol. Informatics
Pengdong Gao, Diwei Zhong, Quan Qi, Chengxing Ling, Chu Qiu, Bo Wang, Xiaofeng Du, Mingliang Gao
2025 J jnl
Concurr. Comput. Pract. Exp.
Yangyang Shen, Jing Wu, Minfu Ma, Xiaofeng Du, Datian Niu
2025 A conf
CIKM
Xiaowei Tian, Xiaoyan Zhang, Xiaofeng Du, Tianbo Lu
2025 J jnl
IEEE Trans. Instrum. Meas.
Di Guo, Runmin Xu, Jialue Zhang, Jingxuan Zeng, Tianyu Qiu, Jinyu Wu, Meijin Lin, Xiaofeng Du, Xiaobo Qu
2024 J jnl
Soft Comput.
Xiaofeng Du
2024 J jnl
Algorithms
Shijuan Chen, Zongmei Li, Xiaofeng Du, Qin Nie
2024 conf
DASFAA (2)
Jiayu Zhang, Xiaoyan Zhang, Xiaofeng Du, Tianbo Lu
2024 J jnl
Comput. Biol. Medicine
Zhangjun Yun, Zhu Liu, Yang Shen, Ziyi Sun, Hongbin Zhao, Xiaofeng Du, Liyuan Lv, Yayue Zhang, Li Hou
2024 J jnl
Comput. J.
Keao Lin, Xiaozhu Xie, Wei Weng, Xiaofeng Du
2024 J jnl
Eng. Appl. Artif. Intell.
Yangyang Shen, Jing Wu, Minfu Ma, Xiaofeng Du, Hao Wu, Xianlong Fei, Datian Niu
2024 J jnl
IET Image Process.
Zhan Cong Tan, Xiaofeng Du, Wang Man, Xiaozhu Xie, Gui Song Wang, Qin Nie
2023 J jnl
IEEE Trans. Hum. Mach. Syst.
Liang Gong, Zhiyu Yang, Yihang Yao, Binhao Chen, Wenjie Wang, Xiaofeng Du, Yidong He, Chengliang Liu
2023 J jnl
EURASIP J. Adv. Signal Process.
Shenshen Fu, Yifan He, Xiaofeng Du, Yi Zhu
2023 J jnl
Comput. Electron. Agric.
Binhao Chen, Liang Gong, Chenrui Yu, Xiaofeng Du, Jianhuan Chen, Shenghan Xie, Xinyi Le, Yanming Li, Chengliang Liu
2022 J jnl
Genom. Proteom. Bioinform.
Xiuxiu Jin, Jingyang Liu, Weiping Wang, Jiangfeng Li, Guangming Liu, Ruiqi Qiu, Mingzhu Yang, Meng Liu, Lin Yang, Xiaofeng Du, Bo Lei
2021 J jnl
IET Signal Process.
Zhangren Tu, Zi Wang, Jiaying Zhan, Yihui Huang, Xiaofeng Du, Min Xiao, Xiaobo Qu, Di Guo
2021 J jnl
BMC Medical Imaging
Gushan Zeng, Yi Guo, Jiaying Zhan, Zi Wang, Zongying Lai, Xiaofeng Du, Xiaobo Qu, Di Guo
2021 J jnl
Comput. Electron. Agric.
Liang Gong, Xiaofeng Du, Kai Zhu, Chenghui Lin, Ke Lin, Tao Wang, Qiaojun Lou, Zheng Yuan, Guoqiang Huang, Chengliang Liu
2020 J jnl
Symmetry
Yifan He, Wei Cao, Xiaofeng Du, Changlin Chen
2020 conf
ICAIS (2)
Xiaofeng Du, Yueming Lu, Daoqi Han
2020 J jnl
Sensors
Daoqi Han, Xiaofeng Du, Yueming Lu
2019 J jnl
Algorithms
Di Guo, Zhangren Tu, Jiechao Wang, Min Xiao, Xiaofeng Du, Xiaobo Qu
2018 J jnl
BMC Medical Imaging
Zongying Lai, Xinlin Zhang, Di Guo, Xiaofeng Du, Yonggui Yang, Gang Guo, Zhong Chen, Xiaobo Qu
2018 J jnl
Sensors
Xiaofeng Du, Xiaobo Qu, Yifan He, Di Guo
2018 conf
ICIA
Xiaofeng Du, Wei Zhang
2017 conf
iCAST
Xiaofeng Du, Yifan He, Jianmin Li, Xiaozhu Xie
2016 J jnl
Reliab. Eng. Syst. Saf.
Bo He, Weimin Cui, Xiaofeng Du
2016 J jnl
Int. J. Web Serv. Res.
Xiaofeng Du, William Wei Song
2016 conf
WISE (2)
Xiaofeng Du, Zhan Cui
2014 conf
WISE Workshops
Xiaofeng Du, William Song
2014 J jnl
Adv. Multim.
Di Guo, Xiaobo Qu, Xiaofeng Du, Keshou Wu, Xuhui Chen
2014 conf
ICIMCS
Xiaofeng Du, Shunzhi Zhu, Jianmin Li
2013 conf
WISE Workshops
Xiaofeng Du, William Wei Song
2013 conf
EST
Emsaieb Geepalla, Behzad Bordbar, Xiaofeng Du
2011 J jnl
Int. J. Inf. Syst. Model. Des.
Xiaofeng Du, Malcolm Munro, William Song
2011 conf
ICICA (LNCS)
Tao Geng, Shoushan Luo, Yang Xin, Xiaofeng Du, Yixian Yang
2011 conf
ICE-B
Marcello Leida, Xiaofeng Du, Paul N. Taylor, Basim Majeed
2010 J jnl
Int. J. Knowl. Eng. Data Min.
William Song, Xiaofeng Du, Malcolm Munro
2009 conf
ISD
Xiaofeng Du, William Wei Song, Malcolm Munro
2009
Xiaofeng Du
2009 conf
CAR
Xiaofeng Du, Cuihua Li, Dunxu Yang
2008 conf
ISD
Xiaofeng Du, William Song, Malcolm Munro
2008 conf
CSSE (6)
Xiaofeng Du, Dunxu Yang, Cuihua Li, Jing Li
2008 A* conf
WWW
Tao Zhou, Xiaolin Zheng, William Wei Song, Xiaofeng Du, Deren Chen
2008 conf
SERVICES I
Tao Zhou, Xiaolin Zheng, William Wei Song, Xiaofeng Du, Deren Chen
2007 conf
ICWL
Xiaofeng Du, William Song, Ming Zhang
2007 conf
ISD (2)
Xiaofeng Du, William Song, Malcolm Munro
2006 conf
IAT Workshops
Xiaofeng Du, William Song, Malcolm Munro
tests/integration/test_base_extractor.py
← Index tests/integration/test_base_extractor.py python
"""
Integration tests for the base Extractor class.
"""
import pytest
import hashlib
import math
from unittest.mock import Mock, patch, MagicMock
from collections import Counter

pytestmark = [pytest.mark.integration]


class TestExtractorStaticMethods:
    """Tests for static methods in Extractor class."""

    def test_process_binary_string_printable(self):
        """Test processing a printable binary string."""
        from redb.extractors.extractor import Extractor

        # Test with printable ASCII characters
        input_bytes = b"Hello World\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "Hello World"

    def test_process_binary_string_non_printable(self):
        """Test processing a string with non-printable characters."""
        from redb.extractors.extractor import Extractor

        # Test with non-printable characters
        input_bytes = b"\x01\x02Hello\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x01" in result
        assert "\\x02" in result
        assert "Hello" in result

    def test_process_binary_string_empty(self):
        """Test processing an empty binary string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == ""

    def test_process_binary_string_all_printable(self):
        """Test processing a fully printable string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"TestString123"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "TestString123"

    def test_remove_non_utf8_valid(self):
        """Test removing non-UTF8 characters from valid UTF8 string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"Hello World"
        result = Extractor.remove_non_utf8(input_bytes)
        assert result == b"Hello World"

    def test_remove_non_utf8_with_invalid(self):
        """Test removing non-UTF8 characters from mixed string."""
        from redb.extractors.extractor import Extractor

        # Mix of valid UTF8 and invalid bytes
        input_bytes = b"Hello\xff\xfeWorld"
        result = Extractor.remove_non_utf8(input_bytes)
        # Should remove the invalid bytes
        assert b"\xff" not in result
        assert b"\xfe" not in result
        assert b"Hello" in result
        assert b"World" in result

    def test_remove_non_utf8_empty(self):
        """Test removing non-UTF8 from empty string."""
        from redb.extractors.extractor import Extractor

        result = Extractor.remove_non_utf8(b"")
        assert result == b""


class TestExtractorEntropyCalculation:
    """Tests for entropy calculation in Extractor class."""

    def test_calculate_entropy_empty_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with empty data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(b"")
            assert result == 0.0

    def test_calculate_entropy_uniform_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with uniform (low entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # All same bytes = 0 entropy
            uniform_data = b"\x00" * 256
            result = extractor.calculate_entropy(uniform_data)
            assert result == 0.0

    def test_calculate_entropy_random_data(self, elf_binary_path, mock_logger, high_entropy_data):
        """Test entropy calculation with random (high entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(high_entropy_data)
            # Random data should have entropy close to 8 (max for bytes)
            assert result > 7.0

    def test_calculate_entropy_binary_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with binary data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # Two equally distributed values = 1 bit entropy
            binary_data = b"\x00\x01" * 128
            result = extractor.calculate_entropy(binary_data)
            assert abs(result - 1.0) < 0.01

    def test_calculate_entropy_string_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with string data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # String with two equally distributed characters
            string_data = "ab" * 100
            result = extractor.calculate_entropy(string_data)
            assert abs(result - 1.0) < 0.01


class TestExtractorInitialization:
    """Tests for Extractor initialization."""

    def test_extractor_hashes_computed_on_init(self, elf_binary_path, mock_logger, known_hashes):
        """Test that hashes are computed during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert extractor.md5 == known_hashes['md5']
            assert extractor.sha1 == known_hashes['sha1']
            assert extractor.sha256 == known_hashes['sha256']

    def test_extractor_hash_dataclass_created(self, elf_binary_path, mock_logger, known_hashes):
        """Test that Hash dataclass is created during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert extractor.hash.md5 == known_hashes['md5']
            assert extractor.hash.sha1 == known_hashes['sha1']
            assert extractor.hash.sha256 == known_hashes['sha256']

    def test_extractor_binary_cached_property(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that binary content is loaded as cached property."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            # Access binary property
            binary = extractor.binary
            assert binary == elf_binary_content

            # Second access should return cached value (same id)
            assert extractor.binary is binary

    def test_extractor_with_exporters(self, elf_binary_path, mock_logger, mock_print_exporter):
        """Test extractor initialization with exporters."""
        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]
            )

            assert len(extractor.exporters) == 1
            assert extractor.exporters[0] is mock_print_exporter

    def test_extractor_with_index_prefix(self, elf_binary_path, mock_logger):
        """Test extractor initialization with custom index prefix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert "custom_prefix" in extractor.elastic_index

    def test_extractor_known_benign_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_benign flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert extractor.known_benign is True
            assert extractor.known_malicious is False

    def test_extractor_known_malicious_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_malicious flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert extractor.known_benign is False
            assert extractor.known_malicious is True


class TestExtractorExportData:
    """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()
            # Should succeed with PrintExporter
            assert result is True

    def test_export_data_no_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters configured."""
        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 (nothing to export)
            assert result is True


class TestExtractorEdgeCases:
    """Tests for edge cases in Extractor class."""

    def test_extractor_with_nonexistent_file(self, mock_logger):
        """Test extractor with non-existent file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            with pytest.raises(FileNotFoundError):
                BasicPropertiesExtractor("/nonexistent/file.bin", mock_logger)

    def test_entropy_none_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with None returns 0."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(None)
            assert result == 0.0

    def test_process_binary_string_high_bytes(self):
        """Test processing binary string with high byte values."""
        from redb.extractors.extractor import Extractor

        # Characters above 126 are non-printable
        input_bytes = b"\x7f\x80\x81\xff"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x7f" in result
        assert "\\x80" in result
        assert "\\xff" in result