Oliver Hohlfeld

157 papers A* 8A 21B 24C 2Misc 1Journal 60Unranked 39
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Access
Manuel Wickert, Dario Klapp, Oliver Hohlfeld
2025 conf
SIGCOMM (Posters and Demos)
Yasin Alhamwy, Bashar Khoulani, Oliver Hohlfeld
2025 conf
ITC-36
Daniel Kopp, Oliver Hohlfeld
2025 Misc conf
HotNets
Nikolaos Mitsakis, Marco Reisacher, Matthias Eichholz, Yannic Breiting, Harald Albrecht, Andreas Blenk, Oliver Hohlfeld
2025 conf
ECSA (Tracks and Workshops)
Sebastian Copei, Oliver Hohlfeld, Jens Kosiol
2025 conf
ASEW
Sebastian Copei, Oliver Hohlfeld, Jens Kosiol, Aleksandar Ristoski
2025 A conf
IMC
Yasin Alhamwy, Oliver Hohlfeld
2025 A conf
IMC
Yasin Alhamwy, Abdalmohimn Alshebane, Oliver Hohlfeld
2025 J jnl
Perform. Evaluation
Sara Alouf, Oliver Hohlfeld, Zhiyuan Jiang
2025 conf
ECSA (Tracks and Workshops)
Sebastian Copei, Oliver Hohlfeld, Jens Kosiol
2025 J jnl
CoRR
Sebastian Copei, Oliver Hohlfeld, Jens Kosiol
2025 conf
NGNO@MM
Yasin Alhamwy, Oliver Hohlfeld
2024 conf
SIGCOMM (Posters and Demos)
Nikolaos Mitsakis, Andreas Blenk, Oliver Hohlfeld
2024 A* conf
SIGCOMM
Stefan Mehner, Helge Reelfs, Ingmar Poese, Oliver Hohlfeld
2024 conf
MoDELS (Companion)
Till Guthardt, Jens Kosiol, Oliver Hohlfeld
2024 A conf
IMC
Yasin Alhamwy, Paul Mertens, Oliver Hohlfeld
2024 J jnl
IEEE Trans. Netw. Serv. Manag.
Patrick Krämer, Benedikt Baier, Niklas Landerer, Philip Diederich, Alexander Griessel, Oliver Hohlfeld, Andreas Blenk, Martin Mieth, Wolfgang Kellerer
2024 A conf
ICWSM
José Miguel Moreno, Sergio Pastrana, Jens Helge Reelfs, Pelayo Vallina, Savvas Zannettou, Andriy Panchenko, Georgios Smaragdakis, Oliver Hohlfeld, Narseo Vallina-Rodriguez, Juan Tapiador
2024 conf
IoT
Kurt Klaus Horvath, Dragi Kimovski, Bernd Spiess, Oliver Hohlfeld, Radu Prodan
2024 A conf
IMC
Raphael Hiesgen, Marcin Nawrocki, Marinho P. Barcellos, Daniel Kopp, Oliver Hohlfeld, Echo Chan, Roland Dobbins, Christian Doerr, Christian Rossow, Daniel R. Thomas, Mattijs Jonker, Ricky K. P. Mok, Xiapu Luo, John Kristoff, Thomas C. Schmidt, Matthias Wählisch, K. C. Claffy
2024 J jnl
CoRR
Raphael Hiesgen, Marcin Nawrocki, Marinho P. Barcellos, Daniel Kopp, Oliver Hohlfeld, Echo Chan, Roland Dobbins, Christian Doerr, Christian Rossow, Daniel R. Thomas, Mattijs Jonker, Ricky K. P. Mok, Xiapu Luo, John Kristoff, Thomas C. Schmidt, Matthias Wählisch, K. C. Claffy
2023 J jnl
CoRR
Gerhard Hasslinger, Mahshid Okhovatzadeh, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2023 J jnl
Comput. Networks
Gerhard Hasslinger, Mahshid Okhovatzadeh, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2023 J jnl
CoRR
José Miguel Moreno, Sergio Pastrana, Jens Helge Reelfs, Pelayo Vallina, Andriy Panchenko, Georgios Smaragdakis, Oliver Hohlfeld, Narseo Vallina-Rodriguez, Juan Tapiador
2023 J jnl
Future Internet
Gerhard Hasslinger, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2023 C conf
WFCS
Eike Bjoern Schweissguth, Helge Parzyjegla, Peter Danielis, Gero Mühl, Dirk Timmermann, Stefan Mehner, Oliver Hohlfeld, David Hellmanns, Jonathan Falk
2022 J jnl
ACM Trans. Internet Techn.
Trinh Viet Doan, Roland van Rijswijk-Deij, Oliver Hohlfeld, Vaibhav Bajpai
2022 B conf
WiOpt
Gerhard Hasslinger, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2022 conf
WWW (Companion Volume)
Jens Helge Reelfs, Oliver Hohlfeld, Niklas Henckell
2022 J jnl
CoRR
Jens Helge Reelfs, Oliver Hohlfeld, Niklas Henckell
2022 J jnl
CoRR
Jens Helge Reelfs, Oliver Hohlfeld, Markus Strohmaier, Niklas Henckell
2022 B conf
QoMEX
Jens Helge Reelfs, Oliver Hohlfeld
2022 B conf
PAM
Jens Helge Reelfs, Oliver Hohlfeld, Niklas Henckell
2022 J jnl
CoRR
Jens Helge Reelfs, Oliver Hohlfeld, Niklas Henckell
2022 A* conf
SIGCOMM
Matthias Wichtlhuber, Eric Strehle, Daniel Kopp, Lars Prepens, Stefan Stegmueller, Alina Rubina, Christoph Dietzel, Oliver Hohlfeld
2022 B conf
PAM
Stefan Mehner, Franka Schuster, Oliver Hohlfeld
2022 B ed.
PAM
Oliver Hohlfeld, Giovane Cesar Moreira Moura, Cristel Pelsser
2022 J jnl
Comput. Commun. Rev.
Vaibhav Bajpai, Oliver Hohlfeld, Jon Crowcroft, Srinivasan Keshav, Henning Schulzrinne, Jörg Ott, Simone Ferlin, Georg Carle, Andrew Hines, Alexander Raake
2022 J jnl
CoRR
Simone Ferlin, Oliver Hohlfeld, Vaibhav Bajpai
2021 ed.
TMA
Vaibhav Bajpai, Hamed Haddadi, Oliver Hohlfeld
2021 B conf
QoMEX
Oliver Hohlfeld, Dennis Guse, Katrien De Moor
2021 J jnl
Commun. ACM
Anja Feldmann, Oliver Gasser, Franziska Lichtblau, Enric Pujol, Ingmar Poese, Christoph Dietzel, Daniel Wagner, Matthias Wichtlhuber, Juan Tapiador, Narseo Vallina-Rodriguez, Oliver Hohlfeld, Georgios Smaragdakis
2021 J jnl
IEEE Trans. Netw. Serv. Manag.
Álvaro Feal, Pelayo Vallina, Julien Gamba, Sergio Pastrana, Antonio Nappa, Oliver Hohlfeld, Narseo Vallina-Rodriguez, Juan Tapiador
2021 A* conf
CCS
Daniel Kopp, Eric Strehle, Oliver Hohlfeld
2021 J jnl
CoRR
Daniel Kopp, Eric Strehle, Oliver Hohlfeld
2021 B conf
PAM
Daniel Kopp, Christoph Dietzel, Oliver Hohlfeld
2021 J jnl
CoRR
Daniel Kopp, Christoph Dietzel, Oliver Hohlfeld
2021 conf
StudentWorkshop@CoNEXT
Leonard Becker, Oliver Hohlfeld, Georgios Smaragdakis
2021 B ed.
PAM
Oliver Hohlfeld, Andra Lutu, Dave Levin
2021 J jnl
Dagstuhl Reports
Vaibhav Bajpai, Oliver Hohlfeld, Jon Crowcroft, Srinivasan Keshav
2021 conf
WWW (Companion Volume)
Jens Helge Reelfs, Max Bergmann, Oliver Hohlfeld, Niklas Henckell
2021 J jnl
CoRR
Jens Helge Reelfs, Max Bergmann, Oliver Hohlfeld, Niklas Henckell
2021 A* conf
CCS
Daniel Wagner, Daniel Kopp, Matthias Wichtlhuber, Christoph Dietzel, Oliver Hohlfeld, Georgios Smaragdakis, Anja Feldmann
2020 J jnl
IEEE Trans. Netw. Serv. Manag.
Ike Kunze, Jan Rüth, Oliver Hohlfeld
2020 J jnl
CoRR
Jens Helge Reelfs, Oliver Hohlfeld, Ingmar Poese
2020 conf
SIGCOMM Posters and Demos
Jens Helge Reelfs, Oliver Hohlfeld, Ingmar Poese
2020 B conf
Networking
Gerhard Hasslinger, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2020 J jnl
Comput. Commun. Rev.
Chris Misa, Dennis Guse, Oliver Hohlfeld, Ramakrishnan Durairajan, Anna Sperotto, Alberto Dainotti, Reza Rejaie
2020 B conf
PAM
Mike Kosek, Leo Blöcher, Jan Rüth, Torsten Zimmermann, Oliver Hohlfeld
2020 J jnl
CoRR
Mike Kosek, Leo Blöcher, Jan Rüth, Torsten Zimmermann, Oliver Hohlfeld
2020 A conf
Internet Measurement Conference
Pelayo Vallina, Victor Le Pochat, Álvaro Feal, Marius Paraschiv, Julien Gamba, Tim Burke, Oliver Hohlfeld, Juan Tapiador, Narseo Vallina-Rodriguez
2020 B conf
QoMEX
Dennis Guse, Oliver Hohlfeld, Anna Wunderlich, Benjamin Weiss, Sebastian Möller
2020 J jnl
CoRR
Dennis Guse, Oliver Hohlfeld, Anna Wunderlich, Benjamin Weiss, Sebastian Möller
2020 A* conf
CCS
Jens Hiller, Johanna Amann, Oliver Hohlfeld
2020 J jnl
CoRR
Jens Hiller, Johanna Amann, Oliver Hohlfeld
2020 A conf
Internet Measurement Conference
Anja Feldmann, Oliver Gasser, Franziska Lichtblau, Enric Pujol, Ingmar Poese, Christoph Dietzel, Daniel Wagner, Matthias Wichtlhuber, Juan Tapiador, Narseo Vallina-Rodriguez, Oliver Hohlfeld, Georgios Smaragdakis
2020 J jnl
CoRR
Anja Feldmann, Oliver Gasser, Franziska Lichtblau, Enric Pujol, Ingmar Poese, Christoph Dietzel, Daniel Wagner, Matthias Wichtlhuber, Juan Tapiador, Narseo Vallina-Rodriguez, Oliver Hohlfeld, Georgios Smaragdakis
2020 J jnl
Comput. Commun. Rev.
Ralph Holz, Jens Hiller, Johanna Amann, Abbas Razaghpanah, Thomas Jost, Narseo Vallina-Rodriguez, Oliver Hohlfeld
2020 J jnl
CoRR
Jens Helge Reelfs, Oliver Hohlfeld, Markus Strohmaier, Niklas Henckell
2020 conf
ICWSM Workshops
Jens Helge Reelfs, Oliver Hohlfeld, Markus Strohmaier, Niklas Henckell
2019 J jnl
CoRR
Konrad Wolsing, Jan Rüth, Klaus Wehrle, Oliver Hohlfeld
2019 conf
ANRW
Konrad Wolsing, Jan Rüth, Klaus Wehrle, Oliver Hohlfeld
2019 conf
TMA
Jan Rüth, Ike Kunze, Oliver Hohlfeld
2019 J jnl
CoRR
Jan Rüth, Ike Kunze, Oliver Hohlfeld
2019 J jnl
CoRR
Oliver Hohlfeld, Helge Reelfs, Jan Rüth, Florian Schmidt, Torsten Zimmermann, Jens Hiller, Klaus Wehrle
2019 J jnl
CoRR
Jan Rüth, Konrad Wolsing, Martin Serror, Klaus Wehrle, Oliver Hohlfeld
2019 A conf
Internet Measurement Conference
Daniel Kopp, Jair Santanna, Matthias Wichtlhuber, Oliver Hohlfeld, Ingmar Poese, Christoph Dietzel
2019 J jnl
CoRR
Daniel Kopp, Matthias Wichtlhuber, Ingmar Poese, Jair Santanna, Oliver Hohlfeld, Christoph Dietzel
2019 conf
NetAI@SIGCOMM
Constantin Sander, Jan Rüth, Oliver Hohlfeld, Klaus Wehrle
2019 J jnl
CoRR
Constantin Sander, Jan Rüth, Oliver Hohlfeld, Klaus Wehrle
2019 J jnl
CoRR
Jan Rüth, Oliver Hohlfeld
2019 B conf
NetSoft
Oliver Hohlfeld, Johannes Krude, Jens Helge Reelfs, Jan Rüth, Klaus Wehrle
2019 conf
KONVENS
Jennifer Fest, Arndt Heilmann, Oliver Hohlfeld, Stella Neumann, Jens Helge Reelfs, Marco Schmitt, Alina Vogelgesang
2019 conf
CAMAD
Gerhard Hasslinger, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2019 conf
WWW (Companion Volume)
Helge Reelfs, Timon Mohaupt, Oliver Hohlfeld, Niklas Henckell
2019 J jnl
CoRR
Helge Reelfs, Timon Mohaupt, Oliver Hohlfeld, Niklas Henckell
2019 conf
WWW (Companion Volume)
Jan Pennekamp, Martin Henze, Oliver Hohlfeld, Andriy Panchenko
2019 B conf
PAM
Jan Rüth, Torsten Zimmermann, Oliver Hohlfeld
2019 J jnl
CoRR
Jan Rüth, Torsten Zimmermann, Oliver Hohlfeld
2019 J jnl
CoRR
Jan Rüth, Konrad Wolsing, Klaus Wehrle, Oliver Hohlfeld
2019 A conf
CoNEXT
Jan Rüth, Konrad Wolsing, Klaus Wehrle, Oliver Hohlfeld
2019 J jnl
IEEE Trans. Netw. Serv. Manag.
Jan Rüth, Ike Kunze, Oliver Hohlfeld
2019 conf
LCN Symposium
Jens Hiller, Martin Henze, Torsten Zimmermann, Oliver Hohlfeld, Klaus Wehrle
2019 B conf
QoMEX
Dennis Guse, Henrique R. Orefice, Gabriel Reimers, Oliver Hohlfeld
2019 J jnl
CoRR
Dennis Guse, Henrique R. Orefice, Gabriel Reimers, Oliver Hohlfeld
2018 J jnl
Comput. Commun. Rev.
Quirin Scheitle, Taejoong Chung, Jens Hiller, Oliver Gasser, Johannes Naab, Roland van Rijswijk-Deij, Oliver Hohlfeld, Ralph Holz, David R. Choffnes, Alan Mislove, Georg Carle
2018 B conf
PAM
Jan Rüth, Ingmar Poese, Christoph Dietzel, Oliver Hohlfeld
2018 J jnl
CoRR
Jan Rüth, Ingmar Poese, Christoph Dietzel, Oliver Hohlfeld
2018 A conf
Internet Measurement Conference
Quirin Scheitle, Oliver Hohlfeld, Julien Gamba, Jonas Jelten, Torsten Zimmermann, Stephen D. Strowes, Narseo Vallina-Rodriguez
2018 J jnl
CoRR
Quirin Scheitle, Oliver Hohlfeld, Julien Gamba, Jonas Jelten, Torsten Zimmermann, Stephen D. Strowes, Narseo Vallina-Rodriguez
2018 conf
Financial Cryptography
Roman Matzutt, Jens Hiller, Martin Henze, Jan Henrik Ziegeldorf, Dirk Müllmann, Oliver Hohlfeld, Klaus Wehrle
2018 conf
ITC (1)
Oliver Hohlfeld, Helge Reelfs, Jan Rüth, Florian Schmidt, Torsten Zimmermann, Jens Hiller, Klaus Wehrle
2018 B conf
PAM
Oliver Hohlfeld, Jan Rüth, Konrad Wolsing, Torsten Zimmermann
2018 J jnl
CoRR
Oliver Hohlfeld, Jan Rüth, Konrad Wolsing, Torsten Zimmermann
2018 conf
CAMAD
Gerhard Hasslinger, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2018 conf
TMA
Jan Rüth, Oliver Hohlfeld
2018 A conf
Internet Measurement Conference
Jan Rüth, Torsten Zimmermann, Konrad Wolsing, Oliver Hohlfeld
2018 J jnl
CoRR
Jan Rüth, Torsten Zimmermann, Konrad Wolsing, Oliver Hohlfeld
2018 A conf
Internet Measurement Conference
Jeremias Blendin, Fabrice Bendfeldt, Ingmar Poese, Boris Koldehofe, Oliver Hohlfeld
2018 J jnl
CoRR
Jeremias Blendin, Fabrice Bendfeldt, Ingmar Poese, Boris Koldehofe, Oliver Hohlfeld
2018 B conf
IC2E
Jens Hiller, Maël Kimmerlin, Max Plauth, Seppo Heikkilä, Stefan Klauck, Ville Lindfors, Felix Eberhardt, Dariusz Bursztynowski, Jesus Llorente Santos, Oliver Hohlfeld, Klaus Wehrle
2018 J jnl
IEEE J. Sel. Areas Commun.
Oliver Hohlfeld, James Kempf, Martin Reisslein, Stefan Schmid, Nadir Shah
2018 J jnl
CoRR
Torsten Zimmermann, Benedikt Wolters, Oliver Hohlfeld, Klaus Wehrle
2018 A conf
CoNEXT
Torsten Zimmermann, Benedikt Wolters, Oliver Hohlfeld, Klaus Wehrle
2018 conf
ANRW
Quirin Scheitle, Taejoong Chung, Johanna Amann, Oliver Gasser, Lexi Brent, Georg Carle, Ralph Holz, Jens Hiller, Johannes Naab, Roland van Rijswijk-Deij, Oliver Hohlfeld, David R. Choffnes, Alan Mislove
2018 conf
SIGCOMM Posters and Demos
Oliver Hohlfeld
2018 B conf
WiOpt
Gerhard Hasslinger, Juho Heikkinen, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2018 J jnl
Comput. Networks
David Hausheer, Oliver Hohlfeld, Stefan Schmid, Guofei Gu
2018 J jnl
CoRR
Quirin Scheitle, Jonas Jelten, Oliver Hohlfeld, Luca Ciprian, Georg Carle
2017 conf
Internet-QoE@SIGCOMM
Torsten Zimmermann, Benedikt Wolters, Oliver Hohlfeld
2017 B conf
Networking
Torsten Zimmermann, Jan Rüth, Benedikt Wolters, Oliver Hohlfeld
2017 A conf
Internet Measurement Conference
Jan Rüth, Christian Bormann, Oliver Hohlfeld
2017 J jnl
Dagstuhl Reports
David Hausheer, Oliver Hohlfeld, Diego R. López, Bruce MacDowell Maggs, Costin Raiciu
2017 J jnl
Comput. Networks
Gerhard Hasslinger, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2017 conf
SIGCOMM Posters and Demos
Felix Rath, Johannes Krude, Jan Rüth, Daniel Schemmel, Oliver Hohlfeld, Jó Ágila Bitsch, Klaus Wehrle
2017 conf
TMA
Martin Henze, Mary Peyton Sanford, Oliver Hohlfeld
2016 B conf
QoMEX
Thomas Zinner, Matthias Hirth, Valentin Fischer, Oliver Hohlfeld
2016 conf
QCMan@ITC
Oliver Hohlfeld, Hannes Fiedler, Enric Pujol, Dennis Guse
2016 conf
IC2E Workshops
Martin Henze, Jens Hiller, Oliver Hohlfeld, Klaus Wehrle
2016 J jnl
Comput. Commun. Rev.
Leonhard Nobach, Oliver Hohlfeld, David Hausheer
2016 A* conf
CCS
Roman Matzutt, Oliver Hohlfeld, Martin Henze, Robin Rawiel, Jan Henrik Ziegeldorf, Klaus Wehrle
2016 A conf
ITC
Gerhard Hasslinger, Konstantinos Ntougias, Frank Hasslinger, Oliver Hohlfeld
2016 ed.
QCMan@ITC
Thomas Zinner, Oliver Hohlfeld, Raimund Schatz, Prasad Calyam
2016 B conf
Networking
Marc Werner, Johannes Schwandke, Matthias Hollick, Oliver Hohlfeld, Torsten Zimmermann, Klaus Wehrle
2016 J jnl
Int. J. Netw. Manag.
Oliver Hohlfeld, Thomas Zinner, Theophilus Benson, David Hausheer
2015 A conf
Internet Measurement Conference
Enric Pujol, Oliver Hohlfeld, Anja Feldmann
2015 J jnl
Comput. Commun. Rev.
Yvonne Coady, Oliver Hohlfeld, James Kempf, Rick McGeer, Stefan Schmid
2015 B conf
MobileHCI
Oliver Hohlfeld, André Pomp, Jó Ágila Bitsch Link, Dennis Guse
2015 A* conf
SIGCOMM
Florian Schmidt, Oliver Hohlfeld, René Glebke, Klaus Wehrle
2015 B conf
QoMEX
Dennis Guse, Sebastian Schuck, Oliver Hohlfeld, Alexander Raake, Sebastian Möller
2014 A conf
Internet Measurement Conference
Oliver Hohlfeld, Enric Pujol, Florin Ciucu, Anja Feldmann, Paul Barford
2014 J jnl
Comput. Commun. Rev.
Thomas Krenc, Oliver Hohlfeld, Anja Feldmann
2014 C conf
LANMAN
Florin Ciucu, Felix Poloczek, Oliver Hohlfeld
2014 A conf
AsiaCCS
Gianluca Stringhini, Oliver Hohlfeld, Christopher Kruegel, Giovanni Vigna
2012 A conf
Internet Measurement Conference
Oliver Hohlfeld, Thomas Graf, Florin Ciucu
2011 conf
TSP
Gerhard Haßlinger, Oliver Hohlfeld
2011 conf
ICC
Oliver Hohlfeld, Balamuhunthan Balarajah, Sebastian Benner, Alexander Raake, Florin Ciucu
2011 A* conf
INFOCOM
Florin Ciucu, Oliver Hohlfeld, Lydia Y. Chen
2010 A conf
ITC
Gerhard Haßlinger, Oliver Hohlfeld
2010 conf
Allerton
Florin Ciucu, Oliver Hohlfeld, Pan Hui
2010 conf
ICC
Florin Ciucu, Oliver Hohlfeld
2009 A conf
ITC
Florin Ciucu, Oliver Hohlfeld
2009 conf
KiVS
Oliver Hohlfeld
2009 J jnl
Prax. Inf.verarb. Kommun.
Oliver Hohlfeld
2009 J jnl
SIGMETRICS Perform. Evaluation Rev.
Oliver Hohlfeld, Florin Ciucu
2008 B conf
IWQoS
Oliver Hohlfeld, Rüdiger Geib, Gerhard Haßlinger
2008 conf
MMB
Gerhard Haßlinger, Oliver Hohlfeld
tests/integration/test_pe_extractors.py
← Index tests/integration/test_pe_extractors.py python
"""
Integration tests for PE-specific extractors.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration, pytest.mark.pe]


# ============================================================================
# PEFeaturesExtractor Tests
# ============================================================================

class TestPEFeaturesExtractor:
    """Tests for PEFeaturesExtractor class."""

    def test_extract_valid_pe(self, pe_binary_path, mock_logger):
        """Test extracting features from valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.models.dataclasses import PE

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, PE)

    def test_extract_pe_type(self, pe_binary_path, mock_logger):
        """Test PE type detection (DLL, EXE, DRIVER)."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.type in ["DLL", "EXE", "DRIVER"]

    def test_extract_architecture(self, pe_binary_path, mock_logger):
        """Test architecture detection."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Architecture should be detected
            assert result.architecture is not None

    def test_extract_entry_point(self, pe_binary_path, mock_logger):
        """Test entry point extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Entry point should be a hex string
            assert result.entry_point.startswith("0x")

    def test_extract_compilation_time(self, pe_binary_path, mock_logger):
        """Test compilation time extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Compilation time should be an integer timestamp
            assert isinstance(result.compilation_time, int)
            assert result.compilation_time_utc is not None

    def test_extract_dotnet_detection(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Should be True for the test .NET binary
            assert isinstance(result.is_dotnet, bool)
            assert result.is_dotnet is True  # Test file is .NET

    def test_extract_headers(self, pe_binary_path, mock_logger):
        """Test header extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.dos_header is not None
            assert result.nt_header is not None
            assert result.file_header is not None
            assert result.optional_header is not None

    def test_extract_counts(self, pe_binary_path, mock_logger):
        """Test section/import/export counts."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert isinstance(result.number_of_sections, int)
            assert isinstance(result.number_of_imports, int)
            assert isinstance(result.number_of_exports, int)
            assert isinstance(result.number_of_resources, int)

    def test_extract_rich_header(self, pe_binary_path, mock_logger):
        """Test Rich header extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Rich header may or may not be present
            # If present, should be JSON string
            if result.rich_header_dump is not None:
                assert isinstance(result.rich_header_dump, str)

    def test_extract_version_info(self, pe_binary_path, mock_logger):
        """Test version info extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Version info may or may not be present
            if result.version_info is not None:
                assert isinstance(result.version_info, list)


# ============================================================================
# PEImportExtractor Tests
# ============================================================================

class TestPEImportExtractor:
    """Tests for PEImportExtractor class."""

    def test_extract_imports(self, pe_binary_path, mock_logger):
        """Test import extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.models.dataclasses import PEImport

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, PEImport)
                assert isinstance(result.pe_imports_total, int)

    def test_extract_import_libraries(self, pe_binary_path, mock_logger):
        """Test import library extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_libraryName is not None:
                assert isinstance(result.pe_import_libraryName, list)

    def test_extract_import_functions(self, pe_binary_path, mock_logger):
        """Test import function extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_functions is not None:
                assert isinstance(result.pe_import_functions, list)

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'library_name' in column_names
                assert 'function_name' in column_names


# ============================================================================
# PESectionExtractor Tests
# ============================================================================

class TestPESectionExtractor:
    """Tests for PESectionExtractor class."""

    def test_extract_sections(self, pe_binary_path, mock_logger):
        """Test section extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor
        from redb.models.dataclasses import PESection

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, list)
            assert len(result) > 0
            assert isinstance(result[0], PESection)

    def test_section_properties(self, pe_binary_path, mock_logger):
        """Test section property extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                section = result[0]
                assert section.section_name is not None
                assert section.section_entropy >= 0
                assert section.section_sha256 is not None
                assert section.section_md5 is not None
                assert section.section_size >= 0

    def test_section_entropy_range(self, pe_binary_path, mock_logger):
        """Test that section entropy is in valid range."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                for section in result:
                    assert 0 <= section.section_entropy <= 8

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'section_name' in column_names
                assert 'section_entropy' in column_names
                assert 'section_sha256' in column_names


