Xenofontas A. Dimitropoulos

124 papers A* 11A 11B 12C 1Misc 2Journal 69Unranked 17
YearRankTypeTitle / Venue / Authors
2025 A conf
IMC
Iliana Xygkou, Antonis Chariton, Xenofontas A. Dimitropoulos, Alberto Dainotti
2024 conf
TMA
Antonios Chatzivasileiou, Alexandros Kornilakis, Katerina Lionta, Georgios Nomikos, Xenofontas A. Dimitropoulos, Georgios Smaragdakis
2022 conf
CSCN
Emmanouil Lakiotakis, Nikolaos Pappas, Xenofontas A. Dimitropoulos
2021 J jnl
IEEE/ACM Trans. Netw.
Vasileios Giotsas, George Nomikos, Vasileios Kotronis, Pavlos Sermpezis, Petros Gigis, Lefteris Manassakis, Christoph Dietzel, Stavros Konstantaras, Xenofontas A. Dimitropoulos
2021 A* conf
SIGCOMM
Petros Gigis, Matt Calder, Lefteris Manassakis, George Nomikos, Vasileios Kotronis, Xenofontas A. Dimitropoulos, Ethan Katz-Bassett, Georgios Smaragdakis
2019 A* conf
INFOCOM
Alexandros Milolidakis, Romain Fontugne, Xenofontas A. Dimitropoulos
2019 J jnl
CoRR
Alexandros Milolidakis, Romain Fontugne, Xenofontas A. Dimitropoulos
2019 J jnl
Concurr. Comput. Pract. Exp.
Emmanouil Lakiotakis, Christos Liaskos, Xenofontas A. Dimitropoulos
2019 conf
MAGESys@SIGCOMM
Emmanouil Lakiotakis, Pavlos Sermpezis, Xenofontas A. Dimitropoulos
2019 J jnl
CoRR
George Nomikos, Vasileios Kotronis, Pavlos Sermpezis, Petros Gigis, Lefteris Manassakis, Christoph Dietzel, Stavros Konstantaras, Xenofontas A. Dimitropoulos, Vasileios Giotsas
2018 J jnl
Comput. Commun. Rev.
Pavlos Sermpezis, Vasileios Kotronis, Alberto Dainotti, Xenofontas A. Dimitropoulos
2018 J jnl
CoRR
Pavlos Sermpezis, Vasileios Kotronis, Alberto Dainotti, Xenofontas A. Dimitropoulos
2018 J jnl
IEEE/ACM Trans. Netw.
Pavlos Sermpezis, Vasileios Kotronis, Petros Gigis, Xenofontas A. Dimitropoulos, Danilo Cicalese, Alistair King, Alberto Dainotti
2018 conf
ANRW
Pavlos Sermpezis, Vasileios Kotronis, Petros Gigis, Xenofontas A. Dimitropoulos, Danilo Cicalese, Alistair King, Alberto Dainotti
2018 J jnl
CoRR
Pavlos Sermpezis, Vasileios Kotronis, Petros Gigis, Xenofontas A. Dimitropoulos, Danilo Cicalese, Alistair King, Alberto Dainotti
2018 J jnl
CoRR
Emmanouil Lakiotakis, Christos Liaskos, Xenofontas A. Dimitropoulos
2018 conf
MECOMM@SIGCOMM
Savvas Kastanakis, Pavlos Sermpezis, Vasileios Kotronis, Xenofontas A. Dimitropoulos
2018 J jnl
CoRR
Savvas Kastanakis, Pavlos Sermpezis, Vasileios Kotronis, Xenofontas A. Dimitropoulos
2018 J jnl
CoRR
Emmanouil Lakiotakis, Christos Liaskos, Xenofontas A. Dimitropoulos
2018 J jnl
CoRR
Emmanouil Lakiotakis, Christos Liaskos, Xenofontas A. Dimitropoulos
2018 A conf
Internet Measurement Conference
George Nomikos, Vasileios Kotronis, Pavlos Sermpezis, Petros Gigis, Lefteris Manassakis, Christoph Dietzel, Stavros Konstantaras, Xenofontas A. Dimitropoulos, Vasileios Giotsas
2018 A ed.
CoNEXT
Xenofontas A. Dimitropoulos, Alberto Dainotti, Laurent Vanbever, Theophilus Benson
2017 J jnl
CoRR
Gavriil Chaviaras, Petros Gigis, Pavlos Sermpezis, Xenofontas A. Dimitropoulos
2017 C conf
ISCC
Emmanouil Lakiotakis, Christos Liaskos, Xenofontas A. Dimitropoulos
2017 J jnl
IEEE Trans. Netw. Serv. Manag.
Christos Liaskos, Xenofontas A. Dimitropoulos, Leandros Tassiulas
2017 J jnl
CoRR
Pavlos Sermpezis, Xenofontas A. Dimitropoulos
2017 B conf
Networking
Pavlos Sermpezis, Xenofontas A. Dimitropoulos
2017 conf
ANRW
Petros Gigis, Vasileios Kotronis, Emile Aben, Stephen D. Strowes, Xenofontas A. Dimitropoulos
2017 J jnl
CoRR
Petros Gigis, Vasileios Kotronis, Emile Aben, Stephen D. Strowes, Xenofontas A. Dimitropoulos
2017 conf
INFOCOM Workshops
Tewelde Degefa Assefa, Rashedul Hoque, Elias Z. Tragos, Xenofontas A. Dimitropoulos
2017 J jnl
CoRR
Pavlos Sermpezis, George Nomikos, Xenofontas A. Dimitropoulos
2017 conf
INFOCOM Workshops
George Nomikos, Pavlos Sermpezis, Xenofontas A. Dimitropoulos
2017 conf
CAMAD
Tewelde Degefa Assefa, Rashedul Hoque, Elias Z. Tragos, Xenofontas A. Dimitropoulos
2017 J jnl
CoRR
Vasileios Kotronis, George Nomikos, Lefteris Manassakis, Dimitris Mavrommatis, Xenofontas A. Dimitropoulos
2017 A conf
Internet Measurement Conference
Vasileios Kotronis, George Nomikos, Lefteris Manassakis, Dimitris Mavrommatis, Xenofontas A. Dimitropoulos
2016 J jnl
Comput. Commun. Rev.
Rowan Klöti, Bernhard Ager, Vasileios Kotronis, George Nomikos, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Rowan Klöti, Bernhard Ager, Vasileios Kotronis, George Nomikos, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Christos Liaskos, Vasileios Kotronis, Xenofontas A. Dimitropoulos
2016 A* conf
INFOCOM
Christos Liaskos, Vasileios Kotronis, Xenofontas A. Dimitropoulos
2016 A* conf
SIGCOMM
Gavriil Chaviaras, Petros Gigis, Pavlos Sermpezis, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Pavlos Sermpezis, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Christos Liaskos, Xenofontas A. Dimitropoulos, Leandros Tassiulas
2016 J jnl
CoRR
Vasileios Kotronis, Xenofontas A. Dimitropoulos, Rowan Klöti, Bernhard Ager, Panagiotis Georgopoulos, Stefan Schmid
2016 J jnl
CoRR
Adrian Gämperli, Vasileios Kotronis, Xenofontas A. Dimitropoulos
2016 J jnl
SIGMETRICS Perform. Evaluation Rev.
Pavlos Sermpezis, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Vasileios Kotronis, Rowan Klöti, Matthias Rost, Panagiotis Georgopoulos, Bernhard Ager, Stefan Schmid, Xenofontas A. Dimitropoulos
2016 J jnl
IEEE J. Sel. Areas Commun.
Alberto Dainotti, Karyn Benson, Alistair King, Bradley Huffaker, Eduard Glatz, Xenofontas A. Dimitropoulos, Philipp Richter, Alessandro Finamore, Alex C. Snoeren
2016 J jnl
CoRR
Pavlos Sermpezis, Gavriil Chaviaras, Petros Gigis, Xenofontas A. Dimitropoulos
2016 J jnl
Comput. Commun. Rev.
Dimitrios Gkounis, Vasileios Kotronis, Christos Liaskos, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Dimitrios Gkounis, Vasileios Kotronis, Christos Liaskos, Xenofontas A. Dimitropoulos
2016 B ed.
PAM
Thomas Karagiannis, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Rowan Klöti, Vasileios Kotronis, Bernhard Ager, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Vasileios Kotronis, Adrian Gämperli, Xenofontas A. Dimitropoulos
2016 conf
SOSR
Vasileios Kotronis, Rowan Klöti, Matthias Rost, Panagiotis Georgopoulos, Bernhard Ager, Stefan Schmid, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
Vasileios Kotronis, Rowan Klöti, Matthias Rost, Panagiotis Georgopoulos, Bernhard Ager, Stefan Schmid, Xenofontas A. Dimitropoulos
2016 J jnl
Comput. Commun. Rev.
Alberto Dainotti, Ethan Katz-Bassett, Xenofontas A. Dimitropoulos
2016 B conf
PAM
George Nomikos, Xenofontas A. Dimitropoulos
2016 J jnl
CoRR
George Nomikos, Xenofontas A. Dimitropoulos
2015 conf
TMA
Elias Raftopoulos, Eduard Glatz, Xenofontas A. Dimitropoulos, Alberto Dainotti
2015 A* conf
SIGMETRICS
Vasileios Kotronis, Rowan Klöti, Matthias Rost, Panagiotis Georgopoulos, Bernhard Ager, Stefan Schmid, Xenofontas A. Dimitropoulos
2015 A* conf
INFOCOM
Rowan Klöti, Vasileios Kotronis, Bernhard Ager, Xenofontas A. Dimitropoulos
2015 J jnl
Comput. Networks
Vasileios Kotronis, Adrian Gämperli, Xenofontas A. Dimitropoulos
2015 B conf
PAM
Suso Benitez-Baleato, Nils B. Weidmann, Petros Gigis, Xenofontas A. Dimitropoulos, Eduard Glatz, Brian Trammell
2014 conf
ONS
Vasileios Kotronis, Xenofontas A. Dimitropoulos, Rowan Klöti, Bernhard Ager, Panagiotis Georgopoulos, Stefan Schmid
2014 J jnl
Comput. Commun. Rev.
Alberto Dainotti, Karyn Benson, Alistair King, K. C. Claffy, Michael G. Kallitsis, Eduard Glatz, Xenofontas A. Dimitropoulos
2014 J jnl
Comput. Commun. Rev.
Alberto Dainotti, Karyn Benson, Alistair King, K. C. Claffy, Michael G. Kallitsis, Eduard Glatz, Xenofontas A. Dimitropoulos
2014 A* conf
SIGCOMM
Adrian Gämperli, Vasileios Kotronis, Xenofontas A. Dimitropoulos
2014 J jnl
IEEE J. Sel. Areas Commun.
Elias Raftopoulos, Xenofontas A. Dimitropoulos
2014 J jnl
CoRR
Alberto Dainotti, Karyn Benson, Alistair King, K. C. Claffy, Eduard Glatz, Xenofontas A. Dimitropoulos, Philipp Richter, Alessandro Finamore, Alex C. Snoeren
2014 J jnl
CoRR
Dimitrios Gkounis, Vasileios Kotronis, Xenofontas A. Dimitropoulos
2014 J jnl
Computing
Eduard Glatz, Stelios Mavromatidis, Bernhard Ager, Xenofontas A. Dimitropoulos
2013 J jnl
EURASIP J. Inf. Secur.
Elias Raftopoulos, Xenofontas A. Dimitropoulos
2013 J jnl
IEEE Commun. Mag.
Mentari Djatmiko, Dominik Schatzmann, Xenofontas A. Dimitropoulos, Arik Friedman, Roksana Boreli
2013 J jnl
Comput. Networks
Ignasi Paredes-Oliva, Pere Barlet-Ros, Xenofontas A. Dimitropoulos
2013 A* conf
SIGMETRICS
Ignasi Paredes-Oliva, Pere Barlet-Ros, Xenofontas A. Dimitropoulos
2013 A conf
CoNEXT
Mentari Djatmiko, Dominik Schatzmann, Xenofontas A. Dimitropoulos, Arik Friedman, Roksana Boreli
2013 A conf
Internet Measurement Conference
Francesco Fusco, Michail Vlachos, Xenofontas A. Dimitropoulos, Luca Deri
2013 conf
IEEE Symposium on Security and Privacy Workshops
Elias Raftopoulos, Xenofontas A. Dimitropoulos
2012 J jnl
IEEE/ACM Trans. Netw.
Daniela Brauckhoff, Xenofontas A. Dimitropoulos, Arno Wagner, Kavé Salamatian
2012 A conf
Internet Measurement Conference
Eduard Glatz, Xenofontas A. Dimitropoulos
2012 A* conf
SIGMETRICS
Eduard Glatz, Xenofontas A. Dimitropoulos
2012 J jnl
ERCIM News
Martin Burkhart, Xenofontas A. Dimitropoulos
2012 B conf
CNSM
Atef Abdelkefi, Yuming Jiang, Xenofontas A. Dimitropoulos
2012 Misc conf
HotNets
Vasileios Kotronis, Xenofontas A. Dimitropoulos, Bernhard Ager
2012 conf
INFOCOM Workshops
Ignasi Paredes-Oliva, Ismael Castell-Uroz, Pere Barlet-Ros, Xenofontas A. Dimitropoulos, Josep Solé-Pareta
2012 A conf
Internet Measurement Conference
Francesco Fusco, Michail Vlachos, Xenofontas A. Dimitropoulos
2012 B conf
DIMVA
Elias Raftopoulos, Matthias Egli, Xenofontas A. Dimitropoulos
2012 ed.
TMA
Antonio Pescapè, Luca Salgarelli, Xenofontas A. Dimitropoulos
2012 J jnl
Comput. Commun. Rev.
Francesco Fusco, Xenofontas A. Dimitropoulos, Michail Vlachos, Luca Deri
2011 A conf
Internet Measurement Conference
Elias Raftopoulos, Xenofontas A. Dimitropoulos
2011 J jnl
ACM Trans. Inf. Syst. Secur.
Martin Burkhart, Xenofontas A. Dimitropoulos
2011 conf
SysSec@DIMVA
Xenofontas A. Dimitropoulos
2010 A* conf
SIGCOMM
Ignasi Paredes-Oliva, Xenofontas A. Dimitropoulos, Maurizio Molina, Pere Barlet-Ros, Daniela Brauckhoff
2010 A conf
Internet Measurement Conference
Dominik Schatzmann, Wolfgang Mühlbauer, Thrasyvoulos Spyropoulos, Xenofontas A. Dimitropoulos
2010 B conf
ICCCN
Martin Burkhart, Xenofontas A. Dimitropoulos
2010 A* conf
USENIX Security Symposium
Martin Burkhart, Mario Strasser, Dilip Many, Xenofontas A. Dimitropoulos
2009 A conf
Internet Measurement Conference
Daniela Brauckhoff, Xenofontas A. Dimitropoulos, Arno Wagner, Kavé Salamatian
2009 J jnl
ACM Trans. Model. Comput. Simul.
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, Amin Vahdat, George F. Riley
2009 J jnl
IEEE Trans. Netw. Serv. Manag.
Andreas Kind, Marc Ph. Stoecklin, Xenofontas A. Dimitropoulos
2009 B conf
PAM
Xenofontas A. Dimitropoulos, Paul Hurley, Andreas Kind, Marc Ph. Stoecklin
2009 J jnl
CoRR
Martin Burkhart, Mario Strasser, Xenofontas A. Dimitropoulos
2009 J jnl
Int. J. Netw. Manag.
Dimitrios Dechouniotis, Nikolaos Leontiou, Xenofontas A. Dimitropoulos, Andreas Kind, Spyros G. Denazis
2008 J jnl
IEEE Commun. Mag.
Andreas Kind, Xenofontas A. Dimitropoulos, Spyros G. Denazis, Benoit Claise
2008 J jnl
CoRR
Xenofontas A. Dimitropoulos, M. Ángeles Serrano, Dmitri V. Krioukov
2008 J jnl
Comput. Commun. Rev.
Xenofontas A. Dimitropoulos, M. Ángeles Serrano, Dmitri V. Krioukov
2008 J jnl
Comput. Commun. Rev.
Xenofontas A. Dimitropoulos, Paul Hurley, Andreas Kind
2008 J jnl
Comput. Networks
Xenofontas A. Dimitropoulos, Marc Ph. Stoecklin, Paul Hurley, Andreas Kind
2007 J jnl
Comput. Commun. Rev.
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, Marina Fomenkov, Bradley Huffaker, Young Hyun, Kimberly C. Claffy, George F. Riley
2007 conf
DSOM
Dimitrios Dechouniotis, Xenofontas A. Dimitropoulos, Andreas Kind, Spyros G. Denazis
2007 J jnl
CoRR
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, Amin Vahdat, George F. Riley
2006 J jnl
CoRR
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, Marina Fomenkov, Bradley Huffaker, Young Hyun, Kimberly C. Claffy, George F. Riley
2006 J jnl
Comput. Networks
Xenofontas A. Dimitropoulos, George F. Riley
2006 B conf
PADS
Xenofontas A. Dimitropoulos, George F. Riley
2006 J jnl
CoRR
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, George F. Riley, Kimberly C. Claffy
2006 J jnl
Comput. Commun. Rev.
Priya Mahadevan, Dmitri V. Krioukov, Marina Fomenkov, Xenofontas A. Dimitropoulos, Kimberly C. Claffy, Amin Vahdat
2005 conf
WEA
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, Bradley Huffaker, Kimberly C. Claffy, George F. Riley
2005 J jnl
CoRR
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, Bradley Huffaker, Kimberly C. Claffy, George F. Riley
2005 J jnl
CoRR
Priya Mahadevan, Dmitri V. Krioukov, Marina Fomenkov, Bradley Huffaker, Xenofontas A. Dimitropoulos, Kimberly C. Claffy, Amin Vahdat
2005 B conf
PAM
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, George F. Riley
2005 J jnl
CoRR
Xenofontas A. Dimitropoulos, Dmitri V. Krioukov, George F. Riley
2005 J jnl
CoRR
Priya Mahadevan, Dmitri V. Krioukov, Marina Fomenkov, Bradley Huffaker, Xenofontas A. Dimitropoulos, Kimberly C. Claffy, Amin Vahdat
2004 Misc conf
WSC
Jintae Kim, Steven Y. Ko, David M. Nicol, Xenofontas A. Dimitropoulos, George F. Riley
2004 B conf
MASCOTS
Xenofontas A. Dimitropoulos, George F. Riley
2003 B conf
MASCOTS
Xenofontas A. Dimitropoulos, George F. Riley
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