Nan Pu

63 papers A* 15A 1B 3Misc 1Journal 35Unranked 8
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Image Process.
Yongguo Ling, Zihao Hu, Nan Pu, Zhun Zhong, Xudong Jiang
2026 J jnl
CoRR
Lingrui Li, Yanfeng Zhou, Nan Pu, Xin Chen, Zhun Zhong
2026 J jnl
CoRR
Jinjie Shen, Jingjing Wu, Yaxiong Wang, Lechao Cheng, Shengeng Tang, Tianrui Hui, Nan Pu, Zhun Zhong
2026 J jnl
CoRR
Dong Zhao, Qi Zang, Nan Pu, Wenjing Li, Nicu Sebe, Zhun Zhong
2026 A* conf
AAAI
Haiyang Zheng, Nan Pu, Wenjing Li, Teng Long, Nicu Sebe, Zhun Zhong
2025 A* conf
ACM Multimedia
Jinjie Shen, Yaxiong Wang, Lechao Cheng, Nan Pu, Zhun Zhong
2025 J jnl
CoRR
Jinjie Shen, Yaxiong Wang, Lechao Cheng, Nan Pu, Zhun Zhong
2025 J jnl
Comput. Vis. Image Underst.
Qi Jia, Xiaomei Feng, Wei Zhang, Yu Liu, Nan Pu, Nicu Sebe
2025 J jnl
IEEE Trans. Multim.
Yalan Qin, Nan Pu, Hanzhou Wu, Nicu Sebe
2025 J jnl
Trans. Mach. Learn. Res.
Lei Shen, Nan Pu, Zhun Zhong, Mingming Gong, Dianhai Yu, Chengqi Zhang, Bo Han
2025 J jnl
Neural Networks
Zanxi Ruan, Nan Pu, Jiangming Chen, Songqun Gao, Yanming Guo, Qiuyu Kong, Yuxiang Xie, Yingmei Wei
2025 A* conf
ACM Multimedia
Yalan Qin, Nan Pu, Hanzhou Wu, Zhaoxin Fan
2025 J jnl
CoRR
Haiyang Zheng, Nan Pu, Wenjing Li, Nicu Sebe, Zhun Zhong
2025 J jnl
CoRR
Xiao Liu, Nan Pu, Haiyang Zheng, Wenjing Li, Nicu Sebe, Zhun Zhong
2025 J jnl
IEEE Trans. Image Process.
Yalan Qin, Nan Pu, Nicu Sebe, Guorui Feng
2025 J jnl
ACM Trans. Knowl. Discov. Data
Yalan Qin, Nan Pu, Hanzhou Wu, Nicu Sebe
2025 conf
BIBM
Lingrui Li, Yanfeng Zhou, Nan Pu, Xin Chen, Zhun Zhong
2025 J jnl
CoRR
Haiyang Zheng, Nan Pu, Wenjing Li, Teng Long, Nicu Sebe, Zhun Zhong
2025 A* conf
ICML
Yalan Qin, Nan Pu, Guorui Feng, Nicu Sebe
2025 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Dong Zhao, Qi Zang, Nan Pu, Shuang Wang, Nicu Sebe, Zhun Zhong
2024 conf
PRCV (11)
Xiaoyi Han, Nan Pu, Zunlei Feng, Yijun Bei, Qifei Zhang, Lechao Cheng, Liang Xue
2024 J jnl
CoRR
Xiaoyi Han, Nan Pu, Zunlei Feng, Yijun Bei, Qifei Zhang, Lechao Cheng, Liang Xue
2024 J jnl
CoRR
Yalan Qin, Nan Pu, Hanzhou Wu, Nicu Sebe
2024 J jnl
IEEE Trans. Multim.
Yalan Qin, Nan Pu, Hanzhou Wu
2024 J jnl
IEEE Trans. Knowl. Data Eng.
Yalan Qin, Nan Pu, Hanzhou Wu
2024 A* conf
CVPR
Nan Pu, Wenjing Li, Xingyuan Ji, Yalan Qin, Nicu Sebe, Zhun Zhong
2024 conf
MMAsia
Xiaoyi Han, Yanfei Wu, Nan Pu, Zunlei Feng, Qifei Zhang, Yijun Bei, Lechao Cheng
2024 J jnl
CoRR
Xiaoyi Han, Yanfei Wu, Nan Pu, Zunlei Feng, Qifei Zhang, Yijun Bei, Lechao Cheng
2024 conf
ECCV (65)
Fengxiang Yang, Nan Pu, Wenjing Li, Zhiming Luo, Shaozi Li, Nicu Sebe, Zhun Zhong
2024 A* conf
CVPR
Yu Liu, Yaqi Cai, Qi Jia, Binglin Qiu, Weimin Wang, Nan Pu
2024 J jnl
CoRR
Yu Liu, Yaqi Cai, Qi Jia, Binglin Qiu, Weimin Wang, Nan Pu
2024 J jnl
Comput. Vis. Image Underst.
Yu Liu, Jianghao Li, Yanyi Zhang, Qi Jia, Weimin Wang, Nan Pu, Nicu Sebe
2024 A* conf
NeurIPS
Haiyang Zheng, Nan Pu, Wenjing Li, Nicu Sebe, Zhun Zhong
2024 J jnl
CoRR
Haiyang Zheng, Nan Pu, Wenjing Li, Nicu Sebe, Zhun Zhong
2024 J jnl
CoRR
Haiyang Zheng, Nan Pu, Wenjing Li, Nicu Sebe, Zhun Zhong
2024 conf
ECCV (52)
Haiyang Zheng, Nan Pu, Wenjing Li, Nicu Sebe, Zhun Zhong
2023 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Nan Pu, Zhun Zhong, Nicu Sebe, Michael S. Lew
2023 conf
PRCV (4)
Yaqi Cai, Nan Pu, Qi Jia, Weimin Wang, Yu Liu
2023 A* conf
AAAI
Mingrui Lao, Nan Pu, Yu Liu, Kai He, Erwin M. Bakker, Michael S. Lew
2023 J jnl
Appl. Intell.
Kai He, Nan Pu, Mingrui Lao, Erwin M. Bakker, Michael S. Lew
2023 A* conf
CVPR
Nan Pu, Zhun Zhong, Nicu Sebe
2023 J jnl
CoRR
Nan Pu, Zhun Zhong, Nicu Sebe
2023 A* conf
ACM Multimedia
Mingrui Lao, Nan Pu, Zhun Zhong, Nicu Sebe, Michael S. Lew
2023 J jnl
CoRR
Nan Pu, Zhun Zhong, Xinyuan Ji, Nicu Sebe
2023 J jnl
Int. J. Multim. Inf. Retr.
Kai He, Nan Pu, Mingrui Lao, Michael S. Lew
2023 B conf
ICIP
Yixuan Li, Haotian Zhao, Qi Jia, Nan Pu
2023 J jnl
IEEE Trans. Multim.
Wei Chen, Haoyang Xu, Nan Pu, Yu Liu, Mingrui Lao, Weiping Wang, Li Liu, Michael S. Lew
2023 A* conf
ACM Multimedia
Mingrui Lao, Nan Pu, Yu Liu, Zhun Zhong, Erwin M. Bakker, Nicu Sebe, Michael S. Lew
2022 J jnl
IEEE Trans. Multim.
Wei Chen, Yu Liu, Nan Pu, Weiping Wang, Li Liu, Michael S. Lew
2022 A* conf
ACM Multimedia
Nan Pu, Yu Liu, Wei Chen, Erwin M. Bakker, Michael S. Lew
2022 Misc conf
ICASSP
Mingrui Lao, Yanming Guo, Wei Chen, Nan Pu, Michael S. Lew
2021 A* conf
ACM Multimedia
Mingrui Lao, Yanming Guo, Yu Liu, Wei Chen, Nan Pu, Michael S. Lew
2021 A* conf
CVPR
Nan Pu, Wei Chen, Yu Liu, Erwin M. Bakker, Michael S. Lew
2021 J jnl
CoRR
Nan Pu, Wei Chen, Yu Liu, Erwin M. Bakker, Michael S. Lew
2021 J jnl
Neurocomputing
Mingrui Lao, Yanming Guo, Nan Pu, Wei Chen, Yu Liu, Michael S. Lew
2021 J jnl
CoRR
Theodoros Georgiou, Sebastian Schmitt, Thomas Bäck, Nan Pu, Wei Chen, Michael S. Lew
2020 B conf
ICPR
Theodoros Georgiou, Sebastian Schmitt, Thomas Bäck, Nan Pu, Wei Chen, Michael S. Lew
2020 A* conf
ACM Multimedia
Nan Pu, Wei Chen, Yu Liu, Erwin M. Bakker, Michael S. Lew
2020 J jnl
CoRR
Nan Pu, Wei Chen, Yu Liu, Erwin M. Bakker, Michael S. Lew
2019 A conf
ICME
Wei Chen, Nan Pu, Yu Liu, Erwin M. Bakker, Michael S. Lew
2019 B conf
IJCNN
Nan Pu, T. K. Georgiou, Erwin M. Bakker, Michael S. Lew
2017 conf
CCCV (2)
Shulin Xu, Nan Pu, Li Qian, Guoqiang Xiao
2017 conf
PCM (2)
Yongsheng Zhou, Nan Pu, Li Qian, Song Wu, Guoqiang Xiao
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