Ou Bai

54 papers A* 1A 3B 6C 4Journal 29Unranked 10
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Peihao Xiang, Kaida Wu, Ou Bai
2025 conf
IJCNLP-AACL (Findings)
Chaohao Lin, Kaida Wu, Peihao Xiang, Yanzhao Wu, Ou Bai
2025 C conf
ASRU
Chaohao Lin, Xu Zheng, Kaida Wu, Peihao Xiang, Ou Bai
2025 J jnl
CoRR
Chaohao Lin, Xu Zheng, Kaida Wu, Peihao Xiang, Ou Bai
2025 B conf
ICMR
Peihao Xiang, Ou Bai
2025 B conf
IJCB
Peihao Xiang, Kaida Wu, Ou Bai
2025 J jnl
CoRR
Kaida Wu, Peihao Xiang, Chaohao Lin, Lixuan Chen, Ou Bai
2024 J jnl
CoRR
Peihao Xiang, Kaida Wu, Chaohao Lin, Ou Bai
2024 J jnl
CoRR
Peihao Xiang, Chaohao Lin, Kaida Wu, Ou Bai
2023 J jnl
Biomed. Signal Process. Control.
Lin Tao, Tianao Cao, Qisong Wang, Dan Liu, Ou Bai, Jinwei Sun
2022 J jnl
Biomed. Signal Process. Control.
Meiyan Zhang, Dan Liu, Qisong Wang, Boqi Zhao, Ou Bai, Jinwei Sun
2022 J jnl
IEEE Trans. Affect. Comput.
S. M. Shafiul Hasan, Masudur R. Siddiquee, J. Sebastian Marquez, Ou Bai
2022 J jnl
IEEE Trans. Instrum. Meas.
Meiyan Zhang, Dan Liu, Qisong Wang, Boqi Zhao, Ou Bai, Jinwei Sun
2021 J jnl
Robotica
Tao Xue, Ziwei Wang, Tao Zhang, Ou Bai, Meng Zhang, Bin Han
2021 J jnl
Sensors
Moaed A. Abd, Rudy Paul, Aparna Aravelli, Ou Bai, Leonel E. Lagos, Maohua Lin, Erik D. Engeberg
2021 J jnl
IEEE Access
S. M. Shafiul Hasan, J. Sebastian Marquez, Masudur R. Siddiquee, Ding-Yu Fei, Ou Bai
2021 B conf
SMC
Tao Xue, Ming Zhang, Jie Yin, Meng Zhang, Ou Bai, Ziwei Wang, Tao Zhang
2021 B conf
SMC
S. M. Shafiul Hasan, Ou Bai
2020 A conf
IROS
Tao Xue, Ziwei Wang, Tao Zhang, Ou Bai, Meng Zhang, Bin Han
2020 J jnl
IEEE Access
Masudur R. Siddiquee, S. M. Shafiul Hasan, J. Sebastian Marquez, Rodrigo Nicolas Ramon, Ou Bai
2020 J jnl
Frontiers Inf. Technol. Electron. Eng.
Tao Xue, Zi-wei Wang, Tao Zhang, Ou Bai, Meng Zhang, Bin Han
2020 A conf
IROS
Zihao Du, Zefeng Yan, Tiantian Huang, Zhengguang Zhang, Ziquan Zhang, Ou Bai, Qin Huang, Bin Han
2020 J jnl
Biomed. Signal Process. Control.
Tianao Cao, Qisong Wang, Dan Liu, Jinwei Sun, Ou Bai
2020 conf
SII
Rodrigo Ramon, Tong Yi, Christopher Nataros, Christopher Garcia, Aparna Aravelli, Leonel E. Lagos, Ou Bai
2020 J jnl
Sensors
Masudur R. Siddiquee, Roozbeh Atri, J. Sebastian Marquez, S. M. Shafiul Hasan, Rodrigo Ramon, Ou Bai
2019 J jnl
IEEE Access
Zhenlong Man, Jinqing Li, Xiaoqiang Di, Ou Bai
2019 conf
CISP-BMEI
Peijun Lu, Ning Gao, Zhaohua Lu, Jingjing Yang, Ou Bai, Qi Li
2019 A* conf
ICRA
Bin Han, Zihao Du, Tiantian Huang, Tao Zhang, Zhiyuan Li, Ou Bai, Xuedong Chen
2019 C conf
HSI
Masudur R. Siddiquee, Tao Xue, J. Sebastian Marquez, Roozbeh Atri, Rodrigo Ramon, Robin Perry Mayrand, Connie Leung, Ou Bai
2019 C conf
ICMLA
S. M. Shafiul Hasan, Masudur R. Siddiquee, Ou Bai
2018 conf
EMBC
J. Sebastian Marquez, Roozbeh Atri, Ou Bai
2018 J jnl
Sensors
Roozbeh Atri, J. Sebastian Marquez, Connie Leung, Masudur R. Siddiquee, Douglas Murphy, Ashraf Gorgey, William Lovegreen, Ding-Yu Fei, Ou Bai
2017 J jnl
Sensors
Xin Chai, Qisong Wang, Yongping Zhao, Yongqiang Li, Dan Liu, Xin Liu, Ou Bai
2017 conf
EMBC
Roozbeh Atri, J. Sebastian Marquez, Douglas Murphy, Ashraf Gorgey, Ding-Yu Fei, John Fox, William Lovegreen, Ou Bai
2017 J jnl
ACM Trans. Embed. Comput. Syst.
Tianyi Wang, Soamar Homsi, Linwei Niu, Shaolei Ren, Ou Bai, Gang Quan, Meikang Qiu
2017 J jnl
IEEE Trans. Parallel Distributed Syst.
Soamar Homsi, Shuo Liu, Gustavo A. Chaparro-Baquero, Ou Bai, Shaolei Ren, Gang Quan
2016 conf
BioCAS
Yuan Wang, Yiping Zheng, Ou Bai, Qisong Wang, Dan Liu, Xin Liu, Jinwei Sun
2016
Ou Bai
2016 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Qiushi Han, Ming Fan, Ou Bai, Shaolei Ren, Gang Quan
2016 J jnl
Comput. Biol. Medicine
Xin Chai, Qisong Wang, Yongping Zhao, Xin Liu, Ou Bai, Yongqiang Li
2015 conf
ICT
Ou Bai, Gaoli Bi
2014 conf
VTC Spring
Ou Bai, Tiejun Lv, Hui Gao
2014 B conf
SMC
Samuel Lawoyin, Xin Liu, Ding-Yu Fei, Ou Bai
2014 C conf
ICCC
Ou Bai, Hui Gao, Tiejun Lv, Chau Yuen
2013 J jnl
J. Cogn. Neurosci.
Logan D. Schneider, Elise Houdayer, Ou Bai, Mark Hallett
2012 conf
EMBC
Wenchuan Jia, Dandan Huang, Xin Luo, Huayan Pu, Xuedong Chen, Ou Bai
2012 A conf
IROS
Wenchuan Jia, Dandan Huang, Ou Bai, Huayan Pu, Xin Luo, Xuedong Chen
2011 conf
CCMB
Dandan Huang, Kai Qian, Simon Oxenham, Ding-Yu Fei, Ou Bai
2010 J jnl
Comput. Biol. Medicine
Ding-Yu Fei, Xiaoming Zhao, Cosmin Boanca, Esther Hughes, Ou Bai, Ronald C. Merrell, Azhar Rafiq
2010 J jnl
Formaliz. Math.
Xiquan Liang, Piqing Zhao, Ou Bai
2004 B conf
CBMS
Ou Bai, Guido Nolte, Mari Zoltan, Sherry Vorbach, Mark Hallett
2001 J jnl
IEEE Trans. Biomed. Eng.
Ou Bai, Masatoshi Nakamura, Takashi Nagamine, Hiroshi Shibasaki
2000 J jnl
Artif. Life Robotics
Ou Bai, Masatoshi Nakamura, Hiroshi Shibasaki
2000 J jnl
IEEE Trans. Biomed. Eng.
Ou Bai, Masatoshi Nakamura, Akio Ikeda, Hiroshi Shibasaki
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