# ============================================================================
# PEResourceExtractor Tests
# ============================================================================

class TestPEResourceExtractor:
    """Tests for PEResourceExtractor class."""

    def test_extract_resources(self, pe_binary_path, mock_logger):
        """Test resource extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEResourceExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no resources
            if result is not None:
                assert isinstance(result, list)

    def test_resource_properties(self, pe_binary_path, mock_logger):
        """Test resource property extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor
        from redb.models.dataclasses import PEResource

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEResourceExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                resource = result[0]
                assert isinstance(resource, PEResource)
                assert resource.resource_type is not None


# ============================================================================
# PEOverlayExtractor Tests
# ============================================================================

class TestPEOverlayExtractor:
    """Tests for PEOverlayExtractor class."""

    def test_extract_overlay(self, pe_binary_path, mock_logger):
        """Test overlay extraction."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEOverlayExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no overlay
            # If present, should have overlay properties
            if result is not None:
                assert hasattr(result, 'overlay_size')

    def test_has_overlay_check(self, pe_binary_path, mock_logger):
        """Test overlay detection."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEOverlayExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            has_overlay = extractor._has_overlay()
            assert isinstance(has_overlay, bool)


# ============================================================================
# PESignatureExtractor Tests
# ============================================================================

class TestPESignatureExtractor:
    """Tests for PESignatureExtractor class."""

    def test_extract_signature(self, pe_binary_path, mock_logger):
        """Test signature extraction."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESignatureExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if not signed
            # Result type depends on implementation

    def test_is_signed_check(self, pe_binary_path, mock_logger):
        """Test signature detection."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESignatureExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_signed = extractor._is_signed()
            assert isinstance(is_signed, bool)


