Ibrahim Habli

124 papers A* 3A 4B 12C 2Misc 2Journal 55Unranked 44
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Yash Deo, Yan Jia, Toni Lassila, Victoria J. Hodge, Alejandro F. Frangi, Chenghao Qian, Siyuan Kang, Ibrahim Habli
2026 J jnl
CoRR
Shaun Feakins, Ibrahim Habli, Phillip Morgan
2026 J jnl
ACM Trans. Interact. Intell. Syst.
Nathan Gerard Jayy Hughes, Yan Jia, Mark Sujan, Tom Lawton, Ibrahim Habli, John A. McDermid
2026 J jnl
CoRR
Fang Yan, Simon Foster, Ana Cavalcanti, Ibrahim Habli, James Baxter
2026 J jnl
IEEE Softw.
Richard Hawkins, Colin Paterson, Ibrahim Habli, Markus Borg
2025 conf
ISSREW
Sepeedeh Shahbeigi, Richard Hawkins, Simon Burton, Victoria J. Hodge, Colin Paterson, Ibrahim Habli
2025 J jnl
Comput. Biol. Medicine
Yan Jia, Clare Verrill, Kieron White, Monica Dolton, Margaret Horton, Mufaddal Jafferji, Ibrahim Habli
2025 J jnl
AI Ethics
Marten H. L. Kaas, Ibrahim Habli
2025 conf
SAFECOMP (Workshops)
Philippa Ryan, Berk Ozturk, Laura Fearnley, Tom Lawton, Ibrahim Habli
2025 J jnl
CoRR
Kester Dean Clegg, Richard Hawkins, Ibrahim Habli, Tom Lawton
2025 J jnl
ACM Trans. Auton. Adapt. Syst.
Zoë Porter, Radu Calinescu, Ernest Lim, Victoria J. Hodge, Philippa Ryan, Simon Burton, Ibrahim Habli, Tom Lawton, John A. McDermid, John Molloy, Helen Monkhouse, Phillip Morgan, Paul Noordhof, Colin Paterson, Isobel Standen, Jie Zou
2025 conf
ISSREW
Shaun Feakins, Ibrahim Habli, Phillip Morgan
2025 J jnl
CoRR
Ernest Lim, Yajie Vera He, Jared Joselowitz, Kate Preston, Mohita Chowdhury, Louis Williams, Aisling Higham, Katrina Mason, Mariane Melo, Tom Lawton, Yan Jia, Ibrahim Habli
2025 J jnl
CoRR
Yash Deo, Yan Jia, Toni Lassila, William A. P. Smith, Tom Lawton, Siyuan Kang, Alejandro F. Frangi, Ibrahim Habli
2025 conf
EDCC-C
Ibrahim Habli
2025 J jnl
CoRR
Victoria J. Hodge, Colin Paterson, Ibrahim Habli
2025 J jnl
Reliab. Eng. Syst. Saf.
Colin Paterson, Richard Hawkins, Chiara Picardi, Yan Jia, Radu Calinescu, Ibrahim Habli
2025 J jnl
CoRR
Ibrahim Habli, Richard Hawkins, Colin Paterson, Philippa Ryan, Yan Jia, Mark Sujan, John A. McDermid
2025 J jnl
CoRR
Yan Jia, Harriet Evans, Zoë Porter, Simon Graham, John A. McDermid, Tom Lawton, David R. J. Snead, Ibrahim Habli
2025 J jnl
CoRR
John A. McDermid, Yan Jia, Ibrahim Habli
2025 J jnl
CoRR
Zachary Ellis, Jared Joselowitz, Yash Deo, Yajie He, Anna Kalygina, Aisling Higham, Mana Rahimzadeh, Yan Jia, Ibrahim Habli, Ernest Lim
2024 J jnl
AI Ethics
Zoë Porter, Ibrahim Habli, John A. McDermid, Marten H. L. Kaas
2024 J jnl
CoRR
Ran Wei, Simon Foster, Haitao Mei, Fang Yan, Ruizhe Yang, Ibrahim Habli, Colin O'Halloran, Nick Tudor, Tim Kelly
2024 J jnl
J. Syst. Softw.
Ran Wei, Simon Foster, Haitao Mei, Fang Yan, Ruizhe Yang, Ibrahim Habli, Colin O'Halloran, Nick Tudor, Tim Kelly, Yakoub Nemouchi
2024 conf
MIE
Berk Ozturk, Tom Lawton, Stephen Smith, Ibrahim Habli
2024 A conf
Conference on Designing Interactive Systems
Muhammad Hussain, Ioanna Iacovides, Tom Lawton, Vishal Sharma, Zoë Porter, Alice Cunningham, Ibrahim Habli, Shireen Hickey, Yan Jia, Phillip Morgan, Nee Ling Wong
2024 J jnl
CoRR
Marten H. L. Kaas, Christopher Burr, Zoë Porter, Berk Ozturk, Philippa Ryan, Michael A. Katell, Nuala Polo, Kalle Westerling, Ibrahim Habli
2024 J jnl
CoRR
Ozan Vardal, Richard Hawkins, Colin Paterson, Chiara Picardi, Daniel Omeiza, Lars Kunze, Ibrahim Habli
2024 J jnl
Computer
John A. McDermid, Radu Calinescu, Ibrahim Habli, Richard Hawkins, Yan Jia, John Molloy, Matt Osborne, Colin Paterson, Zoë Porter, Philippa Ryan Conmy
2024 conf
SAFECOMP (Workshops)
Kester Dean Clegg, Ibrahim Habli, John A. McDermid
2024 J jnl
CoRR
Philippa Ryan, Zoë Porter, Joanna Al-Qaddoumi, John A. McDermid, Ibrahim Habli
2023 conf
SAFECOMP Workshops
Dhaminda B. Abeywickrama, James Wilson, Suet Lee, Greg Chance, Peter D. Winter, Arianna Manzini, Ibrahim Habli, Shane Windsor, Sabine Hauert, Kerstin Eder
2023 J jnl
CoRR
Dhaminda B. Abeywickrama, James Wilson, Suet Lee, Greg Chance, Peter D. Winter, Arianna Manzini, Ibrahim Habli, Shane Windsor, Sabine Hauert, Kerstin Eder
2023 conf
MedInfo
Niels Peek, Charlotte Stockton-Powdrell, Alexander J. Casson, Matthew Sperrin, Bijan Parsia, Andrea Manca, Cynthia Iglesias, Ibrahim Habli, Lamiece Hassan, Steven Antrobus, Matthew Machin
2023 B conf
ICECCS
Fang Yan, Simon Foster, Ibrahim Habli
2023 conf
TAS
Marten H. L. Kaas, Zoë Porter, Ernest Lim, Aisling Higham, Sarah Khavandi, Ibrahim Habli
2023 J jnl
CoRR
Marten H. L. Kaas, Zoë Porter, Ernest Lim, Aisling Higham, Sarah Khavandi, Ibrahim Habli
2023 conf
MIE
Berk Ozturk, Tom Lawton, Stephen Smith, Ibrahim Habli
2023 conf
TAS
Philippa Ryan Conmy, John A. McDermid, Ibrahim Habli, Zoë Porter
2023 B conf
SAFECOMP
Philippa Ryan Conmy, Berk Ozturk, Tom Lawton, Ibrahim Habli
2023 conf
ICHI
Yan Jia, John A. McDermid, Nathan Gerard Jayy Hughes, Mark Sujan, Tom Lawton, Ibrahim Habli
2023 conf
SafeAI@AAAI
Chiara Picardi, Richard Hawkins, Colin Paterson, Ibrahim Habli
2023 J jnl
CoRR
Zoë Porter, Joanna Al-Qaddoumi, Philippa Ryan Conmy, Phillip Morgan, John A. McDermid, Ibrahim Habli
2022 J jnl
CoRR
Zoë Porter, Ibrahim Habli, John A. McDermid
2022 J jnl
CoRR
Victoria J. Hodge, Richard Hawkins, James Hilder, Ibrahim Habli
2022 J jnl
Nat. Mac. Intell.
Zoë Porter, Annette Zimmermann, Phillip Morgan, John A. McDermid, Tom Lawton, Ibrahim Habli
2022 J jnl
Minds Mach.
Beverley A. Townsend, Colin Paterson, T. T. Arvind, Gabriel Nemirovsky, Radu Calinescu, Ana Cavalcanti, Ibrahim Habli, Alan Thomas
2022 J jnl
CoRR
Richard Hawkins, Matt Osborne, Mike Parsons, Mark Nicholson, John A. McDermid, Ibrahim Habli
2022 C conf
MODELSWARD
Fang Yan, Simon Foster, Ibrahim Habli, Ran Wei
2022 J jnl
CoRR
Shakir Laher, Carla Brackstone, Sara Reis, An Nguyen, Sean White, Ibrahim Habli
2022 J jnl
IEEE Trans. Emerg. Top. Comput.
Yan Jia, John A. McDermid, Tom Lawton, Ibrahim Habli
2021 J jnl
CoRR
Yan Jia, Tom Lawton, John A. McDermid, Eric Rojas, Ibrahim Habli
2021 conf
MIE
Haris Aftab, Syed Hammad Hussain Shah, Ibrahim Habli
2021 B ed.
SAFECOMP
Ibrahim Habli, Mark Sujan, Friedemann Bitsch
2021 ed.
SAFECOMP Workshops
Ibrahim Habli, Mark Sujan, Simos Gerasimou, Erwin Schoitsch, Friedemann Bitsch
2021 B conf
AIME
Yan Jia, John A. McDermid, Ibrahim Habli
2021 J jnl
CoRR
Richard Hawkins, Colin Paterson, Chiara Picardi, Yan Jia, Radu Calinescu, Ibrahim Habli
2021 conf
SAFECOMP Workshops
Paul Festor, Ibrahim Habli, Yan Jia, Anthony C. Gordon, A. Aldo Faisal, Matthieu Komorowski
2021 conf
MedInfo
Ciarán McInerney, Jonathan Benn, Dawn Dowding, Ibrahim Habli, David A. Jenkins, Carolyn McCrorie, Niels Peek, Rebecca Randell, Richard Williams, Owen A. Johnson
2021 J jnl
Artif. Intell. Medicine
Yan Jia, Chaitanya Kaul, Tom Lawton, Roderick Murray-Smith, Ibrahim Habli
2021 conf
MobiHealth
Haris Aftab, Vibhu Gautam, Richard Hawkins, Rob Alexander, Ibrahim Habli
2021 J jnl
J. Biomed. Informatics
Yan Jia, Tom Lawton, John Burden, John A. McDermid, Ibrahim Habli
2021 J jnl
CoRR
Yan Jia, John A. McDermid, Tom Lawton, Ibrahim Habli
2020 conf
SAFECOMP Workshops
John Birch, David Blackburn, John Botham, Ibrahim Habli, David Higham, Helen Monkhouse, Gareth Price, Norina Ratiu, Roger Rivett
2020 conf
IMBSA
Nungki Selviandro, Richard Hawkins, Ibrahim Habli
2020 conf
SAFECOMP Workshops
Francis Rhys Ward, Ibrahim Habli
2020 J jnl
Reliab. Eng. Syst. Saf.
Helen Monkhouse, Ibrahim Habli, John A. McDermid
2020 conf
SafeAI@AAAI
Chiara Picardi, Colin Paterson, Richard Hawkins, Radu Calinescu, Ibrahim Habli
2020 B conf
SAFECOMP
Lydia Gauerhof, Richard Hawkins, Chiara Picardi, Colin Paterson, Yuki Hagiwara, Ibrahim Habli
2020 J jnl
Health Informatics J.
Ibrahim Habli, Yan Jia, Sean White, George Gabriel, Tom Lawton, Mark Sujan, Clive Tomsett
2020 J jnl
CoRR
Ibrahim Habli, Rob Alexander, Richard Hawkins, Mark Sujan, John A. McDermid, Chiara Picardi, Tom Lawton
2020 J jnl
Artif. Intell.
Simon Burton, Ibrahim Habli, Tom Lawton, John A. McDermid, Phillip Morgan, Zoë Porter
2020 conf
MIE
Ibrahim Habli, Charlotte Stockton-Powdrell, Matthew Machin, Paolo Fraccaro, Shôn Lewis, Niels Peek
2020 conf
ICHI
Yan Jia, John Burden, Tom Lawton, Ibrahim Habli
2020 A* conf
DAC
Shuai Zhao, Zhe Jiang, Xiaotian Dai, Iain Bate, Ibrahim Habli, Wanli Chang
2019 B conf
SAFECOMP
Chiara Picardi, Richard Hawkins, Colin Paterson, Ibrahim Habli
2019 conf
ICSA Companion
Radu Calinescu, Danny Weyns, Simos Gerasimou, Ibrahim Habli
2019 B conf
CBMS
William Hulme, Charlotte Stockton-Powdrell, Shôn Lewis, Glen P. Martin, Sandra Bucci, Bijan Parsia, Alexander J. Casson, Ibrahim Habli, Niels Peek
2019 conf
SAFECOMP Workshops
Simon Burton, Lydia Gauerhof, Bibhuti Bhusan Sethy, Ibrahim Habli, Richard Hawkins
2019 conf
MedInfo
Yan Jia, Tom Lawton, Sean White, Ibrahim Habli
2019 B conf
AIME
Chiara Picardi, Ibrahim Habli
2019 conf
AISafety@IJCAI
John A. McDermid, Yan Jia, Ibrahim Habli
2019 J jnl
J. Softw. Evol. Process.
André Luíz de Oliveira, Rosana T. V. Braga, Paulo César Masiero, David Parker, Yiannis Papadopoulos, Ibrahim Habli, Tim Kelly
2018 A* conf
ICSE
Radu Calinescu, Danny Weyns, Simos Gerasimou, M. Usman Iftikhar, Ibrahim Habli, Tim Kelly
2018 J jnl
IEEE Trans. Software Eng.
Radu Calinescu, Danny Weyns, Simos Gerasimou, Muhammad Usman Iftikhar, Ibrahim Habli, Tim Kelly
2018 J jnl
IEEE Trans. Reliab.
Pedro Delgado-Pérez, Ibrahim Habli, Steve Gregory, Rob Alexander, John A. Clark, Inmaculada Medina-Bulo
2018 conf
SAFECOMP Workshops
Zoë Porter, Ibrahim Habli, Helen Monkhouse, John Bragg
2018 B conf
ICSR
André Luíz de Oliveira, Rosana T. V. Braga, Paulo César Masiero, Yiannis Papadopoulos, Ibrahim Habli, Tim Kelly
2018 conf
SAFECOMP Workshops
John Bragg, Ibrahim Habli
2018 conf
MIE
Ahmed Shalan, Abubakar Abdulrahman, Ibrahim Habli, Garry A. Tew, Andrew Thompson
2017 Misc conf
EDCC
Omar Jaradat, Irfan Sljivo, Ibrahim Habli, Richard Hawkins
2017 J jnl
CoRR
Radu Calinescu, Simos Gerasimou, Ibrahim Habli, M. Usman Iftikhar, Tim Kelly, Danny Weyns
2017 J jnl
Reliab. Eng. Syst. Saf.
Mark-Alexander Sujan, Ibrahim Habli, Tim P. Kelly, Astrid Gühnemann, Simone Pozzi, Christopher W. Johnson
2017 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Helen Monkhouse, Ibrahim Habli, John A. McDermid, Siddartha Khastgir, Gunwant Dhadyalla
2016 J jnl
Int. J. Embed. Syst.
André Luíz de Oliveira, Rosana T. V. Braga, Paulo César Masiero, Yiannis Papadopoulos, Ibrahim Habli, Tim Kelly
2015 conf
MILS@HiPEAC
Richard Hawkins, Tim Kelly, Ibrahim Habli
2015 conf
ICSE (2)
Ewen Denney, Ganesh J. Pai, Ibrahim Habli
2015 conf
DepCoS-RELCOMEX
André Luíz de Oliveira, Rosana T. V. Braga, Paulo César Masiero, Yiannis Papadopoulos, Ibrahim Habli, Tim Kelly
2015 conf
HASE
Richard Hawkins, Ibrahim Habli, Dimitrios S. Kolovos, Richard F. Paige, Tim Kelly
2014 Misc conf
EDCC
John Birch, Roger Rivett, Ibrahim Habli, Ben Bradshaw, John Botham, Dave Higham, Helen Monkhouse, Robert Palin
2014 conf
SBESC
André Luíz de Oliveira, Rosana T. V. Braga, Paulo César Masiero, Yiannis Papadopoulos, Ibrahim Habli, Tim Kelly
2014 conf
ICSE Companion
Matthew Bennion, Ibrahim Habli
2014 J jnl
CoRR
Ibrahim Habli, Andrew Rae
2014 conf
MCPS
Ibrahim Habli, Abdulaziz Al-Humam, Tim Kelly, Leila Fahel
2013 A* conf
ICSE
Ewen Denney, Ganesh Pai, Ibrahim Habli, Tim Kelly, John C. Knight
2013 J jnl
IEEE Trans. Software Eng.
Richard Baker, Ibrahim Habli
2013 conf
SASSUR@SAFECOMP
Richard Hawkins, Ibrahim Habli, Tim Kelly
2013 ed.
ASSURE@ICSE
Ewen Denney, Ibrahim Habli, Tim Kelly, John C. Knight, Ganesh Pai
2013 B conf
SAFECOMP
John Birch, Roger Rivett, Ibrahim Habli, Ben Bradshaw, John Botham, Dave Higham, Peter Jesty, Helen Monkhouse, Robert Palin
2012 J jnl
IEEE Softw.
Patrick J. Graydon, Ibrahim Habli, Richard Hawkins, Tim Kelly, John C. Knight
2012 A conf
DSN
Ewen Denney, Ganesh Pai, Ibrahim Habli
2012 J jnl
Reliab. Eng. Syst. Saf.
Ian Dodd, Ibrahim Habli
2012 conf
SAFECOMP Workshops
Alejandra Ruiz, Ibrahim Habli, Huáscar Espinoza
2011 A conf
ESEM
Ewen Denney, Ganesh Pai, Ibrahim Habli
2010 conf
ISARCS
Ibrahim Habli, Tim Kelly
2010 B conf
SAFECOMP
Robert Palin, Ibrahim Habli
2010 J jnl
Int. J. Crit. Comput. Based Syst.
Ibrahim Habli, Richard Hawkins, Tim Kelly
2008 conf
SafeCert@ETAPS
Ibrahim Habli, Tim Kelly
2008 A conf
ISSRE
Ibrahim Habli, Tim Kelly
2007 C conf
SSS
Ibrahim Habli, Tim Kelly
2007 conf
SHARK/ADI@ICSE
Ibrahim Habli, Tim Kelly
2007 B conf
SPLC
Ibrahim Habli, Tim Kelly
2007 conf
ER Workshops
Ibrahim Habli, Weihang Wu, Katrina Attwood, Tim Kelly
2006 J jnl
SIGBED Rev.
Ibrahim Habli, Tim Kelly
tests/unit/conftest.py
← Index tests/unit/conftest.py python
"""
Unit test configuration.

Replaces the redb.extractors package with a minimal stub so that
``from redb.extractors.database_exporters import ...`` works without
pulling in the heavy __init__.py import chain (pefile, elftools,
signify, magic, etc.).

Also stubs out redb.settings so that Elasticsearch / ClickHouse
clients are never actually created during unit tests.

Additionally installs binaryninja stubs for decompiler unit tests.

Stubs heavy third-party packages (pefile, magic, psutil, etc.) so that
redb.workers, redb.queries, redb.ingestor, and redb.s3_utils can all
be imported and patched in unit tests without requiring the real packages.
"""
import sys
import types
from pathlib import Path
from unittest.mock import MagicMock

