Haipeng Liu

31 papers Misc 1Journal 19Unranked 11
YearRankTypeTitle / Venue / Authors
2025 Misc conf
DICTA
Mahade Hasan, Farhana Yasmin, Haipeng Liu, Md. Mehedi Hassan, Radjabov Sukhrob Radjabovich, Yu Xue
2025 J jnl
Biomed. Signal Process. Control.
Xiaoye Zhao, Yinglan Gong, Jucheng Zhang, Haipeng Liu, Tianhai Huang, Haicheng Wei, Ling Xia, Jiandong Mao
2025 J jnl
IET Image Process.
Jianwei Liu, Liangfu Lu, Ping Wang, Haipeng Liu, Yuanchen Huang, Yunliang Zang
2025 J jnl
IEEE Access
Rishabh Anand, Adyasha Rath, Prabodh Kumar Sahoo, Prince Jain, Ganapati Panda, Xinhong Wang, Haipeng Liu
2025 J jnl
Internet Technol. Lett.
Nishat Mahdiya Khan, Pronaya Bhattacharya, Haipeng Liu, Zhu Zhu, Thippa Reddy Gadekallu
2024 J jnl
Eng. Appl. Artif. Intell.
Xinyue Lei, Fan Pan, Haipeng Liu, Peiyu He, Dingchang Zheng, Junfeng Feng
2024 J jnl
Sensors
Kehkashan Kanwal, Muhammad Asif, Syed Ghufran Khalid, Haipeng Liu, Aisha Ghazal Qurashi, Saad Abdullah
2024 J jnl
Int. J. Medical Informatics
Ling Dai, Zhijun Wu, Xiaocheng Pan, Dingchang Zheng, Mengli Kang, Mingming Zhou, Guanyu Chen, Haipeng Liu, Xin Tian
2024 J jnl
Robotics
Yi-Ler Poy, Zhi-Yu Loke, Shalini Darmaraju, Choon-Hian Goh, Ban-Hoe Kwan, Haipeng Liu, Danny Wee-Kiat Ng
2024 J jnl
IEEE Access
Ahmad Houkan, Ashwin Kumar Sahoo, Sarada Prasad Gochhayat, Prabodh Kumar Sahoo, Haipeng Liu, Syed Ghufran Khalid, Prince Jain
2024 conf
GLOBECOM (Workshops)
Pronaya Bhattacharya, Sushil Kumar Singh, Haipeng Liu, Thippa Reddy Gadekallu
2023 conf
APSIPA ASC
Shangdi Liao, Haipeng Liu, Dingchang Zheng, Fei Chen
2023 conf
EMBC
Aayushman Ghosh, Sayan Sarkar, Haipeng Liu, Subhamoy Mandal
2023 J jnl
Int. J. Appl. Math. Comput. Sci.
Min Zhou, Xiaoxiao Huang, Haipeng Liu, Dingchang Zheng
2023 J jnl
Sensors
Felipe Pineda-Alpizar, Sergio Arriola-Valverde, Mitzy Vado-Chacón, Diego Sossa-Rojas, Haipeng Liu, Dingchang Zheng
2022 conf
EMBC
Ying Zhang, Huaiyu Zhu, Haipeng Liu, Dingchang Zheng, Shaomin Zhang, Yun Pan
2022 conf
CinC
Shangdi Liao, Fei Chen, Haipeng Liu, Dingchang Zheng
2022 J jnl
Comput. Biol. Medicine
Yingyi Geng, Haipeng Liu, Xinhong Wang, Jucheng Zhang, Yinglan Gong, Dingchang Zheng, Jun Jiang, Ling Xia
2022 J jnl
Sensors
Umer Saeed, Syed Yaseen Shah, Syed Aziz Shah, Haipeng Liu, Abdullah Alhumaidi Alotaibi, Turke Althobaiti, Naeem Ramzan, Sana Ullah Jan, Jawad Ahmad, Qammer H. Abbasi
2022 conf
EMBC
Changjie Pan, Haipeng Liu, Dingchang Zheng, Fei Chen
2022 J jnl
Medical Biol. Eng. Comput.
Syed Ghufran Khalid, Syed Mehmood Ali, Haipeng Liu, Aisha Ghazal Qurashi, Uzma Ali
2022 conf
EMBC
Mingwei Ma, Guihang Fu, Minmin Wang, Haipeng Liu, Dingchang Zheng, Yun Pan, Shaomin Zhang
2021 J jnl
Sensors
Ala'aldeen Al-Halhouli, Loiy Al-Ghussain, Osama Khallouf, Alexander Rabadi, Jafar Alawadi, Haipeng Liu, Khaled Al Oweidat, Fei Chen, Dingchang Zheng
2020 J jnl
IEEE Access
Syed Ghufran Khalid, Haipeng Liu, Tahir Zia, Jufen Zhang, Fei Chen, Dingchang Zheng
2020 J jnl
Comput. Methods Programs Biomed.
Haipeng Liu, Shanxing Ou, Panli Liu, Yuhang Xu, Yinglan Gong, Ling Xia, Xinyi Leng, Thomas Wai Hong Leung, Lin Shi, Dingchang Zheng
2020 J jnl
IEEE Access
Haipeng Liu, Defeng Wang, Xinyi Leng, Dingchang Zheng, Fei Chen, Lawrence Ka Sing Wong, Lin Shi, Thomas Wai Hong Leung
2019 conf
EMBC
Haipeng Liu, Li Wang, Ka Lung Chan, Li Xiong, Xinyi Leng, Lin Shi, Thomas Wai Hong Leung, Fei Chen, Dingchang Zheng
2019 conf
EMBC
Haipeng Liu, Thomas Leung, Adian Wong, Fei Chen, Dingchang Zheng
2018 J jnl
Int. J. Medical Eng. Informatics
Haipeng Liu, Yinglan Gong, Zhiqing Chen, Shahina Pardhan, Rajshree Mootanah, Ling Xia, Dingchang Zheng
2016 conf
ICNC-FSKD
Haipeng Liu, Defeng Wang, Ka Sing Wong, Yinglan Gong, Ling Xia
2014 conf
BMEI
Haipeng Liu, Yinglan Gong, Ling Xia, Xuehan Qian
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