Karrar Hameed Abdulkareem

62 papers Journal 62
YearRankTypeTitle / Venue / Authors
2025 J jnl
IET Commun.
Ali Saeed Alfoudi, Mohammad R. Aziz, Zaid Abdi Alkareem Alyasseri, Ali Hakem Alsaeedi, Riyadh Rahef Nuiaa, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Mustafa Musa Jaber
2024 J jnl
CAAI Trans. Intell. Technol.
Nechirvan Asaad Zebari, Chira Nadheef Mohammed, Dilovan Asaad Zebari, Mazin Abed Mohammed, Diyar Qader Zeebaree, Haydar Abdulameer Marhoon, Karrar Hameed Abdulkareem, Seifedine Kadry, Wattana Viriyasitavat, Jan Nedoma, Radek Martinek
2024 J jnl
Eng. Appl. Artif. Intell.
Karrar Hameed Abdulkareem, Mohammed Ahmed Subhi, Mazin Abed Mohammed, Mayas Aljibawi, Jan Nedoma, Radek Martinek, Muhammet Deveci, Wen-Long Shang, Witold Pedrycz
2024 J jnl
Appl. Soft Comput.
Zainab Khalid Mohammed, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Dilovan Asaad Zebari, Abdullah Lakhan, Haydar Abdulameer Marhoon, Jan Nedoma, Radek Martinek
2024 J jnl
Knowl. Based Syst.
Abdullah Lakhan, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Muhammet Deveci, Haydar Abdulameer Marhoon, Jan Nedoma, Radek Martinek
2024 J jnl
Expert Syst. Appl.
Muhammad Arshad, Muhammad Haris Saeed, Atiqe Ur Rahman, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Jan Nedoma, Radek Martinek, Muhammet Deveci
2024 J jnl
Virtual Real.
V. Mani Bharathi, P. Manimegalai, S. Thomas George, D. Pamela, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Mustafa Musa Jaber, Robertas Damasevicius
2024 J jnl
IEEE Internet Things J.
Abdullah Lakhan, Mazin Abed Mohammed, Dilovan Asaad Zebari, Karrar Hameed Abdulkareem, Muhammet Deveci, Haydar Abdulameer Marhoon, Jan Nedoma, Radek Martinek
2024 J jnl
IEEE Syst. J.
Abdullah Lakhan, Mazin Abed Mohammed, Dilovan Asaad Zebari, Karrar Hameed Abdulkareem, Muhammet Deveci, Haydar Abdulameer Marhoon, Jan Nedoma, Radek Martinek
2024 J jnl
Comput. Biol. Medicine
Abdullah Lakhan, Hassen Hamouda, Karrar Hameed Abdulkareem, Saleh Alyahya, Mazin Abed Mohammed
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Mazin Abed Mohammed, Abdullah Lakhan, Karrar Hameed Abdulkareem, Nouf Abdullah Almujally, Bourair Bourair Sadiq Mohammed Taqi Al-Attar, Sajida Memon, Haydar Abdulameer Marhoon, Radek Martinek
2024 J jnl
Inf. Sci.
Abdullah Lakhan, Mazin Abed Mohammed, Mohd Khanapi Abd Ghani, Karrar Hameed Abdulkareem, Haydar Abdulameer Marhoon, Jan Nedoma, Radek Martinek, Muhammet Deveci
2024 J jnl
IEEE Trans. Consumer Electron.
Mazin Abed Mohammed, Abdullah Lakhan, Karrar Hameed Abdulkareem, Muhammet Deveci, Ashit Kumar Dutta, Sajida Memon, Haydar Abdulameer Marhoon, Radek Martinek
2024 J jnl
Comput. Electr. Eng.
Mohammed Nasser Al-Mhiqani, Tariq Alsboui, Taher Al-Shehari, Karrar Hameed Abdulkareem, Rabiah Ahmad, Mazin Abed Mohammed
2024 J jnl
Inf. Fusion
Abdullah Lakhan, Ahmed Noori Rashid, Mazin Abed Mohammed, Dilovan Asaad Zebari, Muhammet Deveci, Limin Wang, Karrar Hameed Abdulkareem, Jan Nedoma, Radek Martinek
2024 J jnl
Eng. Appl. Artif. Intell.
Mazin Abed Mohammed, Abdullah Lakhan, Dilovan Asaad Zebari, Mohd Khanapi Abd Ghani, Haydar Abdulameer Marhoon, Karrar Hameed Abdulkareem, Jan Nedoma, Radek Martinek
2023 J jnl
Comput. Biol. Medicine
Mazin Abed Mohammed, Abdullah Lakhan, Karrar Hameed Abdulkareem, Begoña García Zapirain
2023 J jnl
Phys. Commun.
Ammar Awad Mutlag, Mohd Khanapi Abd Ghani, Othman Mohd, Karrar Hameed Abdulkareem, Mazin Abed Mohammed, Meshal Alharbi, Zaid J. Al-Araji
2023 J jnl
PeerJ Comput. Sci.
Muhammad Arshad, Muhammad Saeed, Atiqe Ur Rahman, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Abed Saif Alghawli, Mohammed Abdulaziz Aide Al-qaness
2023 J jnl
Biomed. Signal Process. Control.
Atiqe Ur Rahman, Muhammad Haris Saeed, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Jan Nedoma, Radek Martinek
2023 J jnl
Comput. Biol. Medicine
Abdullah Lakhan, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Hassen Hamouda, Saleh Alyahya
2023 J jnl
Multim. Tools Appl.
Mazin Abed Mohammed, Mahmood Jamal Abdulhasan, Nallapaneni Manoj Kumar, Karrar Hameed Abdulkareem, Salama A. Mostafa, Mashael S. Maashi, Layth Salman Khalid, Hayder Saadoon Abdulaali, Shauhrat S. Chopra
2023 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Abdullah Lakhan, Mazin Abed Mohammed, Dheyaa Ahmed Ibrahim, Karrar Hameed Abdulkareem
2023 J jnl
Internet Things
Mazin Abed Mohammed, Abdullah Lakhan, Karrar Hameed Abdulkareem, Dilovan Asaad Zebari, Jan Nedoma, Radek Martinek, Seifedine Kadry, Begonya Garcia-Zapirain
2023 J jnl
Appl. Soft Comput.
Atiqe Ur Rahman, Muhammad Haris Saeed, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Jan Nedoma, Radek Martinek
2023 J jnl
Internet Things
Mazin Abed Mohammed, Abdullah Lakhan, Karrar Hameed Abdulkareem, Dilovan Asaad Zebari, Jan Nedoma, Radek Martinek, Seifedine Nimer Kadry, Begonya Garcia-Zapirain
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Abdullah Lakhan, Mazin Abed Mohammed, Dheyaa Ahmed Ibrahim, Seifedine Nimer Kadry, Karrar Hameed Abdulkareem
2023 J jnl
Neural Comput. Appl.
Zaid Abdi Alkareem Alyasseri, Ahamad Tajudin Khader, Mohammed Azmi Al-Betar, Xin-She Yang, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Seifedine Kadry, Imran Razzak
2023 J jnl
IEEE J. Biomed. Health Informatics
Abdullah Lakhan, Mazin Abed Mohammed, Ahmed Noori Rashid, Seifedine Nimer Kadry, Karrar Hameed Abdulkareem, Jan Nedoma, Radek Martinek, Imran Razzak
2023 J jnl
Internet Things
Abdullah Lakhan, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Mohd Khanapi Abd Ghani, Haydar Abdulameer Marhoon, Jan Nedoma, Radek Martinek, Begonya Garcia-Zapirain
2023 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Abdullah Lakhan, Ali Azawii Abdul Lateef, Mohd Khanapi Abd Ghani, Karrar Hameed Abdulkareem, Mazin Abed Mohammed, Jan Nedoma, Radek Martinek, Begoña García Zapirain
2022 J jnl
Comput. Electr. Eng.
Mohammed Nasser Al-Mhiqani, Rabiah Ahmad, Zaheera Zainal Abidin, Karrar Hameed Abdulkareem, Mazin Abed Mohammed, Deepak Gupta, K. Shankar
2022 J jnl
Int. J. Interact. Multim. Artif. Intell.
Zainab Hussein Arif, Moamin A. Mahmoud, Karrar Hameed Abdulkareem, Seifedine Kadry, Mazin Abed Mohammed, Mohammed Nasser Al-Mhiqani, Alaa S. Al-Waisy, Jan Nedoma
2022 J jnl
IET Image Process.
Zainab Hussein Arif, Moamin A. Mahmoud, Karrar Hameed Abdulkareem, Mazin Abed Mohammed, Mohammed Nasser Al-Mhiqani, Ammar Awad Mutlag, Robertas Damasevicius
2022 J jnl
Int. J. Web Grid Serv.
Abdullah Lakhan, Mazin Abed Mohammed, Ahmed Noori Rashid, Seifedine Kadry, Karrar Hameed Abdulkareem
2022 J jnl
Sensors
Abdullah Lakhan, Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Mustafa Musa Jaber, Jan Nedoma, Radek Martinek, Petr Zmij
2022 J jnl
Int. J. Inf. Technol. Decis. Mak.
R. T. Mohammed, A. A. Zaidan, R. Yaakob, Nurfadhlina Mohd Sharef, R. H. Abdullah, B. B. Zaidan, Osamah Shihab Albahri, Karrar Hameed Abdulkareem
2022 J jnl
Sensors
Zaid Abdi Alkareem Alyasseri, Osama Ahmad Alomari, João P. Papa, Mohammed Azmi Al-Betar, Karrar Hameed Abdulkareem, Mazin Abed Mohammed, Seifedine Kadry, Orawit Thinnukool, Pattaraporn Khuwuthyakorn
2022 J jnl
Comput. Intell. Neurosci.
Zaid Abdi Alkareem Alyasseri, Osama Ahmad Alomari, Mohammed Azmi Al-Betar, Mohammed A. Awadallah, Karrar Hameed Abdulkareem, Mazin Abed Mohammed, Seifedine Kadry, V. Rajinikanth, Seungmin Rho
2022 J jnl
Autom. Softw. Eng.
Abdullah Lakhan, Mazin Abed Mohammed, Omar Ibrahim Obaid, Chinmay Chakraborty, Karrar Hameed Abdulkareem, Seifedine Kadry
2022 J jnl
Microprocess. Microsystems
Maryam Kamal, Shahzad Amin, Faria Ferooz, Mazhar Javed Awan, Mazin Abed Mohammed, Omar N. Al-Boeridi, Karrar Hameed Abdulkareem
2022 J jnl
Expert Syst. J. Knowl. Eng.
Zaid Abdi Alkareem Alyasseri, Mohammed Azmi Al-Betar, Iyad Abu Doush, Mohammed A. Awadallah, Ammar Kamal Abasi, Sharif Naser Makhadmeh, Osama Ahmad Alomari, Karrar Hameed Abdulkareem, Afzan Adam, Robertas Damasevicius, Mazin Abed Mohammed, Raed Abu Zitar
2022 J jnl
ACM Trans. Sens. Networks
Mohamed Elhoseny, Abdullah Lakhan, Ahmed Noori Rashid, Mazin Abed Mohammed, Karrar Hameed Abdulkareem
2021 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Mazin Abed Mohammed, Mohamed Elhoseny, Karrar Hameed Abdulkareem, Salama A. Mostafa, Mashael S. Maashi
2021 J jnl
Neural Comput. Appl.
Karrar Hameed Abdulkareem, Nureize Arbaiy, A. A. Zaidan, B. B. Zaidan, Osamah Shihab Albahri, M. A. Alsalem, Mahmood Maher Salih
2021 J jnl
Sensors
Sheeba Lal, Saeed Ur Rehman, Jamal Hussain Shah, Talha Meraj, Hafiz Tayyab Rauf, Robertas Damasevicius, Mazin Abed Mohammed, Karrar Hameed Abdulkareem
2021 J jnl
Comput. Biol. Medicine
Noor Kamal Al-Qazzaz, Zaid Abdi Alkareem Alyasseri, Karrar Hameed Abdulkareem, Nabeel Salih Ali, Mohammed Nasser Al-Mhiqani, Christoph Guger
2021 J jnl
PeerJ Comput. Sci.
Abdullah Lakhan, Mazin Abed Mohammed, Seifedine Nimer Kadry, Karrar Hameed Abdulkareem, Fahad Taha AL-Dhief, Ching-Hsien Hsu
2021 J jnl
Microprocess. Microsystems
Amit Kumer Podder, Abdullah Al Bukhari, Sayemul Islam, Sujon Mia, Mazin Abed Mohammed, Nallapaneni Manoj Kumar, Korhan Cengiz, Karrar Hameed Abdulkareem
2021 J jnl
Neural Comput. Appl.
Qurat-Ul-Ain Mastoi, Muhammad Suleman Memon, Abdullah Lakhan, Mazin Abed Mohammed, Mumtaz Qabulio, Fadi Al-Turjman, Karrar Hameed Abdulkareem
2021 J jnl
Int. J. Interact. Multim. Artif. Intell.
Karrar Hameed Abdulkareem, Nureize Arbaiy, Zainab Hussein Arif, Mohammed Nasser Al-Mhiqani, Mazin Abed Mohammed, Seifedine Kadry, Zaid Abdi Alkareem Alyasseri
2021 J jnl
Sensors
Ammar Awad Mutlag, Mohd Khanapi Abd Ghani, Mazin Abed Mohammed, Abdullah Lakhan, Othman Mohd, Karrar Hameed Abdulkareem, Begonya Garcia-Zapirain
2021 J jnl
IEEE Internet Things J.
Karrar Hameed Abdulkareem, Mazin Abed Mohammed, Ahmad Salim, Muhammad Arif, Oana Geman, Deepak Gupta, Ashish Khanna
2021 J jnl
Sensors
Abdullah Lakhan, Mazin Abed Mohammed, Ahmed Noori Rashid, Seifedine Nimer Kadry, Thammarat Panityakul, Karrar Hameed Abdulkareem, Orawit Thinnukool
2020 J jnl
Int. J. Inf. Technol. Decis. Mak.
Karrar Hameed Abdulkareem, Nureize Arbaiy, A. A. Zaidan, B. B. Zaidan, Osamah Shihab Albahri, M. A. Alsalem, Mahmood Maher Salih
2020 J jnl
IEEE Access
K. I. Mohammed, Jafreezal Jaafar, A. A. Zaidan, Osamah Shihab Albahri, B. B. Zaidan, Karrar Hameed Abdulkareem, Ali Najm Jasim, Ali H. Shareef, M. J. Baqer, Ahmed Shihab Albahri, M. A. Alsalem, Abdullah Hussein Alamoodi
2020 J jnl
IEEE Access
Mazin Abed Mohammed, Karrar Hameed Abdulkareem, Alaa S. Al-Waisy, Salama A. Mostafa, Shumoos Al-Fahdawi, Ahmed Musa Dinar, Wajdi Alhakami, Abdullah Baz, Mohammed Nasser Al-Mhiqani, Hosam Alhakami, Nureize Arbaiy, Mashael S. Maashi, Ammar Awad Mutlag, Begoña García Zapirain, Isabel de la Torre Díez
2020 J jnl
Comput. Methods Programs Biomed.
Osamah Shihab Albahri, Jameel R. Al-Obaidi, A. A. Zaidan, Ahmed Shihab Albahri, B. B. Zaidan, Mahmood Maher Salih, Abdulhadi Qays, Kareem Abbas Dawood, R. T. Mohammed, Karrar Hameed Abdulkareem, A. M. Aleesa, Abdullah Hussein Alamoodi, Mohammed A. Chyad, Che Zalina Zulkifli
2020 J jnl
Sensors
Ammar Awad Mutlag, Mohd Khanapi Abd Ghani, Mazin Abed Mohammed, Mashael S. Maashi, Othman Mohd, Salama A. Mostafa, Karrar Hameed Abdulkareem, Gonçalo Marques, Isabel de la Torre Díez
2019 J jnl
IEEE Access
Karrar Hameed Abdulkareem, Mazin Abed Mohammed, Saraswathy Shamini Gunasekaran, Mohammed Nasser Al-Mhiqani, Ammar Awad Mutlag, Salama A. Mostafa, Nabeel Salih Ali, Dheyaa Ahmed Ibrahim
2019 J jnl
IEEE Access
Ahmed Shihab Albahri, Osamah Shihab Albahri, A. A. Zaidan, B. B. Zaidan, M. Hashim, M. A. Alsalem, Ali H. Mohsin, K. I. Mohammed, Abdullah Hussein Alamoodi, Odai Enaizan, Shahad Nidhal, Omar Zughoul, Fayiz Momani, Mohammed A. Chyad, Karrar Hameed Abdulkareem, Kareem Abbas Dawood, E. M. Almahdi, Ghailan A. Al Shafeey, M. J. Baqer
2019 J jnl
IEEE Access
Osamah Shihab Albahri, Ahmed Shihab Albahri, A. A. Zaidan, B. B. Zaidan, M. A. Alsalem, Ali H. Mohsin, K. I. Mohammed, Abdullah Hussein Alamoodi, Shahad Nidhal, Odai Enaizan, Mohammed A. Chyad, Karrar Hameed Abdulkareem, E. M. Almahdi, Ghailan A. Al Shafeey, M. J. Baqer, Ali Najm Jasim, Nawar S. Jalood, Ali H. Shareef
tests/unit/test_apk_dataclasses.py
← Index tests/unit/test_apk_dataclasses.py python
"""
Unit tests for APK dataclasses in redb/models/dataclasses.py.
"""
import pytest
from dataclasses import asdict, fields

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


