Rahim Kacimi

60 papers A 2B 18C 2Journal 15Unranked 21
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Mohamed Sofiane Batta, Rahim Kacimi
2025 B conf
IWCMC
Mohamed Sofiane Batta, Alexandre Moral, Rahim Kacimi
2025 conf
ICC
Lucas Bréhon-Grataloup, Rahim Kacimi, Igor Dias Da Silva, André-Luc Beylot
2025 B conf
ICCCN
Lucas Bréhon-Grataloup, Rahim Kacimi
2025 J jnl
Ad Hoc Networks
Lucas Bréhon-Grataloup, Rahim Kacimi, André-Luc Beylot
2025 B conf
Networking
Antonin Le Floch, Rahim Kacimi, Pierre Druart, Yoann Lefebvre, André-Luc Beylot
2024 J jnl
Comput. Commun.
Antonin Le Floch, Rahim Kacimi, Pierre Druart, Yoann Lefebvre, André-Luc Beylot
2024 book
Rahim Kacimi
2024 conf
VTC Spring
Youcef Kardjadja, Lucas Bréhon-Grataloup, Rahim Kacimi, André-Luc Beylot
2024 B conf
GLOBECOM
Lucas Bréhon-Grataloup, Rahim Kacimi, André-Luc Beylot
2024 B conf
IFIP Networking
Antonin Le Floch, Rahim Kacimi, Pierre Druart, Yoann Lefebvre, André-Luc Beylot
2024 conf
GIIS
Chaima Zoghlami, Rahim Kacimi, Riadh Dhaou
2024 J jnl
Ad Hoc Networks
Lucas Bréhon-Grataloup, Rahim Kacimi, André-Luc Beylot
2023 J jnl
Wirel. Networks
Chaima Zoghlami, Rahim Kacimi, Riadh Dhaou
2023 A conf
MSWiM
Antonin Le Floch, Rahim Kacimi, Pierre Druart, Yoann Lefebvre, André-Luc Beylot
2023 J jnl
Ad Hoc Networks
Mohamed Hamnache, Rahim Kacimi, André-Luc Beylot
2023 B conf
LCN
Lucas Bréhon-Grataloup, Rahim Kacimi, André-Luc Beylot
2023 J jnl
Comput. Networks
Mohamed Hamnache, Rahim Kacimi, André-Luc Beylot
2022 conf
CCNC
Chaima Zoghlami, Rahim Kacimi, Riadh Dhaou
2022 B conf
ICCCN
Lucas Bréhon-Grataloup, Rahim Kacimi, André-Luc Beylot
2022 B conf
IWCMC
Chaima Zoghlami, Rahim Kacimi, Riadh Dhaou
2022 B conf
GLOBECOM
Mohamed Hamnache, Rahim Kacimi, André-Luc Beylot
2022 J jnl
Comput. Networks
Lucas Bréhon-Grataloup, Rahim Kacimi, André-Luc Beylot
2021 B conf
IWCMC
Xiaoyan Ma, Tianyi Liu, Rahim Kacimi, Riadh Dhaou, Song Liu
2021 A conf
MSWiM
Edouard Lumet, Antonin Le Floch, Rahim Kacimi, Mathieu Lihoreau, André-Luc Beylot
2021 J jnl
Comput. Electr. Eng.
Souhila Mammeri, Mohand Yazid, Rahim Kacimi, Louiza Bouallouche-Medjkoune
2021 B conf
LCN
Mohamed Hamnache, Rahim Kacimi, André-Luc Beylot
2020 J jnl
Comput. Commun.
Ghada Jaber, Rahim Kacimi
2020 J jnl
Wirel. Networks
Ghada Jaber, Rahim Kacimi, Luigi Alfredo Grieco, Thierry Gayraud
2020 B conf
LCN
Mohamed Hamnache, Rahim Kacimi, André-Luc Beylot
2020 J jnl
Sensors
Xiaoyan Ma, Tianyi Liu, Song Liu, Rahim Kacimi, Riadh Dhaou
2019 conf
CCNC
Ghada Jaber, Rahim Kacimi, Thierry Gayraud
2018 conf
CCNC
Xiaoyan Ma, Rahim Kacimi, Riadh Dhaou
2018 conf
Wireless Days
Nassima Bouadem, Rahim Kacimi, Abdelkamel Tari
2017 conf
Wireless Days
Ghada Jaber, Rahim Kacimi, Thierry Gayraud
2017 conf
ICC
Farid Lalem, Ahcène Bounceur, Reinhardt Euler, Mohammad Hammoudeh, Rahim Kacimi, Sanaa Kawther Ghalem
2017 conf
CCNC
Xiaoyan Ma, Simona Chisiu, Rahim Kacimi, Riadh Dhaou
2017 B conf
IWCMC
Ghada Jaber, Rahim Kacimi, Thierry Gayraud
2016 C conf
ISNCC
Farid Lalem, Rahim Kacimi, Ahcène Bounceur, Reinhardt Euler
2016 conf
WMNC
Ghada Jaber, Rahim Kacimi, Zoubir Mammeri
2016 B conf
IWCMC
Xiaoyan Ma, Rahim Kacimi, Riadh Dhaou
2016 conf
BDAW
Farid Lalem, Ahcène Bounceur, Rahim Kacimi, Reinhardt Euler, Massinissa Saoudi
2016 J jnl
Int. J. Bus. Data Commun. Netw.
Nassima Bouadem, Rahim Kacimi, Abdelkamel Tari
2016 C conf
ISNCC
Umber Noreen, Ahcène Bounceur, Laurent Clavier, Rahim Kacimi
2015 B ed.
Networking
Rahim Kacimi, Zoubir Mammeri
2014 conf
WMNC
Rahim Kacimi, Zoubir Mammeri
2014 conf
VTC Fall
Ibrahima Diané, Rahim Kacimi, Zoubir Mammeri, Ibrahima Niang
2014 J jnl
EAI Endorsed Trans. Mob. Commun. Appl.
Rahim Kacimi, Ponia Pech
2013 conf
WMNC
Ibrahima Diané, Rahim Kacimi, Zoubir Mammeri, Ibrahima Niang
2013 J jnl
Ad Hoc Networks
Rahim Kacimi, Riadh Dhaou, André-Luc Beylot
2013 conf
PSATS
Rahim Kacimi, Ponia Pech
2012 conf
Wireless Days
Rahim Kacimi, Zoubir Mammeri
2011 B conf
GLOBECOM
Ghalem Boudour, Rahim Kacimi, Abbas Jamalipour, Zoubir Mammeri
2011 conf
CCNC
Youssouf Zatout, Rahim Kacimi, Jean-François Llibre, Eric Campo
2010 conf
ICC
Rahim Kacimi, Riadh Dhaou, André-Luc Beylot
2010 conf
Med-Hoc-Net
Andrei Dumbrava, Rahim Kacimi, Riadh Dhaou, André-Luc Beylot
2009 B conf
Networking
Monique Becker, André-Luc Beylot, Riadh Dhaou, Ashish Gupta, Rahim Kacimi, Michel Marot
2009
Rahim Kacimi
2009 conf
CCNC
Rahim Kacimi, Riadh Dhaou, André-Luc Beylot
2008 B conf
GLOBECOM
Rahim Kacimi, Riadh Dhaou, André-Luc Beylot
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