Hamid R. Sadjadpour

170 papers A* 4A 1B 37C 4Misc 8Journal 79Unranked 37
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Jinxin Yang, Mohammad Moltafet, Hamid R. Sadjadpour
2025 J jnl
CoRR
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki
2025 J jnl
IEEE Internet Things J.
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki
2025 B conf
ISIT
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki, Marian Codreanu, Roy D. Yates
2025 J jnl
CoRR
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki, Marian Codreanu, Roy D. Yates
2025 C conf
WINCOM
Abdulaziz Alatawi, Hamid R. Sadjadpour, Zouheir Rezki
2025 conf
IEEECONF
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki, Marian Codreanu, Roy D. Yates
2025 J jnl
CoRR
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki, Marian Codreanu, Roy D. Yates
2024 C conf
WINCOM
Abdulaziz Alatawi, Hamid R. Sadjadpour, Zouheir Rezki, Mohammad Moltafet, Abdelrahman Elfikky
2024 B conf
ISIT
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki
2024 conf
IEEECONF
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki
2024 B conf
GLOBECOM
Zain Ali, Zouheir Rezki, Hamid R. Sadjadpour
2024 J jnl
CoRR
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki
2024 J jnl
IEEE Trans. Inf. Forensics Secur.
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki
2024 J jnl
IEEE Access
Xiangjian Gao, Hamid R. Sadjadpour, Farid U. Dowla, Faranak Nekoogar
2024 conf
IEEECONF
I. Zakir Ahmed, Hamid R. Sadjadpour
2024 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour
2023 Misc conf
ICNC
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2023 conf
MILCOM
Mohammad Moltafet, Hamid R. Sadjadpour, Zouheir Rezki
2023 J jnl
IEEE Trans. Veh. Technol.
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2023 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour
2023 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2023 J jnl
IEEE Commun. Lett.
Zain Ali, Zouheir Rezki, Hamid R. Sadjadpour
2022 B conf
WCNC
Zain Ali, Zouheir Rezki, Hamid R. Sadjadpour
2022 J jnl
IEEE Access
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2022 B conf
WCNC
Japneet Singh, Adrish Banerjee, Hamid R. Sadjadpour
2021 conf
ACSCC
Hamid R. Sadjadpour, Shivaswarup Manjakuppam Ashok
2021 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2021 J jnl
IEEE Trans. Green Commun. Netw.
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2021 conf
MILCOM
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2021 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2021 B conf
GLOBECOM
Divyanshu Bhardwaj, Hamid R. Sadjadpour
2020 conf
LATINCOM
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2020 conf
5G World Forum
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2020 J jnl
IEEE Trans. Wirel. Commun.
Jose Armando Oviedo, Hamid R. Sadjadpour
2020 conf
ICSPCS
Hamid R. Sadjadpour
2019 conf
ANTS
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2019 J jnl
CoRR
Jose Armando Oviedo, Hamid R. Sadjadpour
2019 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2018 conf
MILCOM
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2018 conf
MILCOM
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2018 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2018 J jnl
CoRR
Jose Armando Oviedo, Hamid R. Sadjadpour
2018 conf
CCNC
Jose Armando Oviedo, Hamid R. Sadjadpour
2018 conf
ICC
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour, Mohammad Reza Rahimi, Fred Etemadieh
2018 J jnl
CoRR
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour, Mohammad Reza Rahimi, Fred Etemadieh
2018 conf
ICC
Jose Armando Oviedo, Hamid R. Sadjadpour
2018 J jnl
CoRR
Jose Armando Oviedo, Hamid R. Sadjadpour
2018 J jnl
IEEE Trans. Veh. Technol.
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2018 conf
SPCOM
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2018 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2017 J jnl
CoRR
Jose Armando Oviedo, Hamid R. Sadjadpour
2017 J jnl
IEEE Trans. Veh. Technol.
Jose Armando Oviedo, Hamid R. Sadjadpour
2017 J jnl
CoRR
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2017 J jnl
CoRR
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2017 J jnl
IEEE Trans. Veh. Technol.
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2017 Misc conf
ACSSC
I. Zakir Ahmed, Hamid R. Sadjadpour, Shahram Yousefi
2017 conf
ICC
Spencer Sevilla, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2017 J jnl
IEEE Trans. Veh. Technol.
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2017 J jnl
CoRR
Bita Azimdoost, Cédric Westphal, Hamid R. Sadjadpour
2017 J jnl
IEEE Trans. Commun.
Bita Azimdoost, Cédric Westphal, Hamid R. Sadjadpour
2017 J jnl
CoRR
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2017 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2017 Misc conf
ICNC
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2017 J jnl
IEEE Trans. Wirel. Commun.
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2016 J jnl
CoRR
Jose Armando Oviedo, Hamid R. Sadjadpour
2016 conf
INFOCOM Workshops
Jose Armando Oviedo, Hamid R. Sadjadpour
2016 J jnl
CoRR
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2016 conf
INFOCOM Workshops
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2016 J jnl
IEEE Trans. Wirel. Commun.
Mohsen Karimzadeh Kiskani, Bita Azimdoost, Hamid R. Sadjadpour
2016 J jnl
CoRR
Bita Azimdoost, Cédric Westphal, Hamid R. Sadjadpour
2016 J jnl
IEEE Trans. Commun.
Bita Azimdoost, Cédric Westphal, Hamid R. Sadjadpour
2016 J jnl
CoRR
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2015 Misc conf
ICNC
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2015 conf
Logic, Rewriting, and Concurrency
Samuel B. Wood, James Mathewson, Joshua Joy, Mark-Oliver Stehr, Minyoung Kim, Ashish Gehani, Mario Gerla, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2015 J jnl
Wirel. Commun. Mob. Comput.
Mohsen Karimzadeh Kiskani, Zheng Wang, Hamid R. Sadjadpour, Jose Armando Oviedo, Jose Joaquin Garcia-Luna-Aceves
2015 Misc conf
ICNC
Jose Armando Oviedo, Hamid R. Sadjadpour
2014 Misc conf
CISS
Bahador Amiri, Hamid R. Sadjadpour
2014 Misc conf
CISS
Hamid R. Sadjadpour
2014 J jnl
CoRR
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour
2014 B conf
GLOBECOM
Samuel B. Wood, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2014 J jnl
CoRR
Bita Azimdoost, Cédric Westphal, Hamid R. Sadjadpour
2013 conf
MILCOM
Bahador Amiri, Hamid R. Sadjadpour
2013 J jnl
Inf. Sci.
Renato Mariz de Moraes, Hyunchul Kim, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2013 J jnl
IEEE Trans. Wirel. Commun.
Bita Azimdoost, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2013 conf
MILCOM
Samuel B. Wood, James Mathewson, Joshua Joy, Mark-Oliver Stehr, Minyoung Kim, Ashish Gehani, Mario Gerla, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2013 A conf
ITC
Bita Azimdoost, Cédric Westphal, Hamid R. Sadjadpour
2013 Misc conf
ICNC
Bahador Amiri, Hamid R. Sadjadpour
2013 B conf
IWCMC
Mohsen Karimzadeh Kiskani, Hamid R. Sadjadpour, Mohsen Guizani
2013 B conf
IWCMC
Jose Armando Oviedo, Hamid R. Sadjadpour, Mohsen Guizani
2012 B conf
GLOBECOM
Bita Azimdoost, Hamid R. Sadjadpour
2012 J jnl
CoRR
Bita Azimdoost, Cédric Westphal, Hamid R. Sadjadpour
2012 J jnl
IEEE Trans. Mob. Comput.
Xin Wang, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2011 B conf
WCNC
Bita Azimdoost, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2011 B conf
IWCMC
Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves, Mingyue Ji
2011 B conf
IWCMC
Bita Azimdoost, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2011 J jnl
Wirel. Commun. Mob. Comput.
Bahador Amiri, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2011 J jnl
IEEE Trans. Wirel. Commun.
Zheng Wang, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2011 J jnl
IEEE Trans. Commun.
Shirish S. Karande, Zheng Wang, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2011 J jnl
J. Commun. Networks
Hyunchul Kim, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2011 J jnl
J. Commun. Networks
Zheng Wang, Shirish S. Karande, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2011 B conf
IWCMC
Bahador Amiri, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2010 J jnl
IEEE Trans. Commun.
Hui Xu, Xianren Wu, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2010 B conf
MASS
Marzieh Veyseh, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2010 B conf
GLOBECOM
Marzieh Veyseh, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2010 C conf
QSHINE
Hui Xu, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2010 B conf
SECON
Zheng Wang, Mingyue Ji, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2010 J jnl
Int. J. Digit. Multim. Broadcast.
Massimiliano Laddomada, Hsiao-Hwa Chen, Fred Daneshgaran, Marina Mondin, Hamid R. Sadjadpour
2010 A* conf
INFOCOM
Mingyue Ji, Zheng Wang, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2010 J jnl
IEEE Trans. Commun.
Hamid R. Sadjadpour, Zheng Wang, J. J. Garcia-Luna-Aceves
2010 B conf
MASS
Xin Wang, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2009 J jnl
Int. J. Digit. Multim. Broadcast.
Meng Yu, Jing (Tiffany) Li, Hamid R. Sadjadpour
2009 B conf
GLOBECOM
Mingyue Ji, Zheng Wang, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2009 J jnl
Comput. Networks
Xin Wang, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2009 B conf
GLOBECOM
Zheng Wang, Mingyue Ji, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2009 J jnl
Wirel. Networks
Xianren Wu, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2009 J jnl
IEEE Trans. Wirel. Commun.
Zheng Wang, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves, Shirish S. Karande
2009 J jnl
IEEE Trans. Wirel. Commun.
Xianren Wu, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2009 J jnl
IEEE Trans. Wirel. Commun.
Renato Mariz de Moraes, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2009 B conf
SECON
Shirish Karande, Zheng Wang, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2009 conf
ICC
Shirish Karande, Zheng Wang, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2009 conf
ICC
Marzieh Veyseh, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2009 conf
FOWANC@MobiHoc
Shirish Karande, Zheng Wang, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2009 J jnl
IEEE J. Sel. Areas Commun.
Jose Joaquin Garcia-Luna-Aceves, Zheng Wang, Hamid R. Sadjadpour, Shirish S. Karande
2009 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
S. Bromage, C. Engstrom, James Koshimoto, Matt Bromage, Stephen Dabideen, M. Hu, Rolando Menchaca-Méndez, Duy Nguyen, Bruno Astuto A. Nunes, Vladislav Petkov, Dhananjay Sampath, H. Taylor, Marzieh Veyseh, Jose Joaquin Garcia-Luna-Aceves, Katia Obraczka, Hamid R. Sadjadpour, Bradley R. Smith
2008 A* conf
INFOCOM
Zheng Wang, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2008 conf
ACSCC
Hyunchul Kim, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2008 J jnl
Comput. Commun.
Xianren Wu, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves, Hui Xu
2008 conf
ICC
Zheng Wang, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2008 conf
ACSCC
Shirish Karande, Zheng Wang, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2008 conf
Allerton
Zheng Wang, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2008 B conf
ISIT
Zheng Wang, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2008 B conf
ICCCN
Xin Wang, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2008 J jnl
Comput. Commun.
Xianren Wu, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2008 J jnl
CoRR
Zheng Wang, Shirish Karande, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2008 B conf
MASS
Shirish Karande, Zheng Wang, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2008 B conf
ICCCN
Xianren Wu, Hui Xu, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2008 conf
ACSCC
Christophe Rouchy, Hamid R. Sadjadpour
2008 B conf
MobiHoc
Zheng Wang, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2007 A* conf
MobiCom
J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour, Zheng Wang
2007 B conf
ICCCN
Xin Wang, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2007 B conf
IWCMC
J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour, Zheng Wang
2007 B conf
WiOpt
Xianren Wu, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2007 A* conf
INFOCOM
Renato Mariz de Moraes, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2007 B conf
MASS
Xianren Wu, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2007 J jnl
IEEE Trans. Commun.
Renato Mariz de Moraes, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2007 C conf
ISCC
Xin Wang, J. J. Garcia-Luna-Aceves, Hamid R. Sadjadpour
2007 J jnl
EURASIP J. Wirel. Commun. Netw.
Hamid R. Sadjadpour, Robert J. Ulman, Ananthram Swami, Anthony Ephremides
2006 J jnl
IEEE Trans. Signal Process.
Hamid R. Sadjadpour, Kyungmin Kim, Hongyun Wang, Rick S. Blum, Yong Hoon Lee
2006 B conf
IWCMC
Renato Mariz de Moraes, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2006 conf
ICASSP (4)
Christophe Rouchy, Hamid R. Sadjadpour
2006 B conf
IWCMC
Kyungmin Kim, Hamid R. Sadjadpour, Rick S. Blum, Yong Hoon Lee
2006 J jnl
Ad Hoc Networks
Renato Mariz de Moraes, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2006 B conf
GLOBECOM
Kyungmin Kim, Hamid R. Sadjadpour, Rick S. Blum, Yong Hoon Lee
2005 J jnl
IEEE Trans. Commun.
Xianren Wu, Hamid R. Sadjadpour, Zhi Tian
2004 conf
ICC
Zhenyu Zhu, Hamid R. Sadjadpour, Rick S. Blum, Peter A. Andrekson
2004 conf
ICC
Xianren Wu, Hamid R. Sadjadpour, Zhi Tian
2004 J jnl
IEEE Commun. Mag.
Evangelos Eleftheriou, Sedat Ölçer, Hamid R. Sadjadpour
2004 J jnl
EURASIP J. Adv. Signal Process.
Ye (Geoffrey) Li, Hamid R. Sadjadpour, Dirk Dahlhaus, Kung Yao
2004 B conf
GLOBECOM
Renato M. de Moraes, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2004 B conf
MASCOTS
Renato Mariz de Moraes, Hamid R. Sadjadpour, Jose Joaquin Garcia-Luna-Aceves
2004 B conf
SECON
Renato M. de Moraes, Hamid R. Sadjadpour, J. J. Garcia-Luna-Aceves
2003 J jnl
IEEE Trans. Commun.
Beeta Tarokh, Hamid R. Sadjadpour
2002 J jnl
IEEE Trans. Commun.
Zhenyu Zhu, Hamid R. Sadjadpour
2002 conf
ICC
Seokhyun Yoon, Hamid R. Sadjadpour
2001 J jnl
IEEE J. Sel. Areas Commun.
Hamid R. Sadjadpour, Neil J. A. Sloane, Masoud Salehi, Gabriele Nebe
2001 J jnl
IEEE Trans. Commun.
Hamid R. Sadjadpour, Charles L. Weber
2000 B conf
WCNC
Hanks H. Zeng, Ye (Geoffrey) Li, Jack H. Winters, Hamid R. Sadjadpour
2000 conf
ICC (2)
Hamid R. Sadjadpour, M. Salehi, Neil J. A. Sloane, Gabriele Nebe
1999 conf
ICC
Hamid R. Sadjadpour
tests/unit/test_apk_decompile_extractor.py
← Index tests/unit/test_apk_decompile_extractor.py python
"""
Unit tests for DecompileAPK extractor, export data, and ClickHouse schemas.

Tests the main DecompileAPK extractor class following the DecompileBinja test pattern.
All analysis is mocked — no JADX/apktool/Java installation required.
"""
import hashlib
import os
import tempfile
import zipfile