# ============================================================================
# PEDotNetExtractor Tests
# ============================================================================

class TestPEDotNetExtractor:
    """Tests for PEDotNetExtractor class."""

    def test_extract_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET metadata extraction."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # The test file is a .NET binary
            if extractor._check_dotnet():
                assert result is not None

    def test_check_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_dotnet = extractor._check_dotnet()
            assert isinstance(is_dotnet, bool)
            # Test file should be .NET
            assert is_dotnet is True


# ============================================================================
# PEInconsistencyTestsExtractor Tests
# ============================================================================

class TestPEInconsistencyTestsExtractor:
    """Tests for PEInconsistencyTestsExtractor class."""

    def test_extract_inconsistency_tests(self, pe_binary_path, mock_logger):
        """Test inconsistency tests extraction."""
        from redb.extractors.pe_extractors.pe_inconsistency_tests import PEInconstistencyTestsExtractor as PEInconsistencyTestsExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEInconsistencyTestsExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # extract() returns True if tests were performed, False otherwise
            # The actual test results are stored in extractor.pe_inconsistency_tests
            # and extractor.dotnet_inconsistency_tests
            assert result in (True, False)

            if result:
                # Check that test results were stored
                assert extractor.pe_inconsistency_tests is not None or extractor.dotnet_inconsistency_tests is not None


