Olaf Landsiedel

134 papers A* 2A 6B 39C 1Misc 13Journal 34Unranked 35
YearRankTypeTitle / Venue / Authors
2026 conf
EMISA
Trinh Tran, Olaf Landsiedel
2025 J jnl
CoRR
Hendrik Reiter, Janick Edinger, Martin Kabierski, Agnes Koschmider, Olaf Landsiedel, Arvid Lepsien, Xixi Lu, Andrea Marrella, Estefanía Serral, Stefan Schulte, Florian Tschorsch, Matthias Weidlich, Wilhelm Hasselbring
2025 J jnl
CoRR
Hendrik Reiter, Patrick Rathje, Olaf Landsiedel, Wilhelm Hasselbring
2025 J jnl
Comput. Networks
Naina Said, Olaf Landsiedel
2025 Misc conf
SAC
Julia Andersen, Patrick Rathje, Christian Imenkamp, Agnes Koschmider, Olaf Landsiedel
2025 conf
VTC2025-Spring
Birkan Denizer, Nils Dohse, Olaf Landsiedel
2025 conf
LEO-NET
Birkan Denizer, Nils Dohse, Olaf Landsiedel
2025 conf
EMS@SIGCOMM
Birkan Denizer, Lasse Winkel, Olaf Landsiedel
2025 J jnl
CoRR
Ali Hojjat, Janek Haberer, Tayyaba Zainab, Olaf Landsiedel
2025 conf
DAGM GCPR
Ali Hojjat, Janek Haberer, Olaf Landsiedel
2025 J jnl
CoRR
Maximilian Weisenseel, Julia Andersen, Samira Akili, Christian Imenkamp, Hendrik Reiter, Christoffer Rubensson, Wilhelm Hasselbring, Olaf Landsiedel, Xixi Lu, Jan Mendling, Florian Tschorsch, Matthias Weidlich, Agnes Koschmider
2025 Misc conf
SAC
Tayyaba Zainab, Laura Harms, Jens Karstens, Olaf Landsiedel
2025 J jnl
CoRR
Ali Hojjat, Janek Haberer, Sóren Pirk, Olaf Landsiedel
2024 conf
Business Process Management Workshops
Julia Andersen, Patrick Rathje, Olaf Landsiedel
2024 J jnl
CoRR
Julia Rossow, Patrick Rathje, Olaf Landsiedel
2024 conf
DCOSS-IoT
Naina Said, Olaf Landsiedel
2024 A* conf
NeurIPS
Janek Haberer, Ali Hojjat, Olaf Landsiedel
2024 J jnl
CoRR
Janek Haberer, Ali Hojjat, Olaf Landsiedel
2024 A conf
MobiSys
Ali Hojjat, Janek Haberer, Tayyaba Zainab, Olaf Landsiedel
2024 J jnl
CoRR
Ali Hojjat, Janek Haberer, Olaf Landsiedel
2023 B conf
EWSN
Patrick Rathje, Olaf Landsiedel
2023 conf
IoTDI
Tayyaba Zainab, Jens Karstens, Olaf Landsiedel
2023 conf
IoTDI
Tayyaba Zainab, Jens Karstens, Olaf Landsiedel
2023 conf
CVPR Workshops
Ali Hojjat, Janek Haberer, Olaf Landsiedel
2023 J jnl
CoRR
Ali Hojjat, Janek Haberer, Olaf Landsiedel
2023 J jnl
J. Sens. Actuator Networks
Patrick Rathje, Valentin Poirot, Olaf Landsiedel
2023 B conf
EWSN
Leif Brötzmann, Patrick Rathje, Olaf Landsiedel
2023 conf
DCOSS-IoT
Laura Harms, Olaf Landsiedel
2023 J jnl
IEEE Syst. J.
Jagnyashini Debadarshini, Madhav Tummala, Sudipta Saha, Olaf Landsiedel, Mun Choon Chan
2022 A* conf
DAC
Valentin Poirot, Oliver Harms, Hendric Martens, Olaf Landsiedel
2022 J jnl
Inform. Spektrum
Matthias Renz, Peer Kröger, Agnes Koschmider, Olaf Landsiedel, Nelson Tavares de Sousa
2022 J jnl
Inform. Spektrum
Sante Pugliese, Olaf Landsiedel, Johannes Kuprat, Marco Liserre
2022 J jnl
Inform. Spektrum
Tayyaba Zainab, Jens Karstens, Olaf Landsiedel
2022 B conf
LCN
Patrick Rathje, Olaf Landsiedel
2022 B conf
DCOSS
Oliver Harms, Christian Richter, Olaf Landsiedel
2022 B conf
LCN
Christos Profentzas, Magnus Almgren, Olaf Landsiedel
2022 B conf
EWSN
Christos Profentzas, Magnus Almgren, Olaf Landsiedel
2022 J jnl
CoRR
Patrick Rathje, Olaf Landsiedel
2022 B conf
EWSN
Patrick Rathje, Olaf Landsiedel
2022 B conf
DCOSS
Valentin Poirot, Olaf Landsiedel
2021 J jnl
ACM Trans. Internet Things
Beshr Al Nahas, Antonio Escobar-Molero, Jirka Klaue, Simon Duquennoy, Olaf Landsiedel
2021 A conf
ICDCS
Valentin Poirot, Olaf Landsiedel
2021 B conf
LCN
Oliver Harms, Olaf Landsiedel
2021 B conf
EWSN
Patrick Rathje, Olaf Landsiedel
2021 B conf
EWSN
Patrick Rathje, Olaf Landsiedel
2021 J jnl
CoRR
Valentin Poirot, Olaf Landsiedel
2020 B conf
DCOSS
Oliver Harms, Olaf Landsiedel
2020 J jnl
CoRR
Beshr Al Nahas, Antonio Escobar-Molero, Jirka Klaue, Simon Duquennoy, Olaf Landsiedel
2020 J jnl
CoRR
Valentin Poirot, Olaf Landsiedel
2020 B conf
DCOSS
Oliver Harms, Olaf Landsiedel
2020 J jnl
J. Parallel Distributed Comput.
Charalampos Stylianopoulos, Magnus Almgren, Olaf Landsiedel, Marina Papatriantafilou
2020 conf
DEBS
Charalampos Stylianopoulos, Magnus Almgren, Olaf Landsiedel, Marina Papatriantafilou, Trevor Neish, Linus Gillander, Bengt Johansson, Staffan Bonnier
2020 J jnl
EMISA Forum
Saskia Nuñez von Voigt, Stephan A. Fahrenkrog-Petersen, Dominik Janssen, Agnes Koschmider, Florian Tschorsch, Felix Mannhardt, Olaf Landsiedel, Matthias Weidlich
2020 A conf
CAiSE
Saskia Nuñez von Voigt, Stephan A. Fahrenkrog-Petersen, Dominik Janssen, Agnes Koschmider, Florian Tschorsch, Felix Mannhardt, Olaf Landsiedel, Matthias Weidlich
2020 J jnl
CoRR
Saskia Nuñez von Voigt, Stephan A. Fahrenkrog-Petersen, Dominik Janssen, Agnes Koschmider, Florian Tschorsch, Felix Mannhardt, Olaf Landsiedel, Matthias Weidlich
2020 B conf
NOMS
Patrick Rathje, Valentin Poirot, Olaf Landsiedel
2020 B conf
LCN
Jagnyashini Debadarshini, Sudipta Saha, Olaf Landsiedel, Mun Choon Chan
2020 A conf
ICDCS
Christos Profentzas, Magnus Almgren, Olaf Landsiedel
2019 A conf
ACSAC
Charalampos Stylianopoulos, Simon Kindström, Magnus Almgren, Olaf Landsiedel, Marina Papatriantafilou
2019 B conf
EWSN
Oliver Harms, Olaf Landsiedel
2019 B conf
EWSN
Beshr Al Nahas, Simon Duquennoy, Olaf Landsiedel
2019 B conf
DCOSS
Charalampos Stylianopoulos, Magnus Almgren, Olaf Landsiedel, Marina Papatriantafilou
2019 B conf
LCN
Christos Profentzas, Magnus Almgren, Olaf Landsiedel
2019 B conf
EWSN
Valentin Poirot, Beshr Al Nahas, Olaf Landsiedel
2019 B conf
DCOSS
Christos Profentzas, Mirac Günes, Yiannis Nikolakopoulos, Olaf Landsiedel, Magnus Almgren
2019 ed.
IoTDI
Olaf Landsiedel, Klara Nahrstedt
2019 J jnl
ACM Trans. Sens. Networks
Martina Brachmann, Olaf Landsiedel, Diana Göhringer, Silvia Santini
2018 B conf
EWSN
Beshr Al Nahas, Olaf Landsiedel
2018 B conf
LCN
Charalampos Stylianopoulos, Magnus Almgren, Olaf Landsiedel, Marina Papatriantafilou
2018 conf
Bench@CPSWeek
Carlo Alberto Boano, Simon Duquennoy, Anna Förster, Omprakash Gnawali, Romain Jacob, Hyung-Sin Kim, Olaf Landsiedel, Ramona Marfievici, Luca Mottola, Gian Pietro Picco, Xavier Vilajosana, Thomas Watteyne, Marco Zimmerling
2018 A conf
CoNEXT
Hassan Iqbal, Muhammad Hamad Alizai, Ihsan Ayyub Qazi, Olaf Landsiedel, Zartash Afzal Uzmi
2018 J jnl
CoRR
Martina Brachmann, Olaf Landsiedel, Diana Göhringer, Silvia Santini
2017 B conf
EWSN
Beshr Al Nahas, Olaf Landsiedel
2017 B conf
DCOSS
Sudipta Saha, Olaf Landsiedel, Mun Choon Chan
2017 B conf
LCN
Martina Brachmann, Olaf Landsiedel, Silvia Santini
2017 B conf
EWSN
Peilin Zhang, Olaf Landsiedel, Oliver E. Theel
2017 B conf
ICPP
Charalampos Stylianopoulos, Magnus Almgren, Olaf Landsiedel, Marina Papatriantafilou
2017 Misc conf
SenSys
Beshr Al Nahas, Simon Duquennoy, Olaf Landsiedel
2017 Misc conf
SenSys
Beshr Al Nahas, Simon Duquennoy, Olaf Landsiedel
2017 Misc conf
SenSys
Hassan Iqbal, Muhammad Hamad Alizai, Zartash Afzal Uzmi, Olaf Landsiedel
2016 Misc conf
SenSys
Simon Duquennoy, Olaf Landsiedel, Carlo Alberto Boano, Marco Zimmerling, Jan Beutel, Mun Choon Chan, Omprakash Gnawali, Mobashir Mohammad, Luca Mottola, Lothar Thiele, Xavier Vilajosana, Thiemo Voigt, Thomas Watteyne
2016 B conf
EWSN
Beshr Al Nahas, Olaf Landsiedel
2016 B conf
LCN
Martina Brachmann, Olaf Landsiedel, Silvia Santini
2016 C conf
SSS
Olaf Landsiedel, Thomas Petig, Elad Michael Schiller
2016 conf
IEEE BigData
Viktor Botev, Magnus Almgren, Vincenzo Gulisano, Olaf Landsiedel, Marina Papatriantafilou, Joris van Rooij
2016 J jnl
ACM Trans. Model. Comput. Simul.
Georg Kunz, Mirko Stoffers, Olaf Landsiedel, Klaus Wehrle, James Gross
2015 B conf
EWSN
Olaf Landsiedel, Elad Michael Schiller, Salvatore Tomaselli
2015 J jnl
Int. J. Sens. Networks
Waqaas Munawar, Muhammad Hamad Alizai, Olaf Landsiedel, Klaus Wehrle
2015 Misc conf
SenSys
Simon Duquennoy, Beshr Al Nahas, Olaf Landsiedel, Thomas Watteyne
2014 B conf
WiMob
Hamed Khanmirza, Olaf Landsiedel, Marina Papatriantafilou, Nasser Yazdani
2014 conf
INFOCOM Workshops
Zhang Fu, Olaf Landsiedel, Magnus Almgren, Marina Papatriantafilou
2014 conf
IEEE BigData
Zhang Fu, Magnus Almgren, Olaf Landsiedel, Marina Papatriantafilou
2014 J jnl
ACM Trans. Sens. Networks
Euhanna Ghadimi, Olaf Landsiedel, Pablo Soldati, Simon Duquennoy, Mikael Johansson
2014 conf
ROSE
Sebastian Zug, Christoph Steup, Julian-B. Scholle, Christian Berger, Olaf Landsiedel, Fabian Schuldt, Jens Rieken, Richard Matthaei, Thomas Form
2014 conf
SAFECOMP Workshops
Attila Nagy, Olaf Landsiedel
2013 Misc conf
SenSys
Olaf Landsiedel, Federico Ferrari, Marco Zimmerling
2013 Misc conf
SenSys
Simon Duquennoy, Olaf Landsiedel, Thiemo Voigt
2013 conf
SpringSim (TMS-DEVS)
Christian Berger, Michel R. V. Chaudron, Rogardt Heldal, Olaf Landsiedel, Elad Michael Schiller
2013 Misc conf
SenSys
Francisco Sant'Anna, Noemi de La Rocque Rodriguez, Roberto Ierusalimschy, Olaf Landsiedel, Philippas Tsigas
2013 conf
ASCoMS@SAFECOMP
Salvatore Tomaselli, Olaf Landsiedel
2012 B conf
SECON
Euhanna Ghadimi, Olaf Landsiedel, Pablo Soldati, Mikael Johansson
2012 Misc conf
SenSys
Olaf Landsiedel, Federico Ferrari, Marco Zimmerling
2012 B conf
DCOSS
Navid Hassanzadeh, Olaf Landsiedel, Frederik Hermans, Olof Rensfelt, Thiemo Voigt
2012 J jnl
Int. J. Distributed Sens. Networks
Muhammad Hamad Alizai, Olaf Landsiedel, Klaus Wehrle
2012 conf
IPSN
Olaf Landsiedel, Euhanna Ghadimi, Simon Duquennoy, Mikael Johansson
2012 conf
IPSN
António Gonga, Olaf Landsiedel, Pablo Soldati, Mikael Johansson
2012 J jnl
SIGBED Rev.
Thiemo Voigt, Utz Roedig, Olaf Landsiedel, Kasun Samarasinghe, Mahesh Bogadi Shankar Prasad
2012 B conf
DCOSS
António Gonga, Olaf Landsiedel, Pablo Soldati, Mikael Johansson
2012 J jnl
SIGBED Rev.
Navid Hassanzadeh, Olaf Landsiedel, Frederik Hermans, Olof Rensfelt, Thiemo Voigt
2011 B conf
DCOSS
António Gonga, Olaf Landsiedel, Mikael Johansson
2011 conf
IPSN
Muhammad Hamad Alizai, Tobias Vaegs, Olaf Landsiedel, Stefan Götz, Jó Ágila Bitsch Link, Klaus Wehrle
2010 conf
ICC
Waqaas Munawar, Muhammad Hamad Alizai, Olaf Landsiedel, Klaus Wehrle
2010 B conf
MASCOTS
Georg Kunz, Olaf Landsiedel, Stefan Götz, Klaus Wehrle, James Gross, Farshad Naghibi
2010 ch.
Modeling and Tools for Network Simulation
Georg Kunz, Olaf Landsiedel, Georg Wittenburg
2010 conf
IPSN
Raimondas Sasnauskas, Olaf Landsiedel, Muhammad Hamad Alizai, Carsten Weise, Stefan Kowalewski, Klaus Wehrle
2010
Olaf Landsiedel
2010 conf
ARCS Workshops
Muhammad Hamad Alizai, Georg Kunz, Olaf Landsiedel, Klaus Wehrle
2010 conf
IPSN
Muhammad Hamad Alizai, Tobias Vaegs, Olaf Landsiedel, Raimondas Sasnauskas, Klaus Wehrle
2010 ch.
Modeling and Tools for Network Simulation
Muhammad Hamad Alizai, Lei Gao, Torsten Kempf, Olaf Landsiedel
2010 Misc conf
SenSys
Olaf Landsiedel, Mikael Johansson
2009 conf
VISA
Olaf Landsiedel, Georg Kunz, Stefan Götz, Klaus Wehrle
2009 Misc conf
SenSys
Muhammad Hamad Alizai, Olaf Landsiedel, Jó Ágila Bitsch Link, Stefan Götz, Klaus Wehrle
2009 B conf
MASCOTS
Georg Kunz, Olaf Landsiedel, Klaus Wehrle
2009 J jnl
Prax. Inf.verarb. Kommun.
Muhammad Hamad Alizai, Olaf Landsiedel, Klaus Wehrle
2008 conf
IPSN
Olaf Landsiedel, Muhammad Hamad Alizai, Klaus Wehrle
2007 B conf
GLOBECOM
Olaf Landsiedel, Lexi Pimenidis, Klaus Wehrle, Heiko Niedermayer, Georg Carle
2007 J jnl
it Inf. Technol.
Olaf Landsiedel, Tobias Heer, Klaus Wehrle
2007 conf
Algorithms for Sensor and Ad Hoc Networks
Olaf Landsiedel
2006 conf
MobiShare@MobiCom
Olaf Landsiedel, Stefan Götz, Klaus Wehrle
2006 conf
Peer-to-Peer Computing
Olaf Landsiedel, Stefan Götz, Klaus Wehrle
2005 J jnl
Prax. Inf.verarb. Kommun.
Olaf Landsiedel, Klaus Wehrle, Ben L. Titzer, Jens Palsberg
2005 conf
NETGAMES
Leo Petrak, Olaf Landsiedel, Klaus Wehrle
2005 conf
Peer-to-Peer Computing
Olaf Landsiedel, Katharina Anna Lehmann, Klaus Wehrle
2004 conf
HOT-P2P
Simon Rieche, Klaus Wehrle, Olaf Landsiedel, Stefan Götz, Leo Petrak
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