# ---------------------------------------------------------------------------
# 0. Install binaryninja stubs FIRST — must happen before any decompiler
#    module is imported (triggered by __init__.py chain).
# ---------------------------------------------------------------------------
from tests.unit.conftest_binja_stubs import install_binja_stubs as _install_binja_stubs
_install_binja_stubs()

# ---------------------------------------------------------------------------
# 1. Stub external packages required by database_exporters.py itself,
#    the decompiler chain, and the workers/ingestor modules.
# ---------------------------------------------------------------------------
_heavy_deps = [
    # Database / networking
    "elasticsearch", "clickhouse_connect", "dotenv",
    # Binary analysis — top-level packages
    "pefile", "magic", "machofile",
    # Archive handling
    "py7zr", "pyzipper",
    # File type detection
    "magika",
    # System monitoring
    "psutil",
    # S3 / MinIO (submodule paths needed for `from minio.error import S3Error`)
    "minio", "minio.error",
    # YARA
    "yara_x",
    # Binary parsing — elftools tree
    "elftools", "elftools.elf", "elftools.elf.elffile",
    "elftools.common", "elftools.common.exceptions",
    # Code signing — signify tree
    "signify", "signify.fingerprinter", "signify.authenticode",
    # LIEF
    "lief",
    # Fuzzy hashing
    "ppdeep",
    # .NET analysis
    "dotnetfile",
    # Crypto / ASN.1
    "asn1crypto", "asn1crypto.cms", "asn1crypto.pem", "asn1crypto.x509", "asn1crypto.core",
    # Hashing
    "xxhash", "blake3", "mmh3", "numpy",
    # APK analysis
    "androguard", "androguard.core", "androguard.core.apk",
    "androguard.core.dex", "androguard.core.api_specific_resources",
    "androguard.misc",
    "permhash",
]
for _mod in _heavy_deps:
    if _mod not in sys.modules:
        try:
            __import__(_mod)
        except (ImportError, ModuleNotFoundError):
            sys.modules[_mod] = MagicMock()