import pytest
from unittest.mock import MagicMock, patch, PropertyMock
from dataclasses import asdict

pytestmark = [pytest.mark.unit, pytest.mark.apk, pytest.mark.decompile]


def _create_fake_apk_file():
    """Create a minimal APK file for testing and return its path."""
    tmpdir = tempfile.mkdtemp()
    apk_path = os.path.join(tmpdir, "test.apk")
    with zipfile.ZipFile(apk_path, "w") as zf:
        zf.writestr("AndroidManifest.xml", b"<manifest/>")
        zf.writestr("classes.dex", b"dex\n035\x00" + b"\x00" * 100)
    return apk_path


# ============================================================================
# DecompileAPK Extractor Tests
# ============================================================================

class TestDecompileAPK:
    """Tests for the DecompileAPK extractor class."""

    def test_tag(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.tag() == "apk_decompiled"
        finally:
            os.unlink(apk_path)

    def test_get_clickhouse_table(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.get_clickhouse_table() is None
        finally:
            os.unlink(apk_path)

    def test_timeout_default(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.APK_DECOMPILE_TIMEOUT == 600
        finally:
            os.unlink(apk_path)

    def test_timeout_from_env(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with patch.dict(os.environ, {"APK_DECOMPILE_TIMEOUT": "900"}):
                ext = DecompileAPK(apk_path, MagicMock())
                assert ext.APK_DECOMPILE_TIMEOUT == 900
        finally:
            os.unlink(apk_path)

    def test_timeout_invalid_env(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with patch.dict(os.environ, {"APK_DECOMPILE_TIMEOUT": "not_a_number"}):
                ext = DecompileAPK(apk_path, MagicMock())
                assert ext.APK_DECOMPILE_TIMEOUT == 600
        finally:
            os.unlink(apk_path)

    def test_calculate_md5(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            result = ext.calculate_md5("test_string")
            assert len(result) == 32
            assert result == hashlib.md5(b"test_string").hexdigest()
        finally:
            os.unlink(apk_path)

    def test_context_manager(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with DecompileAPK(apk_path, MagicMock()) as ext:
                assert ext is not None
        finally:
            os.unlink(apk_path)

    def test_cleanup_run(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            ext.analyzer = MagicMock()
            ext.cleanup_run()
            assert ext.analyzer is None
        finally:
            os.unlink(apk_path)


# ============================================================================
# Export Data Tests
# ============================================================================

class TestPrepareExportData:
    """Tests for DecompileAPK.prepare_export_data() ClickHouse schemas."""

    def _make_extractor_with_results(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        ext = DecompileAPK(apk_path, MagicMock())
        ext.analysis_results = {
            "sha256": "a" * 64,
            "sha1": "b" * 40,
            "md5": "c" * 32,
            "decompiled_content": [
                {
                    "decompiled_method_hash": "d" * 64,
                    "decompiled_method": "public void foo() {}",
                    "decompiled_method_type": "USER",
                    "decompiled_has_string_encryption": False,
                    "decompiled_has_reflection_calls": False,
                    "decompiled_excessive_goto_count": False,
                }
            ],
            "decompiled_refs": [
                {
                    "decompiled_method_hash": "d" * 64,
                    "smali_method_hash": "e" * 64,
                    "decompiled_class_name": "com.example.Foo",
                    "decompiled_method_name": "foo",
                    "decompiled_method_signature": "()V",
                    "decompiled_method_prototype": "void foo()",
                    "functions_caller": ["bar"],
                    "functions_call": ["baz"],
                }
            ],
            "smali_content": [
                {
                    "smali_method_hash": "e" * 64,
                    "smali_method": "invoke-virtual {p0}, Lfoo;->bar()V\nreturn-void",
                    "smali_method_type": "USER",
                    "smali_instructions_count": 10,
                    "smali_register_count": 3,
                    "smali_has_string_encryption": False,
                    "smali_has_reflection_calls": False,
                    "smali_excessive_goto_count": False,
                    "smali_flattened_score": 0.0,
                    "smali_mba_score": 0.0,
                }
            ],
            "smali_refs": [
                {
                    "smali_method_hash": "e" * 64,
                    "decompiled_method_hash": "d" * 64,
                    "smali_class_name": "com.example.Foo",
                    "smali_method_name": "foo",
                    "smali_method_signature": "()V",
                    "ssdeep_smali": None,
                    "tlsh_smali": None,
                }
            ],
            "similarity_metrics": [
                {
                    "smali_method_hash": "e" * 64,
                    "cyclomatic_complexity": 2,
                    "ssdeep_smali": None,
                    "tlsh_smali": None,
                    "ssdeep_smali_normalized": None,
                    "tlsh_smali_normalized": None,
                    "minhash": [],
                }
            ],
            "cfg": [
                {
                    "smali_method_hash": "e" * 64,
                    "cfg_topology_hash": b'\x01' * 16,
                    "block_count": 3,
                    "edge_count": 3,
                    "cfg_instructions_count": 10,
                    "call_count": 1,
                    "cyclomatic_complexity": 2,
                    "loop_count": 0,
                    "max_depth": 2,
                    "max_fan_out": 2,
                    "md_index_topdown": 12345,
                    "md_index_bottomup": 67890,
                    "prime_product_smali": 999,
                    "cfg_feature_tlsh": None,
                    "wl_minhash": [0] * 128,
                    "bb_features": [[5, 1, 0, 1, 1, 0, 0, 2]] * 3,
                    "cfg_adjacency": [0x00000001, 0x00000002],
                }
            ],
            "strings": [
                {
                    "string": "https://evil.example.com/payload",
                    "string_encoding": "UTF8",
                    "string_offset": 0,
                    "string_length": 31,
                    "string_entropy": 3.95,
                }
            ],
            "analysis_errors": [
                {
                    "class_name": "com.example.Foo",
                    "method_name": "bar",
                    "error_location": "jadx",
                    "error_message": "timeout",
                    "error_type": "TimeoutError",
                }
            ],
        }
        return ext, apk_path

    def test_returns_none_when_no_results(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.prepare_export_data("ClickHouseExporter") is None
        finally:
            os.unlink(apk_path)

    def test_multi_table_flag(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert export["multi_table"] is True
        finally:
            os.unlink(apk_path)

    def test_all_table_keys_present(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert "decompiled_content" in export
            assert "decompiled_refs" in export
            assert "smali_content" in export
            assert "smali_refs" in export
            assert "method_similarity_metrics" in export
            assert "strings_raw" in export
            assert "analysis_errors" in export
        finally:
            os.unlink(apk_path)

    def test_decompiled_content_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            dc = export["decompiled_content"]
            assert dc["table"] == "code_apk_decompiled_methods_content"
            assert len(dc["column_names"]) == 7
            assert len(dc["column_type_names"]) == 7
            assert "decompiled_method_hash" in dc["column_names"]
            assert "decompiled_method" in dc["column_names"]
            assert "analysis_date" in dc["column_names"]
            assert len(dc["data"]) == 1
            assert len(dc["data"][0]) == 7
        finally:
            os.unlink(apk_path)

    def test_decompiled_refs_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            dr = export["decompiled_refs"]
            assert dr["table"] == "code_apk_decompiled_methods_references"
            assert len(dr["column_names"]) == 10
            assert len(dr["column_type_names"]) == 10
            assert "sha256" in dr["column_names"]
            assert "sha1" not in dr["column_names"]
            assert "md5" not in dr["column_names"]
            assert "functions_caller" in dr["column_names"]
            assert "functions_call" in dr["column_names"]
        finally:
            os.unlink(apk_path)

    def test_smali_content_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sc = export["smali_content"]
            assert sc["table"] == "code_apk_smali_methods_content"
            assert len(sc["column_names"]) == 11
            assert len(sc["column_type_names"]) == 11
            assert "smali_instructions_count" in sc["column_names"]
            assert "smali_register_count" in sc["column_names"]
            assert "smali_flattened_score" in sc["column_names"]
            assert "smali_mba_score" in sc["column_names"]
        finally:
            os.unlink(apk_path)

    def test_smali_refs_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sr = export["smali_refs"]
            assert sr["table"] == "code_apk_smali_methods_references"
            assert len(sr["column_names"]) == 7
            assert len(sr["column_type_names"]) == 7
            assert "sha1" not in sr["column_names"]
            assert "md5" not in sr["column_names"]
            assert "ssdeep_smali" not in sr["column_names"]
            assert "tlsh_smali" not in sr["column_names"]
        finally:
            os.unlink(apk_path)

    def test_similarity_metrics_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sm = export["method_similarity_metrics"]
            assert sm["table"] == "code_apk_method_similarity_metrics"
            assert len(sm["column_names"]) == 7
            assert "minhash" in sm["column_names"]
            assert "ssdeep_smali_normalized" in sm["column_names"]
            assert "tlsh_smali_normalized" in sm["column_names"]
            # cyclomatic_complexity moved to cfg table
            assert "cyclomatic_complexity" not in sm["column_names"]
            assert "block_count" not in sm["column_names"]
            assert "loop_count" not in sm["column_names"]
        finally:
            os.unlink(apk_path)

    def test_analysis_errors_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            ae = export["analysis_errors"]
            assert ae["table"] == "code_apk_analysis_errors"
            assert len(ae["column_names"]) == 9
            assert "error_hash" in ae["column_names"]
            assert "status" in ae["column_names"]
        finally:
            os.unlink(apk_path)

    def test_sha256_propagated_to_refs(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            # Check that sha256 from analysis_results appears in ref rows
            dr_row = export["decompiled_refs"]["data"][0]
            assert dr_row[0] == "a" * 64  # sha256
            # sha1 and md5 no longer included in refs
            assert "sha1" not in export["decompiled_refs"]["column_names"]
            assert "md5" not in export["decompiled_refs"]["column_names"]
        finally:
            os.unlink(apk_path)

    def test_empty_tables_not_included(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            ext.analysis_results = {
                "sha256": "a" * 64,
                "sha1": "b" * 40,
                "md5": "c" * 32,
                "decompiled_content": [],
                "decompiled_refs": [],
                "smali_content": [],
                "smali_refs": [],
                "similarity_metrics": [],
                "cfg": [],
                "strings": [],
                "analysis_errors": [],
            }
            export = ext.prepare_export_data("ClickHouseExporter")
            assert export == {"multi_table": True}
        finally:
            os.unlink(apk_path)

    def test_non_clickhouse_exporter_returns_none(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            result = ext.prepare_export_data("ElasticsearchExporter")
            assert result is None
        finally:
            os.unlink(apk_path)


# ============================================================================
# Dataclass Tests
# ============================================================================

class TestAPKCodeAnalysisDataclasses:
    """Tests for the new APK code analysis dataclasses."""

    def test_decompiled_method_content(self):
        from redb.models.dataclasses import APKDecompiledMethodContent
        dc = APKDecompiledMethodContent(
            decompiled_method_hash="a" * 64,
            decompiled_method="public void foo() {}",
            decompiled_method_type="USER",
        )
        assert dc.decompiled_has_string_encryption is False
        assert dc.decompiled_has_reflection_calls is False
        assert dc.decompiled_excessive_goto_count is False

    def test_decompiled_method_content_populated(self):
        from redb.models.dataclasses import APKDecompiledMethodContent
        dc = APKDecompiledMethodContent(
            decompiled_method_hash="a" * 64,
            decompiled_method="public void foo() {}",
            decompiled_method_type="USER",
            decompiled_has_string_encryption=True,
            decompiled_has_reflection_calls=True,
            decompiled_excessive_goto_count=True,
        )
        assert dc.decompiled_has_string_encryption is True
        d = asdict(dc)
        assert d["decompiled_method_hash"] == "a" * 64

    def test_decompiled_method_reference(self):
        from redb.models.dataclasses import APKDecompiledMethodReference
        dr = APKDecompiledMethodReference(
            sha256="a" * 64,
            sha1="b" * 40,
            md5="c" * 32,
            decompiled_method_hash="d" * 64,
        )
        assert dr.functions_caller == []
        assert dr.functions_call == []
        assert dr.smali_method_hash is None

    def test_smali_method_content(self):
        from redb.models.dataclasses import APKSmaliMethodContent
        sc = APKSmaliMethodContent(
            smali_method_hash="e" * 64,
            smali_method="invoke-virtual {p0}, Lfoo;->bar()V",
            smali_method_type="USER",
            smali_instructions_count=5,
            smali_register_count=3,
        )
        assert sc.smali_instructions_count == 5
        assert sc.smali_register_count == 3

    def test_smali_method_reference(self):
        from redb.models.dataclasses import APKSmaliMethodReference
        sr = APKSmaliMethodReference(
            sha256="a" * 64,
            sha1="b" * 40,
            md5="c" * 32,
            smali_method_hash="e" * 64,
        )
        assert sr.decompiled_method_hash is None
        assert sr.ssdeep_smali is None
        assert sr.tlsh_smali is None

    def test_method_similarity_metrics(self):
        from redb.models.dataclasses import APKMethodSimilarityMetrics
        ms = APKMethodSimilarityMetrics(smali_method_hash="e" * 64)
        assert ms.cyclomatic_complexity is None
        assert ms.ssdeep_smali_normalized is None
        assert ms.tlsh_smali_normalized is None
        assert ms.minhash == []

    def test_code_analysis_error(self):
        from redb.models.dataclasses import APKCodeAnalysisError
        err = APKCodeAnalysisError(
            sha256="a" * 64,
            error_location="jadx",
            error_message="timeout",
        )
        assert err.class_name is None
        assert err.method_name is None
        assert err.error_type is None


# ============================================================================
# Tag Enum Tests
# ============================================================================

class TestAPKDecompiledTag:
    """Tests for the APK_DECOMPILED tag enum."""

    def test_tag_exists(self):
        from redb.extractors.enum import Tag
        assert hasattr(Tag, "APK_DECOMPILED")

    def test_tag_value(self):
        from redb.extractors.enum import Tag
        assert Tag.APK_DECOMPILED.value == "apk_decompiled"


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

class TestAPKWorkerDecompileIntegration:
    """Tests that DecompileAPK is registered in workers.py."""

    def test_module_registered(self):
        """Verify DecompileAPK is discoverable via the extractor registry."""
        from redb.extractor_registry import get_extractor_class
        cls = get_extractor_class("DecompileAPK")
        assert cls is not None, "DecompileAPK not found in extractor registry"
        assert cls.__name__ == "DecompileAPK"

    def test_worker_apk_dispatch_includes_decompile(self):
        import inspect
        import redb.workers as workers
        source = inspect.getsource(workers.process_binary_file)
        assert "DecompileAPK" in source