# ============================================================================
# PEExtraFindings Tests
# ============================================================================

class TestPEExtraFindings:
    """Tests for PEExtraFindings class."""

    def test_extract_extra_findings(self, pe_binary_path, mock_logger):
        """Test extra findings extraction."""
        from redb.extractors.pe_extractors.pe_extra_findings import PEExtraFindings

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEExtraFindings(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May return None or list of findings
            if result is not None:
                assert isinstance(result, list)


# ============================================================================
# Integration Tests
# ============================================================================

class TestPEExtractorIntegration:
    """Integration tests for PE extractors."""

    def test_all_extractors_same_pe_object(self, pe_binary_path, mock_logger, pe_object):
        """Test that extractors can share the same PE object."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            # Create extractors sharing the same PE object
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger, pe=pe_object)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger, pe=pe_object)
            sections_ext = PESectionExtractor(pe_binary_path, mock_logger, pe=pe_object)

            # All should use the same PE object
            assert features_ext.pe is pe_object
            assert imports_ext.pe is pe_object
            assert sections_ext.pe is pe_object

            # All should extract successfully
            features_result = features_ext.extract()
            imports_result = imports_ext.extract()
            sections_result = sections_ext.extract()

            assert features_result is not None
            # imports and sections may be None if not present

    def test_hash_consistency_across_extractors(self, pe_binary_path, mock_logger):
        """Test that hashes are consistent across all extractors."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger)

            # Hashes should be the same
            assert features_ext.sha256 == imports_ext.sha256
            assert features_ext.md5 == imports_ext.md5
            assert features_ext.sha1 == imports_ext.sha1