# ============================================================================
# APKFeatures
# ============================================================================

class TestAPKFeaturesDataclass:
    """Tests for APKFeatures dataclass."""

    def test_named_fields(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.example.app",
            app_name="Example App",
            version_code=1,
            version_name="1.0.0",
        )
        assert f.package_name == "com.example.app"
        assert f.app_name == "Example App"
        assert f.version_code == 1
        assert f.version_name == "1.0.0"

    def test_all_fields_default_none_or_safe(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures()
        # Nullable fields default to None
        assert f.package_name is None
        assert f.app_name is None
        assert f.version_code is None
        assert f.version_name is None
        assert f.min_sdk_version is None
        assert f.target_sdk_version is None
        assert f.compile_sdk_version is None
        assert f.main_activity is None
        # Non-nullable fields have safe defaults
        assert f.is_debuggable is False
        assert f.allow_backup is True
        assert f.uses_cleartext_traffic is False
        assert f.supported_abis == []
        assert f.dex_count == 0
        assert f.total_dex_size == 0
        assert f.total_file_count == 0
        assert f.has_native_code is False
        assert f.has_assets is False
        assert f.uses_libraries == []
        assert f.earliest_content_modification is None
        assert f.latest_content_modification is None
        assert f.contains_embedded_apk is False

    def test_all_fields_populated(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.malware.test",
            app_name="Malware",
            version_code=42,
            version_name="6.6.6",
            min_sdk_version=21,
            target_sdk_version=33,
            compile_sdk_version=33,
            main_activity="com.malware.test.MainActivity",
            is_debuggable=True,
            allow_backup=False,
            uses_cleartext_traffic=True,
            supported_abis=["armeabi-v7a", "arm64-v8a", "x86"],
            dex_count=3,
            total_dex_size=5000000,
            total_file_count=200,
            has_native_code=True,
            has_assets=True,
            uses_libraries=["com.google.android.maps"],
            earliest_content_modification="2024-01-01T00:00:00Z",
            latest_content_modification="2024-06-15T12:00:00Z",
            contains_embedded_apk=True,
        )
        assert f.is_debuggable is True
        assert f.dex_count == 3
        assert len(f.supported_abis) == 3
        assert f.contains_embedded_apk is True

    def test_asdict_roundtrip(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.test",
            app_name="Test",
            version_code=1,
            version_name="1.0",
        )
        d = asdict(f)
        assert d["package_name"] == "com.test"
        assert d["is_debuggable"] is False
        assert d["supported_abis"] == []

    def test_partial_extraction(self):
        """Verify that APKFeatures can be created with only some fields populated,
        simulating a partial extraction where some fields failed."""
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.example.app",
            # app_name failed to extract — left as None
            version_code=10,
            # version_name failed to extract — left as None
            is_debuggable=True,
            dex_count=2,
        )
        assert f.package_name == "com.example.app"
        assert f.app_name is None
        assert f.version_code == 10
        assert f.version_name is None
        assert f.is_debuggable is True
        assert f.dex_count == 2


