Naresh Marturi

49 papers A* 4A 7B 1Journal 31Unranked 6
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Cristiana de Farias, Luis F. C. Figueredo, Riddhiman Laha, Maxime Adjigble, Brahim Tamadazte, Rustam Stolkin, Sami Haddadin, Naresh Marturi
2025 J jnl
CoRR
Shifa Sulaiman, Amarnath H, Simon Bøgh, Naresh Marturi
2025 J jnl
Robotics
Shifa Sulaiman, Amarnath Harikumar, Simon Bøgh, Naresh Marturi
2024 A conf
IROS
Lilyan Leblanc, Raphaël Vialle, C. De Farias, E. Saghbiny, Naresh Marturi, Brahim Tamadazte
2024 J jnl
IEEE Robotics Autom. Lett.
Cristiana de Farias, Brahim Tamadazte, Maxime Adjigble, Rustam Stolkin, Naresh Marturi
2023 A* conf
ICRA
Maxime Adjigble, Brahim Tamadazte, Cristiana de Farias, Rustam Stolkin, Naresh Marturi
2023 J jnl
CoRR
Maxime Adjigble, Brahim Tamadazte, Cristiana de Farias, Rustam Stolkin, Naresh Marturi
2023 J jnl
CoRR
Maxime Adjigble, Brahim Tamadazte, Cristiana de Farias, Rustam Stolkin, Naresh Marturi
2023 B conf
SMC
Maxime Adjigble, Rustam Stolkin, Naresh Marturi
2023 J jnl
CoRR
Maxime Adjigble, Rustam Stolkin, Naresh Marturi
2023 conf
CRV
Ayush Aggarwal, Rustam Stolkin, Naresh Marturi
2023 J jnl
CoRR
Ayush Aggarwal, Rustam Stolkin, Naresh Marturi
2022 A* conf
ICRA
Jae-Hun So, Brahim Tamadazte, Naresh Marturi, Jérôme Szewczyk
2022 A* conf
ICRA
Cristiana de Farias, Brahim Tamadazte, Rustam Stolkin, Naresh Marturi
2022 J jnl
CoRR
Cristiana de Farias, Brahim Tamadazte, Rustam Stolkin, Naresh Marturi
2022 J jnl
Frontiers Robotics AI
Jae-Hun So, Stéphane Sobucki, Jérôme Szewczyk, Naresh Marturi, Brahim Tamadazte
2021 conf
CASE
Cristiana de Farias, Maxime Adjigble, Brahim Tamadazte, Rustam Stolkin, Naresh Marturi
2021 J jnl
CoRR
Cristiana de Farias, Maxime Adjigble, Brahim Tamadazte, Rustam Stolkin, Naresh Marturi
2021 J jnl
Robotics
Alireza Rastegarpanah, Rohit Ner, Rustam Stolkin, Naresh Marturi
2021 J jnl
CoRR
Cristiana de Farias, Naresh Marturi, Rustam Stolkin, Yasemin Bekiroglu
2021 J jnl
IEEE Robotics Autom. Lett.
Cristiana de Farias, Naresh Marturi, Rustam Stolkin, Yasemin Bekiroglu
2021 A conf
IROS
Maxime Adjigble, Cristiana de Farias, Rustam Stolkin, Naresh Marturi
2021 J jnl
CoRR
Maxime Adjigble, Cristiana de Farias, Rustam Stolkin, Naresh Marturi
2021 J jnl
J. Syst. Control. Eng.
Alireza Rastegarpanah, Mohamed Ahmeid, Naresh Marturi, Pierrot S. Attidekou, Muhammad Musbahu, Rohit Ner, Simon M. Lambert, Rustam Stolkin
2020 J jnl
IEEE Access
Yangyang Li, Xuan Pei, Qin Huang, Licheng Jiao, Ronghua Shang, Naresh Marturi
2020 J jnl
IEEE Access
Yangyang Li, Guangyuan Liu, Tiantian Li, Licheng Jiao, Gao Lu, Naresh Marturi
2020 J jnl
IEEE Robotics Autom. Lett.
Yasemin Bekiroglu, Naresh Marturi, Máximo A. Roa, Komlan Jean Maxime Adjigble, Tommaso Pardi, Cindy Grimm, Ravi Balasubramanian, Kaiyu Hang, Rustam Stolkin
2020 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Yangyang Li, Guangyuan Liu, Gao Lu, Licheng Jiao, Naresh Marturi, Ronghua Shang
2020 J jnl
Remote. Sens.
Ronghua Shang, Jiyu Zhang, Licheng Jiao, Yangyang Li, Naresh Marturi, Rustam Stolkin
2020 J jnl
Inf. Sci.
Yangyang Li, Shuangkang Fang, Xiaoyu Bai, Licheng Jiao, Naresh Marturi
2020 A conf
IROS
Tommaso Pardi, Vamsikrishna Maddali, Valerio Ortenzi, Rustam Stolkin, Naresh Marturi
2020 J jnl
Frontiers Robotics AI
Valerio Ortenzi, Francesca Cini, Tommaso Pardi, Naresh Marturi, Rustam Stolkin, Peter Corke, Marco Controzzi
2019 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yanqiao Chen, Licheng Jiao, Yangyang Li, Lingling Li, Dan Zhang, Bo Ren, Naresh Marturi
2019 A conf
IROS
Maxime Adjigble, Naresh Marturi, Valerio Ortenzi, Rustam Stolkin
2019 J jnl
Auton. Robots
Naresh Marturi, Marek Sewer Kopicki, Alireza Rastegarpanah, Vijaykumar Rajasekaran, Maxime Adjigble, Rustam Stolkin, Ales Leonardis, Yasemin Bekiroglu
2019 J jnl
Remote. Sens.
Yangyang Li, Ruoting Xing, Licheng Jiao, Yanqiao Chen, Yingte Chai, Naresh Marturi, Ronghua Shang
2019 conf
CASE
Valerio Ortenzi, Naresh Marturi, Vijaykumar Rajasekaran, Maxime Adjigble, Rustam Stolkin
2018 J jnl
Inf. Sci.
Xiao-Ning Shen, Leandro L. Minku, Naresh Marturi, Yi-Nan Guo, Ying Han
2018 J jnl
IEEE Trans Autom. Sci. Eng.
Naresh Marturi, Brahim Tamadazte, Sounkalo Dembélé, Nadine Piat
2018 A conf
IROS
Maxime Adjigble, Naresh Marturi, Valerio Ortenzi, Vijaykumar Rajasekaran, Peter Corke, Rustam Stolkin
2018 J jnl
Pattern Recognit.
Miao Ma, Naresh Marturi, Yibin Li, Ales Leonardis, Rustam Stolkin
2017 conf
ARSO
Alireza Rastegarpanah, Naresh Marturi, Rustam Stolkin
2016 J jnl
Comput. Vis. Image Underst.
Miao Ma, Naresh Marturi, Yibin Li, Rustam Stolkin, Ales Leonardis
2016 A conf
IROS
Valerio Ortenzi, Naresh Marturi, Rustam Stolkin, Jeffrey A. Kuo, Michael N. Mistry
2016 J jnl
IEEE Trans. Instrum. Meas.
Naresh Marturi, Brahim Tamadazte, Sounkalo Dembélé, Nadine Piat
2015 conf
Humanoids
Naresh Marturi, Valerio Ortenzi, Jingjing Xiao, Maxime Adjigble, Rustam Stolkin, Ales Leonardis
2014 A* conf
ICRA
Naresh Marturi, Brahim Tamadazte, Sounkalo Dembélé, Nadine Piat
2013 conf
CASE
Naresh Marturi, Sounkalo Dembélé, Nadine Piat
2013 A conf
IROS
Naresh Marturi, Brahim Tamadazte, Sounkalo Dembélé, Nadine Piat
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