Xiaobing Sun

31 papers A* 1A 1B 3Misc 1Journal 22Unranked 3
YearRankTypeTitle / Venue / Authors
2026 A* conf
AAAI
Junsheng Wang, Tiantian Gong, Yeyun Wu, Xiaobing Sun
2025 J jnl
IEEE Internet Things J.
Muhammad Ali Lodhi, Xiaobing Sun, Khalid Mahmood, Anum Lodhi, Youngho Park, Majid Hussain
2025 B conf
CogSci
Wei Xie, Shuoyoucheng Ma, Zhenhua Wang, Xiaobing Sun, Kai Chen, Enze Wang, Wei Liu, Hanying Tong
2025 J jnl
CoRR
Wei Xie, Shuoyoucheng Ma, Zhenhua Wang, Enze Wang, Kai Chen, Xiaobing Sun, Baosheng Wang
2025 B conf
CogSci
Shuoyoucheng Ma, Wei Xie, Zhenhua Wang, Xiaobing Sun, Kai Chen, Enze Wang, Wei Liu, Hanying Tong
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yuxuan Wang, Rufang Ti, Zhen-Hai Liu, Xiao Liu, HaiXiao Yu, Yichen Wei, Yizhe Fan, Yuyao Wang, Honglian Huang, Xiaobing Sun
2025 J jnl
CoRR
Ce Na, Kai Yang, Dengzhao Fang, Yu Li, Jingtong Gao, Chengcheng Zhu, Jiale Zhang, Xiaobing Sun, Yi Chang
2025 B conf
CogSci
Zhenhua Wang, Wei Xie, Shuoyoucheng Ma, Xiaobing Sun, Baosheng Wang, Zhihua Wen, Enze Wang, Kai Chen
2024 J jnl
CoRR
Zhang Zhang, Da Li, Geng Wu, Yaoning Li, Xiaobing Sun, Liang Wang
2024 J jnl
Sensors
Anran Nie, Zhenwei Qiu, Xiaobing Sun, Jun Zhu, Jin Hong
2023 J jnl
Remote. Sens.
Yizhe Fan, Xiaobing Sun, Rufang Ti, Honglian Huang, Xiao Liu, HaiXiao Yu
2023 J jnl
Remote. Sens.
Yichen Wei, Xiaobing Sun, Xiao Liu, Honglian Huang, Rufang Ti, Jin Hong, HaiXiao Yu, Yuxuan Wang, Yiqi Li, Yuyao Wang
2023 J jnl
Remote. Sens.
Yuxuan Wang, Xiaobing Sun, Honglian Huang, Rufang Ti, Xiao Liu, Yizhe Fan
2022 J jnl
Remote. Sens.
Qing Yan, Hu Liu, Jingjing Zhang, Xiaobing Sun, Wei Xiong, Mingmin Zou, Yi Xia, Li-Na Xun
2022 J jnl
Remote. Sens.
Yanqing Xie, Weizhen Hou, Zhengqiang Li, Sifeng Zhu, Zhenhai Liu, Jin Hong, Yan Ma, Cheng Fan, Jie Guang, Benyong Yang, Xuefeng Lei, Honglian Huang, Xiaobing Sun, Xiao Liu, Ying Zhang, Maoxin Song, Peng Zou, Yanli Qiao
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Zhengqiang Li, Yanqing Xie, Weizhen Hou, Zhenhai Liu, Zhaoguang Bai, Jin Hong, Yan Ma, Honglian Huang, Xuefeng Lei, Xiaobing Sun, Xiao Liu, Benyong Yang, Yanli Qiao, Jun Zhu, Qiang Cong, Yang Zheng, Maoxin Song, Peng Zou, Zhongzheng Hu, Jun Lin, Lanlan Fan
2022 J jnl
Remote. Sens.
Jingjing Zhang, Kai Ge, Li-Na Xun, Xiaobing Sun, Wei Xiong, Mingmin Zou, Jinqin Zhong, Teng Li
2022 A conf
WSDM
Xiaobing Sun, Wenjie Feng, Shenghua Liu, Yuyang Xie, Siddharth Bhatia, Bryan Hooi, Wenhan Wang, Xueqi Cheng
2022 J jnl
CoRR
Xiaobing Sun, Wenjie Feng, Shenghua Liu, Yuyang Xie, Siddharth Bhatia, Bryan Hooi, Wenhan Wang, Xueqi Cheng
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Zhengqiang Li, Weizhen Hou, Zhenwei Qiu, Bangyu Ge, Yanqing Xie, Jin Hong, Yan Ma, Zongren Peng, Wei Fang, Dongying Zhang, Xiaobing Sun, Yanli Qiao, Jing Yu, Wentao Yang, Jun Lin, Zhongzheng Hu
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Han Wang, Xiaobing Sun, Meiru Zhao, Leiku Yang
2021 conf
PAKDD (1)
Xiaobing Sun, Jiabao Zhang, Qiming Zhao, Shenghua Liu, Jinglei Chen, Ruoyu Zhuang, Huawei Shen, Xueqi Cheng
2021 J jnl
CoRR
Xiaobing Sun, Jiabao Zhang, Qiming Zhao, Shenghua Liu, Jinglei Chen, Ruoyu Zhuang, Huawei Shen, Xueqi Cheng
2019 J jnl
IEEE Access
Haitao He, Xiaobing Sun, Hongdou He, Guyu Zhao, Ligang He, Jiadong Ren
2017 J jnl
Remote. Sens.
Han Wang, Leiku Yang, Anjian Deng, Weibing Du, Pei Liu, Xiaobing Sun
2016 J jnl
J. Sensors
Tianquan Liang, Xiaobing Sun, Han Wang, Rufang Ti, Cunming Shu
2015 J jnl
Remote. Sens.
Lili Qie, Zhengqiang Li, Xiaobing Sun, Bin Sun, Donghui Li, Zhao Liu, Wei Huang, Han Wang, Xingfeng Chen, Weizhen Hou, Yanli Qiao
2004 conf
ICA
Wei Lu, Jian Zhang, Xiaobing Sun, Kanzo Okada
2004 Misc conf
Visualization and Data Analysis
Jiawan Zhang, Jizhou Sun, Zhigang Sun, Mingchu Li, Xiaobing Sun, Yan Liu
2004 conf
Three-Dimensional Image Capture and Applications
Xiaobing Sun, Jizhou Sun, Jiawan Zhang, Mingchu Li
1999 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xiaobing Sun, Tat Soon Yeo, Cheng Bo Zhang, Yihui Lu, Pang Shyan Kooi
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