# ============================================================================
# APKManifestComponent
# ============================================================================

class TestAPKManifestComponentDataclass:

    def test_creation(self):
        from redb.models.dataclasses import APKManifestComponent

        c = APKManifestComponent(
            component_type="activity",
            class_name="com.example.MainActivity",
            is_exported=True,
            intent_actions=["android.intent.action.MAIN"],
            intent_categories=["android.intent.category.LAUNCHER"],
        )
        assert c.component_type == "activity"
        assert c.class_name == "com.example.MainActivity"
        assert c.is_exported is True
        assert len(c.intent_actions) == 1
        assert len(c.intent_categories) == 1

    def test_defaults(self):
        from redb.models.dataclasses import APKManifestComponent

        c = APKManifestComponent(
            component_type="service",
            class_name="com.example.MyService",
            is_exported=False,
        )
        assert c.intent_actions == []
        assert c.intent_categories == []


# ============================================================================
# APKManifest
# ============================================================================

class TestAPKManifestDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKManifest

        m = APKManifest(
            activity_count=5,
            service_count=2,
            receiver_count=3,
            provider_count=1,
        )
        assert m.activity_count == 5
        assert m.service_count == 2
        assert m.receiver_count == 3
        assert m.provider_count == 1

    def test_optional_list_defaults(self):
        from redb.models.dataclasses import APKManifest

        m = APKManifest(
            activity_count=0,
            service_count=0,
            receiver_count=0,
            provider_count=0,
        )
        assert m.activities == []
        assert m.services == []
        assert m.receivers == []
        assert m.providers == []
        assert m.exported_components == []
        assert m.intent_filters_by_action == []
        assert m.intent_filters_by_category == []
        assert m.uses_features == []
        assert m.meta_data is None
        assert m.manifest_xml is None

    def test_fully_populated(self):
        from redb.models.dataclasses import APKManifest

        m = APKManifest(
            activity_count=2,
            service_count=1,
            receiver_count=1,
            provider_count=0,
            activities=["MainActivity", "SettingsActivity"],
            services=["SyncService"],
            receivers=["BootReceiver"],
            providers=[],
            exported_components=["MainActivity", "BootReceiver"],
            intent_filters_by_action=["android.intent.action.MAIN"],
            uses_features=["android.hardware.camera"],
            manifest_xml="<manifest>...</manifest>",
        )
        assert len(m.activities) == 2
        assert len(m.exported_components) == 2
        assert m.manifest_xml is not None