# Stub urllib3 with a real Warning subclass (warnings.filterwarnings needs a class)
if "urllib3" not in sys.modules or isinstance(sys.modules.get("urllib3"), MagicMock):
    try:
        import urllib3  # noqa: F401
    except (ImportError, ModuleNotFoundError):
        _urllib3_mod = types.ModuleType("urllib3")
        _urllib3_exc = types.ModuleType("urllib3.exceptions")

        class _InsecureRequestWarning(UserWarning):
            pass

        _urllib3_exc.InsecureRequestWarning = _InsecureRequestWarning
        _urllib3_mod.exceptions = _urllib3_exc
        sys.modules["urllib3"] = _urllib3_mod
        sys.modules["urllib3.exceptions"] = _urllib3_exc

# Provide a functional ppdeep stub (tests call ppdeep.hash() and expect a string).
# Must overwrite the MagicMock that the loop above may have installed.
_ppdeep_existing = sys.modules.get("ppdeep")
if _ppdeep_existing is None or isinstance(_ppdeep_existing, MagicMock):
    _ppdeep_mod = types.ModuleType("ppdeep")
    _ppdeep_mod.__name__ = "ppdeep"

    def _ppdeep_hash(data):
        """Fake ssdeep hash — returns a deterministic placeholder."""
        if isinstance(data, str):
            data = data.encode("utf-8")
        if len(data) < 50:
            return None
        import hashlib
        h = hashlib.md5(data).hexdigest()
        return f"3:{h[:16]}:{h[16:]}"

    _ppdeep_mod.hash = _ppdeep_hash
    sys.modules["ppdeep"] = _ppdeep_mod

