Kai Pan

78 papers A* 3A 4B 1C 4Misc 3Journal 36Unranked 26
YearRankTypeTitle / Venue / Authors
2026 J jnl
Reliab. Eng. Syst. Saf.
Shuwen Zheng, Kai Pan, Yunxia Chen, Jie Liu, Enrico Zio
2026 J jnl
Reliab. Eng. Syst. Saf.
Jie Liu, Kai Pan, Enrico Zio, Yuantao Yao
2025 J jnl
IEEE Trans. Smart Grid
Canqi Yao, Jianqiang Cheng, Kai Pan
2025 conf
ICECET
Kai Pan, Xiang Xie, Tian Zhang, Kejiang Han, Mingfei Wang, Liming Huang, Jiayu Guo, Yuantao Zhang, Haiwei Luo, Zhixuan Lan
2025 J jnl
Clust. Comput.
Kai Pan, Jiadong Dong, Chunxiang Zheng, Xiaoxiao Wang
2025 J jnl
INFORMS J. Comput.
Chong Wang, Qinghua Wu, Kai Pan, Zuo-Jun Max Shen
2025 J jnl
Int. J. Image Graph.
Kai Pan, Hongyan Chi
2025 A conf
IROS
Kai Pan, Yanhao Zhang, Liang Zhao, Shoudong Huang
2025 conf
BIBM
Jialin Li, Yiwei Ren, Kai Pan, Dong Wei, Pujin Cheng, Xian Wu, Xiaoying Tang
2025 J jnl
CoRR
Jialin Li, Yiwei Ren, Kai Pan, Dong Wei, Pujin Cheng, Xian Wu, Xiaoying Tang
2024 J jnl
Clust. Comput.
Jiadong Dong, Lin Chen, Chunxiang Zheng, Kai Pan, Qinghu Guo, Shunfeng Wu, Zhaoxiang Wang
2024 A conf
BMVC
Kai Pan, Yapeng Tian, Yinhe Han, Yiming Gan
2024 J jnl
Reliab. Eng. Syst. Saf.
Shuwen Zheng, Kai Pan, Jie Liu, Yunxia Chen
2024 conf
BIBM
Kai Pan, Li Lin, Pujin Cheng, Junyan Lyu, Xiaoying Tang
2024 J jnl
IEEE Trans Autom. Sci. Eng.
Ming Qu, Tao Ding, Chenggang Mu, Xiaosheng Zhang, Kai Pan, Mohammad Shahidehpour
2024 J jnl
IEEE Access
Chunxiang Zheng, Kai Pan, Jiadong Dong, Lin Chen, Qinghu Guo, Shunfeng Wu, Hanyun Luo, Xiaolin Zhang
2023 A* conf
ICRA
Kai Pan, Shuai Zhang, Liang Zhao, Shoudong Huang, Yanhao Zhang, Hua Wang, Qi Luo
2023 conf
MICCAI (9)
Tiancheng Li, Yang Song, Peter Walker, Kai Pan, Victor A. van de Graaf, Liang Zhao, Shoudong Huang
2023 J jnl
J. Electr. Comput. Eng.
Jiadong Dong, Kai Pan, Chunxiang Zheng, Lin Chen, Shunfeng Wu, Xiaolin Zhang
2023 J jnl
Eur. J. Oper. Res.
Abolhassan Mohammadi Fathabad, Jianqiang Cheng, Kai Pan, Boshi Yang
2023 J jnl
IEEE Trans. Netw. Sci. Eng.
Xiang Li, Tianyi Pan, Kai Pan
2023 J jnl
INFORMS J. Comput.
Ming Zhao, Nickolas K. Freeman, Kai Pan
2023 J jnl
CoRR
Kai Pan, Linyang Li, Li Lin, Pujin Cheng, Junyan Lyu, Lei Xi, Xiaoying Tang
2023 J jnl
Manuf. Serv. Oper. Manag.
Ziliang Jin, Yulan Wang, Yun Fong Lim, Kai Pan, Zuo-Jun Max Shen
2022 J jnl
INFORMS J. Comput.
Kai Pan, Ming Zhao, Chung-Lun Li, Feng Qiu
2022 conf
BigCom
Kai Pan, Weibo Kong, Xing Guo
2022 J jnl
INFORMS J. Comput.
Meysam Cheramin, Jianqiang Cheng, Ruiwei Jiang, Kai Pan
2022 conf
MICCAI (6)
Ziqi Huang, Li Lin, Pujin Cheng, Kai Pan, Xiaoying Tang
2022 J jnl
CoRR
Ziqi Huang, Li Lin, Pujin Cheng, Kai Pan, Xiaoying Tang
2022 conf
BigCom
Weibo Kong, Haohua Du, Kai Pan, Xing Guo
2022 conf
CECNet
Mo Zhou, Yiming Wu, Kai Pan, Zelin Du, Tiancheng Yi, Tianxi Sun, Zhiguo Liu, Yude Li
2022 J jnl
INFORMS J. Comput.
Kai Pan, Yongpei Guan
2022 J jnl
Remote. Sens.
Fangfang Zhang, Changkun Wang, Kai Pan, Zhiying Guo, Jie Liu, Aiai Xu, Haiyi Ma, Xianzhang Pan
2022 conf
EMBC
Kai Pan, Pujin Cheng, Ziqi Huang, Li Lin, Xiaoying Tang
2021 J jnl
IISE Trans.
Jianqiu Huang, Kai Pan, Yongpei Guan
2021 J jnl
Oper. Res.
Huaxiao Shen, Yanzhi Li, Youhua (Frank) Chen, Kai Pan
2021 J jnl
INFORMS J. Comput.
Jianqiu Huang, Kai Pan, Yongpei Guan
2020 J jnl
IISE Trans.
Yongpei Guan, Kai Pan, K. Zhou
2019 J jnl
Eur. J. Oper. Res.
Lei Fan, Kai Pan, Yongpei Guan
2019 A conf
ICDCS
Xiang Li, Tianyi Pan, Guangmo Tong, Kai Pan
2019 J jnl
IEEE Trans. Ind. Informatics
Ziliang Jin, Kai Pan, Lei Fan, Tao Ding
2017 J jnl
IEEE Trans. Ind. Informatics
Kai Pan, Yongpei Guan
2016 J jnl
Sensors
Mingrong Ren, Kai Pan, Yanhong Liu, Hongyu Guo, Xiaodong Zhang, Pu Wang
2016 C conf
ISCC
Jingting Sun, Hui Li, Jinchen An, Kai Pan, Jun Lu
2016 C conf
ISCC
Jingting Sun, Hui Li, Li Xu, Kai Pan, Weijuan Yin
2016 conf
DASC/PiCom/DataCom/CyberSciTech
Li Xu, Hui Li, Jingting Sun, Kai Pan, Guanghui Zhang
2016 J jnl
Oper. Res.
Kai Pan, Yongpei Guan
2015 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Kai Pan, Weiyang Liu, Dongcheng Wu, Hui Li
2015 C conf
ICCC
Huiling Liu, Hui Li, Chaoqi Yu, Bing Zhu, Kai Pan
2015 J jnl
Autom. Softw. Eng.
Kai Pan, Xintao Wu, Tao Xie
2015 conf
ICC Workshops
Kai Pan, Hui Li, Weiyang Liu, Dagang Li, Shuo-Yen Robert Li
2014 conf
DSP
Weiyang Liu, Yandong Wen, Kai Pan, Hui Li, Yuexian Zou
2014 conf
CSE
Lidu Qin, Hui Li, Kai Pan, Fuxing Chen, Wensheng Chen, Chaoqi Yu
2014 J jnl
ACM Trans. Softw. Eng. Methodol.
Kai Pan, Xintao Wu, Tao Xie
2014 conf
ChinaCom
Kai Pan, Hui Li, Weiyang Liu, Zhipu Zhu, Bing Zhu
2014 Misc conf
TRIDENTCOM
Weiyang Liu, Hui Li, Fuxing Chen, Kai Pan
2014 Misc conf
TRIDENTCOM
Kai Pan, Hui Li, Weiyang Liu, Zhipu Zhu, Fuxing Chen, Bing Zhu
2014 conf
ChinaCom
Kai Pan, Weiyang Liu, Hui Li
2013 conf
AST@ICSE
Kai Pan, Xintao Wu, Tao Xie
2013 B conf
IWCMC
Kai Pan, Hui Li, Shuo-Yen Robert Li, Qin Shi, Weijuan Yin
2013 J jnl
Enterp. Inf. Syst.
Chengyi Le, Xinjian Gu, Kai Pan, Feng Dai, Guoning Qi
2011 conf
DBTest
Kai Pan, Xintao Wu, Tao Xie
2011 A* conf
ASE
Kai Pan, Xintao Wu, Tao Xie
2010 conf
ICA3PP (2)
Jianzhong Zhang, Kai Pan, Yuntao Yu, Jingdong Xu
2009 conf
SNAKDD
Xiaowei Ying, Kai Pan, Xintao Wu, Ling Guo
2009 ch.
Advances in Information and Intelligent Systems
Xiaowei Ying, Xintao Wu, Kai Pan, Ling Guo
2009 J jnl
Empir. Softw. Eng.
Kai Pan, Sunghun Kim, E. James Whitehead Jr.
2008 conf
IMSCCS
Kai Pan, Ruisheng Zhang, Huarong Sun, Liangying Luo
2008 conf
IMSCCS
Ruisheng Zhang, Kai Pan, Liangying Luo, Shilin Chen
2006 A* conf
ASE
Sunghun Kim, Thomas Zimmermann, Kai Pan, E. James Whitehead Jr.
2006 C conf
SCAM
Kai Pan, Sunghun Kim, E. James Whitehead Jr.
2006 conf
SIGSOFT FSE
Sunghun Kim, Kai Pan, E. James Whitehead Jr.
2006 A conf
MSR
Sunghun Kim, Kai Pan, E. James Whitehead Jr.
2005 conf
TEFSE@ASE
Kai Pan, E. James Whitehead Jr., Guozheng Ge
2005 conf
WCRE
Sunghun Kim, Kai Pan, E. James Whitehead Jr.
2004 conf
Hypertext
E. James Whitehead Jr., Guozheng Ge, Kai Pan
2004 conf
Hypertext
Kai Pan, E. James Whitehead Jr., Guozheng Ge
2000 Misc conf
WSC
Bronislava M. Sigal, Ajay Singhal, Kai Pan, Pasan Seneviratna, Masoud M. Zadeh
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