# ============================================================================
# APKPermission / APKPermissions
# ============================================================================

class TestAPKPermissionDataclass:

    def test_creation(self):
        from redb.models.dataclasses import APKPermission

        p = APKPermission(
            permission_name="android.permission.CAMERA",
            protection_level="dangerous",
        )
        assert p.permission_name == "android.permission.CAMERA"
        assert p.protection_level == "dangerous"
        assert p.is_custom is False

    def test_custom_permission(self):
        from redb.models.dataclasses import APKPermission

        p = APKPermission(
            permission_name="com.example.CUSTOM_PERM",
            protection_level="signature",
            is_custom=True,
        )
        assert p.is_custom is True


class TestAPKPermissionsDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKPermissions

        p = APKPermissions(
            total_permission_count=10,
            dangerous_permission_count=3,
        )
        assert p.total_permission_count == 10
        assert p.dangerous_permission_count == 3

    def test_defaults(self):
        from redb.models.dataclasses import APKPermissions

        p = APKPermissions(
            total_permission_count=0,
            dangerous_permission_count=0,
        )
        assert p.permissions == []
        assert p.dangerous_permissions == []
        assert p.custom_permissions == []
        assert p.permission_details == []
        assert p.permhash is None

    def test_with_permission_details(self):
        from redb.models.dataclasses import APKPermission, APKPermissions

        details = [
            APKPermission("android.permission.INTERNET", "normal"),
            APKPermission("android.permission.CAMERA", "dangerous"),
        ]
        p = APKPermissions(
            total_permission_count=2,
            dangerous_permission_count=1,
            permissions=["android.permission.INTERNET", "android.permission.CAMERA"],
            dangerous_permissions=["android.permission.CAMERA"],
            permission_details=details,
            permhash="abc123def456",
        )
        assert len(p.permission_details) == 2
        assert p.permhash == "abc123def456"