# Stub mmh3 if the C extension is not available
_mmh3_existing = sys.modules.get("mmh3")
if _mmh3_existing is None or isinstance(_mmh3_existing, MagicMock):
    _mmh3_mod = types.ModuleType("mmh3")
    _mmh3_mod.__name__ = "mmh3"

    def _mmh3_hash(data, seed=0):
        """Fake MurmurHash3 — deterministic hash using built-in hashlib."""
        import hashlib
        if isinstance(data, str):
            data = data.encode("utf-8")
        seed_bytes = (seed & 0xFFFFFFFF).to_bytes(8, "little")
        h = hashlib.md5(data + seed_bytes).digest()
        return int.from_bytes(h[:4], "little", signed=True)

    _mmh3_mod.hash = _mmh3_hash
    sys.modules["mmh3"] = _mmh3_mod

# Stub tlsh if the C extension is not available
if "tlsh" not in sys.modules:
    try:
        import tlsh as _real_tlsh  # noqa: F401
    except (ImportError, ModuleNotFoundError):
        _tlsh_mock = types.ModuleType("tlsh")
        _tlsh_mock.__name__ = "tlsh"

        def _tlsh_hash(data):
            """Fake TLSH hash — returns a deterministic placeholder.

            Returns empty string for data < 50 bytes or data with very
            low entropy (e.g. repeating patterns), mimicking the real
            TLSH library's "TNULL" behaviour.
            """
            if isinstance(data, str):
                data = data.encode("utf-8")
            if len(data) < 50:
                return ""
            # Real TLSH returns "" for low-entropy input
            if len(set(data)) < 8:
                return ""
            import hashlib
            return "T1" + hashlib.sha256(data).hexdigest()[:70].upper()

        _tlsh_mock.hash = _tlsh_hash
        sys.modules["tlsh"] = _tlsh_mock

