Insoo Koo

203 papers B 2C 1Misc 1Journal 142Unranked 57
YearRankTypeTitle / Venue / Authors
2026 conf
ICAIIC
Miracle Udurume, Vladimir V. Shakhov, Insoo Koo
2025 conf
ICEIC
Rehan Khan, Umer Saeed, Insoo Koo
2025 conf
ICEIC
Raihan Uddin, Insoo Koo
2025 J jnl
IEEE Access
Waqas Mustafa, Huma Ghafoor, Insoo Koo
2025 J jnl
IEEE Access
Nouman Ijaz, Md. Nazmul Hasan, Insoo Koo
2025 J jnl
IEEE Access
Muhammad Rehan Basharat, Ayesha Khanam, Mastora Alizada, Huma Ghafoor, Sana Qadir, Seung Yeob Nam, Insoo Koo
2025 J jnl
IEEE Trans. Intell. Transp. Syst.
Fatima Sohail, Huma Ghafoor, Insoo Koo
2024 conf
ICTC
Miracle Udurume, Judith Nkechinyere Njoku, Vladimir V. Shakhov, Insoo Koo
2024 J jnl
IEEE Access
Carla E. Garcia, Mario R. Camana, Insoo Koo
2024 J jnl
IEEE Trans. Intell. Transp. Syst.
Muhammad Rafid, Huma Ghafoor, Insoo Koo
2024 J jnl
IEEE Open J. Commun. Soc.
Iqra Hameed, Insoo Koo
2024 J jnl
IEEE Access
Shafi Ullah Khan, Carla E. Garcia, Taewoong Hwang, Insoo Koo
2024 J jnl
IEEE Access
Abid Afridi, Iqra Hameed, Carla E. Garcia, Insoo Koo
2024 J jnl
IEEE Access
Vladimir V. Shakhov, Denis A. Migov, Honglong Chen, Polina V. Mishchenko, Insoo Koo
2024 conf
ICTC
Md. Nazmul Hasan, Rafia Nishat Toma, Sana Ullah Jan, Insoo Koo
2023 conf
ICCAE
Carla E. Garcia, Insoo Koo
2023 J jnl
IEEE Trans. Green Commun. Netw.
Carla E. Garcia, Mario R. Camana, Insoo Koo
2023 conf
ICIC (2)
Iqra Hameed, Insoo Koo
2023 J jnl
IEEE Access
Carla E. Garcia, Insoo Koo
2023 J jnl
IEEE Access
Iqra Hameed, Mario R. Camana, Pham Viet Tuan, Insoo Koo
2023 J jnl
Sensors
Shafi Ullah Khan, Sana Ullah Jan, Insoo Koo
2022 J jnl
IEEE Access
Huynh Thanh Thien, Pham Viet Tuan, Insoo Koo
2022 conf
RIVF
Vladimir V. Shakhov, Insoo Koo
2022 conf
ICUFN
Carla E. Garcia, Mario R. Camana, Insoo Koo
2022 J jnl
IEEE Access
Mario R. Camana, Carla E. Garcia, Insoo Koo
2022 J jnl
EAI Endorsed Trans. Ind. Networks Intell. Syst.
Tran Thi Kim Nga, Pham Viet Tuan, Dang Minh Nhat, Dang Minh Tam, Insoo Koo, Vladimir Y. Mariano, Tuan Do-Hong
2022 J jnl
IEEE Access
Carla E. Garcia, Mario R. Camana, Insoo Koo
2022 conf
BlackSeaCom
Mario R. Camana, Carla E. Garcia, Insoo Koo, Vladimir V. Shakhov
2022 J jnl
Sensors
Vladimir V. Shakhov, Andrei Materukhin, Olga D. Sokolova, Insoo Koo
2022 conf
ICUFN
Mario R. Camana, Carla E. Garcia, Insoo Koo
2022 J jnl
IEEE Trans. Green Commun. Netw.
Mario R. Camana, Carla E. Garcia, Insoo Koo
2022 J jnl
Sensors
Shahnaz TayebiHaghighi, Insoo Koo
2021 J jnl
IEEE Syst. J.
Quang Vinh Do, Insoo Koo
2021 J jnl
IEEE Access
Huynh Thanh Thien, Van-Hiep Vu, Insoo Koo
2021 J jnl
Inf. Sci.
Sana Ullah Jan, Young-Doo Lee, Insoo Koo
2021 J jnl
IEEE Internet Things J.
Vladimir V. Shakhov, Insoo Koo
2021 J jnl
Sensors
Umer Saeed, Young-Doo Lee, Sana Ullah Jan, Insoo Koo
2021 J jnl
IEEE Access
Tran Thi Kim Nga, Pham Viet Tuan, Dang Minh Tam, Insoo Koo, Vladimir Y. Mariano, Tuan Do-Hong
2021 J jnl
IEEE Access
Iqra Hameed, Pham Viet Tuan, Insoo Koo
2021 conf
ICTC
Huynh Thanh Thien, Pham Viet Tuan, Insoo Koo
2021 J jnl
ICT Express
Hoang Thi Huong Giang, Pham-Duy Thanh, Insoo Koo
2021 J jnl
IEEE Access
Quang Do Vinh, Insoo Koo
2021 J jnl
Reliab. Eng. Syst. Saf.
Umer Saeed, Sana Ullah Jan, Young-Doo Lee, Insoo Koo
2021 J jnl
Int. J. Softw. Tools Technol. Transf.
Vladimir V. Shakhov, Insoo Koo
2021 conf
ICTC
Iqra Hameed, Insoo Koo
2021 J jnl
IEEE Syst. J.
Mario Rodrigo Camana Acosta, Carla Estefania Garcia Moreta, Insoo Koo
2021 J jnl
ICT Express
Carla E. Garcia, Mario R. Camana, Insoo Koo
2021 J jnl
IEEE Access
Pham-Duy Thanh, Tran Nhut Khai Hoan, Hoang Thi Huong Giang, Insoo Koo
2021 J jnl
Neurocomputing
Carla E. Garcia, Mario R. Camana, Insoo Koo
2021 conf
ICTC
Shahnaz TayebiHaghighi, Insoo Koo
2021 J jnl
Wirel. Networks
Hoang Thi Huong Giang, Tran Nhut Khai Hoan, Insoo Koo
2020 conf
ICCSA (1)
Vladimir V. Shakhov, Olga D. Sokolova, Insoo Koo
2020 J jnl
Wirel. Commun. Mob. Comput.
Huma Ghafoor, Insoo Koo
2020 J jnl
Wirel. Networks
Pham Viet Tuan, Insoo Koo
2020 conf
ICTC
Hoang Thi Huong Giang, Pham-Duy Thanh, Insoo Koo
2020 J jnl
IEEE Access
Usman Mussadiq, Anzar Mahmood, Saeed Ahmed, Sohail Razzaq, Insoo Koo
2020 J jnl
IEEE Access
Mario R. Camana Acosta, Saeed Ahmed, Carla E. Garcia, Insoo Koo
2020 conf
ICTC
Shahnaz TayebiHaghighi, Insoo Koo
2020 J jnl
Wirel. Networks
Mario R. Camana, Pham Viet Tuan, Carla E. Garcia, Insoo Koo
2020 conf
ICTC
Carla E. Garcia, Mario R. Camana, Insoo Koo
2020 J jnl
IEEE Syst. J.
Pham Viet Tuan, Insoo Koo
2020 conf
ICTC
Mario R. Camana, Carla E. Garcia, Insoo Koo
2020 conf
ICTC
Pham-Duy Thanh, Hoang Thi Huong Giang, Insoo Koo
2019 J jnl
Wirel. Commun. Mob. Comput.
Muhammad Sajjad Khan, Muhammad Jibran, Insoo Koo, Su Min Kim, Junsu Kim
2019 J jnl
Int. J. Commun. Syst.
Hoang Thi Huong Giang, Tran Nhut Khai Hoan, Pham-Duy Thanh, Insoo Koo
2019 J jnl
Wirel. Commun. Mob. Comput.
Hurmat Ali Shah, Insoo Koo, Kyung Sup Kwak
2019 J jnl
Wirel. Networks
Quang Vinh Do, Insoo Koo
2019 conf
ICIC (1)
Mario R. Camana, Carla E. Garcia, Insoo Koo
2019 conf
ICAIIC
Quang Vinh Do, Insoo Koo
2019 J jnl
Wirel. Networks
Pham-Duy Thanh, Tran Nhut Khai Hoan, Hiep Vu-Van, Insoo Koo
2019 J jnl
Int. J. Commun. Syst.
Hurmat Ali Shah, Insoo Koo
2019 J jnl
Wirel. Networks
Huma Ghafoor, Insoo Koo
2019 conf
BlackSeaCom
Vladimir V. Shakhov, Sana Ullah Jan, Saeed Ahmed, Insoo Koo
2019 conf
ICIC (2)
Carla E. Garcia, Mario R. Camana, Insoo Koo, Md. Arifur Rahman
2019 J jnl
IEEE Trans. Broadcast.
Carla E. Garcia Moreta, Mario R. Camana Acosta, Insoo Koo
2019 J jnl
IEEE Access
Sana Ullah Jan, Saeed Ahmed, Vladimir V. Shakhov, Insoo Koo
2019 J jnl
IEEE Trans. Inf. Forensics Secur.
Saeed Ahmed, Youngdoo Lee, Seung Ho Hyun, Insoo Koo
2018 J jnl
J. Sensors
Sana Ullah Jan, Insoo Koo
2018 J jnl
IEEE Access
Hurmat Ali Shah, Insoo Koo
2018 conf
ICUFN
Gyu-hyung Lee, Young-Doo Lee, Insoo Koo
2018 conf
ICUFN
Jae-Wan Yang, Young-Doo Lee, Insoo Koo
2018 J jnl
Sensors
Vladimir V. Shakhov, Insoo Koo
2018 J jnl
Secur. Commun. Networks
Pham-Duy Thanh, Hiep-Vu Van, Insoo Koo
2018 J jnl
IEICE Trans. Commun.
Pham Viet Tuan, Insoo Koo
2018 J jnl
Sensors
Md. Arifur Rahman, Young-Doo Lee, Insoo Koo
2018 J jnl
IEEE Access
Saeed Ahmed, Youngdoo Lee, Seung Ho Hyun, Insoo Koo
2018 J jnl
J. Inform. and Commun. Convergence Engineering
Huynh Thanh Thien, Rene Tendeng, Hiep-Vu Van, Insoo Koo
2018 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Van-Hiep Vu, Insoo Koo
2018 J jnl
Sensors
Tran Nhut Khai Hoan, Hiep-Vu Van, Insoo Koo
2018 J jnl
Sensors
Md. Arifur Rahman, Young-Doo Lee, Insoo Koo
2018 conf
CyberC
Sana Ullah Jan, Van-Hiep Vu, Insoo Koo
2018 J jnl
Wirel. Commun. Mob. Comput.
Hurmat Ali Shah, Insoo Koo
2018 J jnl
IEICE Trans. Commun.
Pham Viet Tuan, Insoo Koo
2018 J jnl
Wirel. Pers. Commun.
Pham-Duy Thanh, Hiep-Vu Van, Insoo Koo
2018 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Pham Viet Tuan, Insoo Koo
2017 J jnl
J. Sensors
Saeed Ahmed, Youngdoo Lee, Seung Ho Hyun, Insoo Koo
2017 J jnl
Int. J. Distributed Sens. Networks
Md. Arifur Rahman, Youngdoo Lee, Insoo Koo
2017 J jnl
IEEE Access
Md. Arifur Rahman, Youngdoo Lee, Insoo Koo
2017 J jnl
IEICE Trans. Commun.
Muhammad Sajjad Khan, Muhammad Usman, Hiep-Vu Van, Insoo Koo
2017 conf
ICCAE
Md. Arifur Rahman, Young-Doo Lee, Insoo Koo
2017 J jnl
J. Inform. and Commun. Convergence Engineering
Quang Do Vinh, Insoo Koo
2017 J jnl
IET Commun.
Huma Ghafoor, Youngtae Noh, Insoo Koo
2017 J jnl
IEEE Access
Pham Viet Tuan, Insoo Koo
2017 J jnl
IEICE Trans. Commun.
Tran Nhut Khai Hoan, Hiep-Vu Van, Insoo Koo
2017 J jnl
Sensors
Pham Viet Tuan, Insoo Koo
2017 J jnl
IEEE Access
Sana Ullah Jan, Young-Doo Lee, Jungpil Shin, Insoo Koo
2017 conf
ICTC
Sana Ullah Jan, Insoo Koo
2017 J jnl
J. Inform. and Commun. Convergence Engineering
Van-Hiep Vu, Insoo Koo
2016 J jnl
Wirel. Pers. Commun.
Adil Mahmud, Young-Doo Lee, Insoo Koo
2016 J jnl
Hum. centric Comput. Inf. Sci.
Md. Arifur Rahman, Young-Doo Lee, Insoo Koo
2016 J jnl
Int. J. Distributed Sens. Networks
Huma Ghafoor, Youngtae Noh, Insoo Koo
2016 J jnl
Int. J. Distributed Sens. Networks
Md. Arifur Rahman, Youngdoo Lee, Insoo Koo
2016 J jnl
Sensors
Tran Nhut Khai Hoan, Hiep-Vu Van, Insoo Koo
2016 J jnl
J. Inform. and Commun. Convergence Engineering
Hurmat Ali Shah, Laiq Hasan, Insoo Koo
2016 J jnl
IET Commun.
Tran Nhut Khai Hoan, Insoo Koo
2016 conf
ICUFN
Huma Ghafoor, Insoo Koo
2016 J jnl
J. Sensors
Huma Ghafoor, Insoo Koo
2016 J jnl
J. Inf. Process. Syst.
Muhammad Sajjad Khan, Insoo Koo
2016 J jnl
IET Commun.
Pham Viet Tuan, Insoo Koo
2015 J jnl
Sensors
Muhammad Usman, Muhammad Sajjad Khan, Hiep-Vu Van, Insoo Koo
2015 J jnl
CoRR
Muhammad Usman, Dongsoo Har, Insoo Koo
2015 J jnl
IEICE Trans. Commun.
Hiep-Vu Van, Insoo Koo
2015 J jnl
J. Inform. and Commun. Convergence Engineering
Muhammad Sajjad Khan, Insoo Koo
2015 J jnl
J. Sensors
Sana Ullah Jan, Young-Doo Lee, Insoo Koo
2015 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Hiep-Vu Van, Insoo Koo
2015 J jnl
J. Inform. and Commun. Convergence Engineering
Hiep-Vu Van, Insoo Koo
2015 J jnl
Symmetry
Muhammad Usman, Insoo Koo
2015 J jnl
Int. J. Distributed Sens. Networks
Thanh Tung Nguyen, Insoo Koo
2015 J jnl
Sensors
Thanh Tung Nguyen, Insoo Koo
2014 J jnl
J. Sensors
Thuc Kieu-Xuan, Sungsoo Choi, Insoo Koo
2014 conf
FCC
Hiep Vu-Van, Insoo Koo
2014 J jnl
KSII Trans. Internet Inf. Syst.
Young-Doo Lee, Insoo Koo
2014 J jnl
IEICE Trans. Commun.
Thanh Tung Nguyen, Insoo Koo
2014 J jnl
KSII Trans. Internet Inf. Syst.
Thanh Tung Nguyen, Insoo Koo
2014 Misc conf
FIT
Muhammad Usman, Insoo Koo
2014 conf
ISCIT
Thanh Tung Nguyen, Insoo Koo
2013 J jnl
Wirel. Pers. Commun.
Youngdoo Lee, Insoo Koo
2013 J jnl
EURASIP J. Wirel. Commun. Netw.
Nhan Nguyen-Thanh, Insoo Koo
2013 J jnl
Inf. Sci.
Thuc Kieu-Xuan, Insoo Koo
2013 J jnl
KSII Trans. Internet Inf. Syst.
Tahidul Islam, Insoo Koo
2013 J jnl
J. Inform. and Commun. Convergence Engineering
Muhammad Sajjad Khan, Insoo Koo
2013 J jnl
KSII Trans. Internet Inf. Syst.
Hoang Anh, Insoo Koo
2012 J jnl
IEICE Trans. Commun.
Hiep-Vu Van, Insoo Koo
2012 J jnl
IEEE Trans. Consumer Electron.
Hiep-Vu Van, Insoo Koo
2012 J jnl
J. Inform. and Commun. Convergence Engineering
Md. Sipon Miah, Insoo Koo
2012 J jnl
IET Commun.
Nhan Nguyen-Thanh, Insoo Koo
2012 J jnl
IEEE Trans. Wirel. Commun.
Nguyen-Thanh Nhan, Thuc Kieu-Xuan, Insoo Koo
2012 J jnl
KSII Trans. Internet Inf. Syst.
Thuc Kieu-Xuan, Insoo Koo
2012 J jnl
J. Inform. and Commun. Convergence Engineering
Md. Sipon Miah, Insoo Koo
2011 J jnl
J. Inform. and Commun. Convergence Engineering
Hiep-Vu Van, Insoo Koo
2011 J jnl
IEICE Trans. Commun.
Thuc Kieu-Xuan, Insoo Koo
2011 conf
ACIIDS (1)
Hiep-Vu Van, Insoo Koo
2011 J jnl
IEEE Trans. Consumer Electron.
Hiep-Vu Van, Insoo Koo
2011 conf
WTS
Thuc Kieu-Xuan, Insoo Koo
2011 J jnl
IEEE Trans. Veh. Technol.
Nhan Nguyen-Thanh, Insoo Koo
2011 conf
FGIT-MulGraB (1)
Tahidul Islam, Insoo Koo
2011 J jnl
IEEE Commun. Lett.
Nguyen-Thanh Nhan, Insoo Koo
2011 J jnl
KSII Trans. Internet Inf. Syst.
Hiep-Vu Van, Insoo Koo
2011 J jnl
J. Commun. Networks
Asaduzzaman, Hyung Yun Kong, Insoo Koo
2010 J jnl
IEICE Trans. Commun.
Thuc Kieu-Xuan, Insoo Koo
2010 J jnl
KSII Trans. Internet Inf. Syst.
Thuc Kieu-Xuan, Insoo Koo
2010 conf
ICIC (3)
Young-du Lee, Insoo Koo
2010 conf
ICIC (3)
Nguyen-Thanh Nhan, Insoo Koo
2010 conf
ICIC (3)
Thuc Kieu-Xuan, Insoo Koo
2010 J jnl
IEICE Trans. Commun.
Nguyen-Thanh Nhan, Insoo Koo
2010 conf
ICIC (2)
Chau-Pham Thi Hong, Hyung-Seo Kang, Insoo Koo
2010 J jnl
IEICE Trans. Commun.
Thuc Kieu-Xuan, Insoo Koo
2010 J jnl
KSII Trans. Internet Inf. Syst.
Tran-Xuan Cong, Insoo Koo
2010 conf
ICIC (2)
Hiep-Vu Van, Insoo Koo
2010 conf
AICT
Hiep-Vu Van, Insoo Koo
2010 conf
ACIIDS (1)
Chau-Pham Thi Hong, Youngdoo Lee, Insoo Koo
2009 conf
ICIC (2)
Young-du Lee, Tae-joon Yun, Insoo Koo
2009 J jnl
IEICE Trans. Commun.
Nguyen-Thanh Nhan, Insoo Koo
2009 conf
ICIC (2)
Nguyen-Thanh Nhan, Insoo Koo
2009 conf
ICIC (2)
Hiep-Vu Van, Insoo Koo
2009 J jnl
IEEE Commun. Lett.
Nguyen-Thanh Nhan, Insoo Koo
2009 conf
ICIC (2)
Nguyen-Thanh Nhan, Thuc Kieu-Xuan, Insoo Koo
2008 J jnl
IEICE Trans. Commun.
Tran-Xuan Cong, Eunchan Kim, Insoo Koo
2008 conf
ICIC (1)
Tran-Xuan Cong, Eunchan Kim, Insoo Koo
2007 J jnl
IEICE Trans. Commun.
Insoo Koo, Jeongrok Yang, Kiseon Kim
2007 J jnl
IEEE Trans. Veh. Technol.
Insoo Koo, Jeongrok Yang, Kiseon Kim
2007 conf
ICIC (2)
Sungsoo Choi, Insoo Koo, Youngsun Kim
2007 J jnl
IEICE Trans. Commun.
Dmitry Kramarev, Insoo Koo, Kiseon Kim
2006 J jnl
IEICE Trans. Commun.
Insoo Koo, Kiseon Kim
2006 conf
MSN
Dmitry Kramarev, Insoo Koo, Kiseon Kim
2005 conf
ICN (2)
Insoo Koo, Jeongrok Yang, Kiseon Kim
2005 J jnl
Wirel. Pers. Commun.
Hyunduk Kang, Seokjin Sung, Insoo Koo, Kiseon Kim
2005 conf
Systems Communications
Insoo Koo, Seokjoo Shin, Kiseon Kim
2005 conf
ICN (1)
Seokjoo Shin, Seungjae Bahng, Insoo Koo, Kiseon Kim
2004 conf
HSNMC
Insoo Koo, Seokjoo Shin, Kiseon Kim
2004 conf
WWIC
Insoo Koo, Jens Zander, Kiseon Kim
2004 conf
PWC
Insoo Koo, Anders Furuskar, Jens Zander, Kiseon Kim
2004 J jnl
IEEE Commun. Lett.
Insoo Koo, Anders Furuskar, Jens Zander, Kiseon Kim
2004 conf
VTC Fall (2)
Hyunduk Kang, Seokjin Sung, Insoo Koo, Kiseon Kim
2004 C conf
LANMAN
Kanghee Kim, Insoo Koo, Seokjin Sung, Kiseon Kim
2003 J jnl
Int. J. Wirel. Inf. Networks
Insoo Koo, Aftab Ahmad, Kiseon Kim
2003 J jnl
IEEE Commun. Lett.
Insoo Koo, Jeongrok Yang, Aftab Ahmad, Kiseon Kim
2003 J jnl
Int. J. Wirel. Inf. Networks
Insoo Koo, Seungjae Bahng, Kiseon Kim
2003 J jnl
Comput. Commun.
Insoo Koo, Seungjae Bahng, Kiseon Kim
2002 J jnl
Int. J. Commun. Syst.
Insoo Koo, Jeongrok Yang, Aftab Ahmad, Kiseon Kim
2002 conf
MWCN
Insoo Koo, Kiseon Kim, Aftab Ahmad
2001 B conf
GLOBECOM
Insoo Koo, Seungjae Bahng, Kiseon Kim
2000 B conf
WCNC
Insoo Koo, Jeongrok Yang, Kiseon Kim
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