# ============================================================================
# APKCertificate / APKCodeSigningInfo
# ============================================================================

class TestAPKCertificateDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKCertificate

        c = APKCertificate(
            subject="CN=Android Debug",
            issuer="CN=Android Debug",
            serial_number="1234567890",
            valid_from="2024-01-01",
            valid_to="2054-01-01",
            thumbprint_sha1="aabbccdd" * 5,
            thumbprint_sha256="aabbccdd" * 8,
        )
        assert c.subject == "CN=Android Debug"
        assert c.issuer == "CN=Android Debug"
        assert c.is_self_signed is False

    def test_optional_fields(self):
        from redb.models.dataclasses import APKCertificate

        c = APKCertificate(
            subject="CN=Test",
            issuer="CN=CA",
            serial_number="1",
            valid_from="2024-01-01",
            valid_to="2025-01-01",
            thumbprint_sha1="aa" * 20,
            thumbprint_sha256="bb" * 32,
            algorithm="SHA256withRSA",
            key_size=2048,
            is_self_signed=True,
        )
        assert c.algorithm == "SHA256withRSA"
        assert c.key_size == 2048
        assert c.is_self_signed is True


class TestAPKCodeSigningInfoDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKCodeSigningInfo

        info = APKCodeSigningInfo(
            _id="abcdef1234567890" * 4,
            is_signed=True,
        )
        assert info.is_signed is True
        assert info.signature_scheme_versions == []
        assert info.number_of_certificates == 0
        assert info.x509_certificates is None
        assert info.apk_signer_subject is None
        assert info.apk_signer_issuer is None

    def test_fully_populated(self):
        from redb.models.dataclasses import APKCertificate, APKCodeSigningInfo

        cert = APKCertificate(
            subject="CN=Test",
            issuer="CN=Test",
            serial_number="1",
            valid_from="2024-01-01",
            valid_to="2025-01-01",
            thumbprint_sha1="aa" * 20,
            thumbprint_sha256="bb" * 32,
        )
        info = APKCodeSigningInfo(
            _id="cc" * 32,
            is_signed=True,
            signature_scheme_versions=[1, 2, 3],
            number_of_certificates=1,
            x509_certificates=[cert],
            apk_signer_subject="CN=Test",
            apk_signer_issuer="CN=Test",
        )
        assert len(info.signature_scheme_versions) == 3
        assert info.number_of_certificates == 1
        assert len(info.x509_certificates) == 1