# ---------------------------------------------------------------------------
# 2. Stub redb.settings (package) so module-level code never runs
# ---------------------------------------------------------------------------
_settings_mock = MagicMock()
_settings_mock.__name__ = "redb.settings"
sys.modules["redb.settings"] = _settings_mock
sys.modules["redb.settings.elasticsearch"] = MagicMock()
sys.modules["redb.settings.clickhouse"] = MagicMock()

# ---------------------------------------------------------------------------
# 3. Replace redb.extractors with a minimal package that does NOT eagerly
#    import every extractor (and their heavy deps).  Sub-module imports
#    like ``from redb.extractors.database_exporters import ...`` still work
#    because __path__ points to the real package directory.
# ---------------------------------------------------------------------------
_repo_root = Path(__file__).resolve().parents[2]
_extractors_pkg = types.ModuleType("redb.extractors")
_extractors_pkg.__path__ = [str(_repo_root / "redb" / "extractors")]
_extractors_pkg.__package__ = "redb.extractors"
sys.modules["redb.extractors"] = _extractors_pkg

# ---------------------------------------------------------------------------
# 4. Force-import redb submodules so that @patch('redb.workers.xxx'),
#    @patch('redb.queries.xxx'), etc. can resolve at decoration time.
#    This works because all heavy deps are already stubbed above.
# ---------------------------------------------------------------------------
import redb.logging_utils   # noqa: F401, E402
import redb.s3_utils         # noqa: F401, E402
import redb.queries          # noqa: F401, E402
import redb.workers          # noqa: F401, E402
import redb.ingestor         # noqa: F401, E402