# ============================================================================
# APKDexFile
# ============================================================================

class TestAPKDexFileDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKDexFile

        d = APKDexFile(
            filename="classes.dex",
            sha256="aa" * 32,
            class_count=100,
            method_count=500,
            string_count=1000,
        )
        assert d.filename == "classes.dex"
        assert d.class_count == 100
        assert d.method_count == 500
        assert d.string_count == 1000

    def test_optional_fields_defaults(self):
        from redb.models.dataclasses import APKDexFile

        d = APKDexFile(
            filename="classes2.dex",
            sha256="bb" * 32,
            class_count=0,
            method_count=0,
            string_count=0,
        )
        assert d.tlsh is None
        assert d.top_packages is None
        assert d.api_usage is None
        assert d.obfuscation_indicators is None

    def test_tlsh_populated(self):
        from redb.models.dataclasses import APKDexFile

        tlsh_value = "T1" + "A" * 68
        d = APKDexFile(
            filename="classes.dex",
            sha256="aa" * 32,
            class_count=100,
            method_count=500,
            string_count=1000,
            tlsh=tlsh_value,
        )
        assert d.tlsh == tlsh_value

    def test_with_api_usage(self):
        from redb.models.dataclasses import APKDexFile

        d = APKDexFile(
            filename="classes.dex",
            sha256="cc" * 32,
            class_count=50,
            method_count=200,
            string_count=300,
            top_packages=[{"name": "com.example", "class_count": 30}],
            api_usage={
                "crypto": ["Ljavax/crypto/Cipher;->getInstance"],
                "reflection": ["Ljava/lang/Class;->forName"],
            },
            obfuscation_indicators={"short_class_names_ratio": 0.8, "single_char_methods_ratio": 0.5},
        )
        assert len(d.api_usage) == 2
        assert d.obfuscation_indicators["short_class_names_ratio"] == 0.8


# ============================================================================
# APKResource
# ============================================================================

class TestAPKResourceDataclass:

    def test_creation(self):
        from redb.models.dataclasses import APKResource

        r = APKResource(
            path="res/drawable/icon.png",
            size=1024,
            sha256="dd" * 32,
            filetype_magika="png",
        )
        assert r.path == "res/drawable/icon.png"
        assert r.size == 1024
        assert r.is_suspicious is False

    def test_suspicious_resource(self):
        from redb.models.dataclasses import APKResource

        r = APKResource(
            path="assets/payload.dex",
            size=50000,
            sha256="ee" * 32,
            filetype_magika="dex",
            is_suspicious=True,
        )
        assert r.is_suspicious is True


# ============================================================================
# APKNativeLib
# ============================================================================

class TestAPKNativeLibDataclass:

    def test_creation(self):
        from redb.models.dataclasses import APKNativeLib

        lib = APKNativeLib(
            abi="arm64-v8a",
            filename="libnative.so",
            size=200000,
            sha256="ff" * 32,
        )
        assert lib.abi == "arm64-v8a"
        assert lib.filename == "libnative.so"
        assert lib.is_known_packer is False

    def test_known_packer(self):
        from redb.models.dataclasses import APKNativeLib

        lib = APKNativeLib(
            abi="armeabi-v7a",
            filename="libjiagu.so",
            size=100000,
            sha256="aa" * 32,
            is_known_packer=True,
        )
        assert lib.is_known_packer is True


# ============================================================================
# APKInconsistencyTests
# ============================================================================

class TestAPKInconsistencyTestsDataclass:

    def test_all_defaults_none(self):
        from redb.models.dataclasses import APKInconsistencyTests

        t = APKInconsistencyTests()
        assert t.test_zip_bomb is None
        assert t.test_zip_duplicate_entries is None
        assert t.test_zip_path_traversal is None
        assert t.test_zip_suspicious_timestamps is None
        assert t.test_hidden_dex_files is None
        assert t.test_manifest_component_mismatch is None
        assert t.test_debuggable_release is None
        assert t.test_emulator_detection_strings is None
        assert t.test_debugger_detection is None
        assert t.test_root_detection is None

    def test_all_fields_populated(self):
        from redb.models.dataclasses import APKInconsistencyTests

        t = APKInconsistencyTests(
            test_zip_bomb=True,
            test_zip_duplicate_entries=False,
            test_zip_path_traversal=True,
            test_zip_suspicious_timestamps=False,
            test_hidden_dex_files=True,
            test_manifest_component_mismatch=False,
            test_debuggable_release=True,
            test_emulator_detection_strings=True,
            test_debugger_detection=False,
            test_root_detection=True,
        )
        assert t.test_zip_bomb is True
        assert t.test_debuggable_release is True
        # Count true values
        d = asdict(t)
        true_count = sum(1 for v in d.values() if v is True)
        assert true_count == 6

    def test_field_count(self):
        from redb.models.dataclasses import APKInconsistencyTests

        # Exactly 10 inconsistency tests per PDD specification
        assert len(fields(APKInconsistencyTests)) == 10


# ============================================================================
# Hashes dataclass — APK permhash field
# ============================================================================

class TestHashesAPKField:

    def test_permhash_default_none(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e")
        assert h.permhash is None

    def test_permhash_populated(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(
            md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e",
            permhash="abc123" * 10 + "abcd",
        )
        assert h.permhash is not None
        assert len(h.permhash) == 64


# ============================================================================
# Tag enum — APK entries
# ============================================================================

class TestAPKTagEnum:

    def test_all_apk_tags_exist(self):
        from redb.extractors.enum import Tag

        expected_tags = [
            "APK_FEATURES", "APK_MANIFEST", "APK_PERMISSIONS", "APK_SIGNATURE",
            "APK_DEX", "APK_RESOURCES", "APK_NATIVE_LIBS", "APK_INCONSISTENCY_TESTS",
        ]
        for name in expected_tags:
            assert hasattr(Tag, name), f"Tag.{name} missing"

    def test_apk_tag_values(self):
        from redb.extractors.enum import Tag

        assert Tag.APK_FEATURES.value == "apk_features"
        assert Tag.APK_MANIFEST.value == "apk_manifest"
        assert Tag.APK_PERMISSIONS.value == "apk_permissions"
        assert Tag.APK_SIGNATURE.value == "apk_signature"
        assert Tag.APK_DEX.value == "apk_dex"
        assert Tag.APK_RESOURCES.value == "apk_resources"
        assert Tag.APK_NATIVE_LIBS.value == "apk_native_libs"
        assert Tag.APK_INCONSISTENCY_TESTS.value == "apk_inconsistency_tests"