Ikram Ud Din

116 papers Journal 113Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Consumer Electron.
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Ayman Altameem, Joel J. P. C. Rodrigues
2026 J jnl
IEEE Internet Things J.
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Muhammad Adnan, Ayman Altameem, Ikram Syed, Shabir Ahmad
2025 J jnl
IEEE Trans. Consumer Electron.
Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues, Ayman Altameem
2025 J jnl
IEEE Trans. Consumer Electron.
Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2025 J jnl
IEEE Internet Things J.
Ikram Ud Din, Ahmad Almogren, Zhu Han, Mohsen Guizani
2025 J jnl
IEEE Commun. Surv. Tutorials
Muhammad Ali Naeem, Ikram Ud Din, Yahui Meng, Ahmad Almogren, Joel J. P. C. Rodrigues
2025 J jnl
IEEE Trans. Consumer Electron.
Misba Sikandar, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2025 J jnl
IEEE Access
Hamid Asmat, Ikram Ud Din, Ahmad Almogren, Muhammad Yasar Khan
2025 J jnl
IEEE Internet Things J.
Ikram Ud Din, Ahmad Almogren, Zhu Han, Mohsen Guizani
2025 J jnl
IEEE Internet Things J.
Ikram Ud Din, Muhammad Imran Taj, Ahmad Almogren, Mohsen Guizani
2025 J jnl
IEEE Trans. Veh. Technol.
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2025 J jnl
IEEE Internet Things J.
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2025 J jnl
IEEE Trans. Consumer Electron.
Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2025 J jnl
IEEE Internet Things J.
Ikram Ud Din, Kamran Habib Khan, Ahmad Almogren, Mohsen Guizani
2025 J jnl
IEEE Internet Things J.
Zabeehullah, Fahim Arif, Qazi Mazhar ul Haq, Nauman Ali Khan, Ikram Ud Din, Ahmad Almogren, Mudassar Ali Khan, Omar Alsaleh, Mohsen Guizani
2025 J jnl
IEEE Internet Things J.
Ikram Ud Din, Kamran Habib Khan, Ahmad Almogren, Mohsen Guizani
2025 J jnl
IEEE Trans. Consumer Electron.
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Ayman Altameem, Joel J. P. C. Rodrigues
2025 J jnl
ACM Trans. Auton. Adapt. Syst.
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2025 J jnl
IEEE Internet Things J.
Ikram Ud Din, Imran Taj, Kamran Ahmad Awan, Ahmad Almogren, Ayman Altameem
2025 J jnl
IEEE Trans. Consumer Electron.
Zabeehullah, Nauman Ali Khan, Ikram Ud Din, Ahmad Almogren, Ayman Altameem, Mohsen Guizani
2025 J jnl
IEEE Trans. Consumer Electron.
Abid Ur Rehman, Ikram Ud Din, Kamran Ahmad Awan, Mudassar Ali Khan, Toqeer Ali Syed, Ahmad Almogren, Joel J. P. C. Rodrigues
2025 J jnl
IEEE Internet Things J.
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Zhu Han, Mohsen Guizani
2025 J jnl
IEEE Trans. Consumer Electron.
Kamran Ahmad Awan, Ikram Ud Din, Toqeer Ali Syed, Korhan Cengiz, Ahmad Almogren
2024 J jnl
IEEE Trans. Consumer Electron.
Muhammad Shoaib Khan, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2024 J jnl
IEEE Internet Things J.
Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2024 J jnl
IEEE Trans. Consumer Electron.
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2024 J jnl
IEEE Access
Ikram Ud Din, Ahmad Almogren, Byung-Seo Kim
2024 J jnl
IEEE Access
Tabinda Salam, Waheed Ur Rehman, Ikram Ud Din, Ahmad Almogren, Mubarak Mohammed Al-Ezzi Sufyan, Kainat, Muhammad Yasar Khan, Ayman Altameem
2024 J jnl
IEEE Access
Gullelala Jadoon, Adeel Ahmed, Ikram Ud Din, Ahmad Almogren, Mahdi Zareei, Rajesh Roshan Biswal, Ayman Altameem
2024 J jnl
IEEE Access
Hamid Asmat, Ikram Ud Din, Ahmad Almogren, Ayman Altameem, Muhammad Yasar Khan
2024 J jnl
IEEE Access
Zeenat Zulfiqar, Zubair Zulfiqar, Nauman Ali Khan, Mudassar Ali Khan, Ikram Ud Din, Ahmad Almogren, Mahdi Zareei, Moisés García Martínez
2024 J jnl
IEEE Access
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Byung-Seo Kim, Mohsen Guizani
2024 J jnl
IEEE Trans. Consumer Electron.
Misba Sikandar, Ikram Ud Din, Ahmad Almogren
2024 J jnl
IEEE Trans. Consumer Electron.
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2024 J jnl
IEEE Access
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Mahdi Zareei, Rajesh Roshan Biswal
2024 J jnl
IEEE Trans. Consumer Electron.
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2024 J jnl
IEEE Access
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Muhammad Yasar Khan, Ayman Altameem
2024 J jnl
IEEE Trans. Consumer Electron.
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2024 J jnl
IEEE Trans. Consumer Electron.
Ikram Ud Din, Kamran Ahmad Awan, Ahmad Almogren, Joel J. P. C. Rodrigues
2024 J jnl
IEEE Access
Ikram Ud Din, Kamran Habib Khan, Ahmad Almogren, Mahdi Zareei, Jesús Arturo Pérez Díaz
2024 J jnl
Secur. Priv.
Ikram Ud Din, Wajahat Ali, Ahmad Almogren, Iehab Al Rassan, Sherali Zeadally
2023 J jnl
IEEE Access
Sonia Khan, Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Byung-Seo Kim
2023 conf
IIT
Hassan Nawaz, Ikram Ud Din, Ahmad Almogren, Abdul Mohiz Malik, Ali Nawaz
2023 J jnl
IEEE Access
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Byung-Seo Kim
2023 J jnl
J. Inf. Technol. Tour.
Ikram Ud Din, Ahmad Almogren
2023 J jnl
Int. J. Commun. Syst.
Ikram Ud Din, Kamran Ahmad Awan, Ahmad Almogren, Joel J. P. C. Rodrigues
2023 J jnl
IEEE Internet Things J.
Ikram Ud Din, Aniqa Bano, Kamran Ahmad Awan, Ahmad Almogren, Ayman Altameem, Mohsen Guizani
2023 J jnl
IEEE Access
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2023 J jnl
IEEE Access
Ikram Ud Din, Kamran Ahmad Awan, Ahmad Almogren
2023 J jnl
IEEE Access
Kamran Ahmad Awan, Ikram Ud Din, Mahdi Zareei, Ahmad Almogren, Byung-Seo Kim, Jesús Arturo Pérez Díaz
2023 J jnl
Phys. Commun.
Ikram Ud Din, Kamran Ahmad Awan, Ahmad Almogren, Joel J. P. C. Rodrigues
2022 J jnl
Sensors
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Byung-Seo Kim
2022 J jnl
Sensors
Mudassar Ali Khan, Ikram Ud Din, Tha'er Majali, Byung-Seo Kim
2022 J jnl
ACM Trans. Internet Techn.
Kamran Ahmad Awan, Ikram Ud Din, Abeer S. Almogren, Neeraj Kumar, Ahmad Almogren
2022 J jnl
Future Gener. Comput. Syst.
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2022 J jnl
Sensors
Nabeela Kausar, Ikram Ud Din, Mudassar Ali Khan, Ahmad Almogren, Byung-Seo Kim
2022 J jnl
Int. J. Commun. Syst.
Awais Manzoor, Munam Ali Shah, Hasan Ali Khattak, Ikram Ud Din, Muhammad Khurram Khan
2021 J jnl
IEEE Trans. Ind. Informatics
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Mohsen Guizani, Mansour Zuair
2021 J jnl
IEEE Trans. Ind. Informatics
Wajahat Ali, Ikram Ud Din, Ahmad Almogren, Neeraj Kumar
2021 J jnl
Sci. Program.
Nauman Ali Khan, Wuyang Zhou, Mudassar Ali Khan, Ahmad Almogren, Ikram Ud Din
2021 J jnl
IEEE Internet Things J.
Ahmad Almogren, Irfan Mohiuddin, Ikram Ud Din, Hisham N. Almajed, Nadra Guizani
2021 J jnl
IEEE Access
Ikram Ud Din, Bilal Ahmad, Ahmad Almogren, Hisham N. Almajed, Irfan Mohiuddin, Joel J. P. C. Rodrigues
2021 J jnl
Sci. Program.
Zeeshan Bin Siddique, Mudassar Ali Khan, Ikram Ud Din, Ahmad Almogren, Irfan Mohiuddin, Shah Nazir
2021 J jnl
ACM Trans. Internet Techn.
Huniya Shahid, Munam Ali Shah, Ahmad Almogren, Hasan Ali Khattak, Ikram Ud Din, Neeraj Kumar, Carsten Maple
2021 J jnl
IEEE Internet Things J.
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Hisham N. Almajed, Irfan Mohiuddin, Mohsen Guizani
2021 J jnl
Comput. Stand. Interfaces
Malik Ali Judge, Awais Manzoor, Hasan Ali Khattak, Ikram Ud Din, Ahmad Almogren, Muhammad Adnan
2021 J jnl
J. Real Time Image Process.
Mudassar Ali Khan, Sabahat Israr, Abeer S. Almogren, Ikram Ud Din, Ahmad Almogren, Joel J. P. C. Rodrigues
2021 J jnl
Sensors
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Byung-Seo Kim, Ayman Altameem
2020 J jnl
IEEE Access
Sahrish Khan Tayyaba, Hasan Ali Khattak, Ahmad Almogren, Munam Ali Shah, Ikram Ud Din, Ibrahim Alkhalifa, Mohsen Guizani
2020 J jnl
Future Gener. Comput. Syst.
Naveed Islam, Khalid Haseeb, Ahmad Almogren, Ikram Ud Din, Mohsen Guizani, Ayman Altameem
2020 J jnl
Sci. Program.
Aniqa Bano, Ikram Ud Din, Asma A. Al-Huqail
2020 J jnl
Sensors
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Hisham N. Almajed
2020 J jnl
Sensors
Khalid Haseeb, Ikram Ud Din, Ahmad Almogren, Naveed Islam
2020 J jnl
IEEE Access
Khalid Haseeb, Ikram Ud Din, Ahmad Almogren, Zahoor Jan, Naveed Abbas, Muhammad Adnan
2020 J jnl
IEEE Access
Waqas Wazir, Hasan Ali Khattak, Ahmad Almogren, Mudassar Ali Khan, Ikram Ud Din
2020 J jnl
J. Inf. Secur. Appl.
Hasan Ali Khattak, Komal Tehreem, Ahmad Almogren, Zoobia Ameer, Ikram Ud Din, Muhammad Adnan
2020 J jnl
Comput. Commun.
Hamid Asmat, Ikram Ud Din, Fasee Ullah, Muhammad Talha, Murad Khan, Mohsen Guizani
2020 J jnl
Comput. Commun.
Muzammil Hussain Shahid, Ahmad Raza Hameed, Saif ul Islam, Hasan Ali Khattak, Ikram Ud Din, Joel J. P. C. Rodrigues
2020 J jnl
Symmetry
Mouhssin Maache, Yousef Fazea, Ismail Bile Hassan, Ammar Ahmed Alkahtani, Ikram Ud Din
2020 J jnl
IEEE Access
Waheed Ur Rehman, Tabinda Salam, Ahmad Almogren, Khalid Haseeb, Ikram Ud Din, Safdar Hussain Bouk
2020 J jnl
Sci. Program.
Nauman Ali Khan, Sihai Zhang, Wuyang Zhou, Ahmad Almogren, Ikram Ud Din, Muhammad Asif
2020 J jnl
IEEE Access
Misba Sikandar, Waqas Anwar, Ahmad Almogren, Ikram Ud Din, Nadra Guizani
2020 J jnl
Future Gener. Comput. Syst.
Shah Rukh Khan, Misba Sikandar, Ahmad Almogren, Ikram Ud Din, Antonio Guerrieri, Giancarlo Fortino
2020 J jnl
Future Gener. Comput. Syst.
Ikram Ud Din, Suhaidi Hassan, Ahmad Almogren, Farrukh Ayub, Mohsen Guizani
2020 J jnl
IEEE Access
Fehda Malik, Hasan Ali Khattak, Ahmad Almogren, Ouns Bouachir, Ikram Ud Din, Ayman Altameem
2020 J jnl
IEEE Access
Khalid Haseeb, Ikram Ud Din, Ahmad Almogren, Naveed Islam, Ayman Altameem
2020 J jnl
Sensors
Khalid Haseeb, Ahmad Almogren, Ikram Ud Din, Naveed Islam, Ayman Altameem
2020 J jnl
IEEE Access
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Mohsen Guizani, Sonia Khan
2019 J jnl
IEEE Access
Ikram Ud Din, Ahmad Almogren, Mohsen Guizani, Mansour Zuair
2019 J jnl
Future Gener. Comput. Syst.
Naveed Islam, Yasir Faheem, Ikram Ud Din, Muhammad Talha, Mohsen Guizani, Mudassir Khalil
2019 J jnl
Pattern Recognit. Lett.
Sana Ullah Khan, Naveed Islam, Zahoor Jan, Ikram Ud Din, Joel J. P. C. Rodrigues
2019 J jnl
Multim. Tools Appl.
Ikram Ud Din, Hamid Asmat, Mohsen Guizani
2019 J jnl
Future Gener. Comput. Syst.
Sana Ullah Khan, Naveed Islam, Zahoor Jan, Ikram Ud Din, Atif Khan, Yasir Faheem
2019 J jnl
Comput. Sci. Inf. Syst.
Hasan Ali Khattak, Zoobia Ameer, Ikram Ud Din, Muhammad Khurram Khan
2019 J jnl
IEEE Wirel. Commun.
Bilal Jan, Haleem Farman, Murad Khan, Muhammad Talha, Ikram Ud Din
2019 J jnl
Future Gener. Comput. Syst.
Asfa Toor, Saif ul Islam, Nimra Sohail, Adnan Akhunzada, Jalil Boudjadar, Hasan Ali Khattak, Ikram Ud Din, Joel J. P. C. Rodrigues
2019 J jnl
IEEE Access
Kamran Ahmad Awan, Ikram Ud Din, Mahdi Zareei, Muhammad Talha, Mohsen Guizani, Sultan Ullah Jadoon
2019 J jnl
IEEE Commun. Stand. Mag.
Hasan Ali Khattak, Saif ul Islam, Ikram Ud Din, Mohsen Guizani
2019 J jnl
IEEE Access
Khalid Haseeb, Naveed Islam, Ahmad Almogren, Ikram Ud Din
2019 J jnl
Future Gener. Comput. Syst.
Ikram Ud Din, Mohsen Guizani, Joel J. P. C. Rodrigues, Suhaidi Hassan, Valery V. Korotaev
2019 J jnl
IEEE Access
Kamran Ahmad Awan, Ikram Ud Din, Ahmad Almogren, Mohsen Guizani, Ayman Altameem, Sultan Ullah Jadoon
2019 J jnl
IEEE Access
Khalid Haseeb, Naveed Islam, Ahmad Almogren, Ikram Ud Din, Hisham N. Almajed, Nadra Guizani
2019 J jnl
IEEE Access
Faiza Masood, Ghana Ammad, Ahmad Almogren, Assad Abbas, Hasan Ali Khattak, Ikram Ud Din, Mohsen Guizani, Mansour Zuair
2019 J jnl
IEEE Access
Ikram Ud Din, Mohsen Guizani, Suhaidi Hassan, Byung-Seo Kim, Muhammad Khurram Khan, Mohammed Atiquzzaman, Syed Hassan Ahmed
2019 J jnl
IEEE Netw.
Hasan Ali Khattak, Haleem Farman, Bilal Jan, Ikram Ud Din
2019 J jnl
IEEE Access
Kamran Sattar Awaisi, Assad Abbas, Mahdi Zareei, Hasan Ali Khattak, Muhammad Usman Shahid Khan, Mazhar Ali, Ikram Ud Din, Sajid Shah
2019 J jnl
IEEE Access
Ikram Ud Din, Mohsen Guizani, Byung-Seo Kim, Suhaidi Hassan, Muhammad Khurram Khan
2019 J jnl
IEEE Trans. Consumer Electron.
Mudassar Ali Khan, Ikram Ud Din, Sultan Ullah Jadoon, Muhammad Khurram Khan, Mohsen Guizani, Kamran Ahmad Awan
2019 J jnl
Future Gener. Comput. Syst.
Ayesha Siddiqua, Munam Ali Shah, Hasan Ali Khattak, Ikram Ud Din, Mohsen Guizani
2018 J jnl
IEEE Access
Muhammad Zeeshan, Muhammad Majid, Imran Fareed Nizami, Syed Muhammad Anwar, Ikram Ud Din, Muhammad Khurram Khan
2018 J jnl
IEEE Commun. Surv. Tutorials
Ikram Ud Din, Suhaidi Hassan, Muhammad Khurram Khan, Mohsen Guizani, Osman Ghazali, Adib Habbal
2018 J jnl
Sensors
Ikram Ud Din, Byung-Seo Kim, Suhaidi Hassan, Mohsen Guizani, Mohammed Atiquzzaman, Joel J. P. C. Rodrigues
2018 J jnl
IEEE Access
Omair Ahmad Khan, Munam Ali Shah, Ikram Ud Din, Byung-Seo Kim, Hasan Ali Khattak, Joel J. P. C. Rodrigues, Haleem Farman, Bilal Jan
2018 J jnl
Future Internet
Shaukat Ali, Naveed Islam, Azhar Rauf, Ikram Ud Din, Mohsen Guizani, Joel J. P. C. Rodrigues
2017 conf
ICNC-FSKD
Sultan Ullah Jadoon, Wajahat Ali, Ikram Ud Din, Yousaf Saeed, Muhammad Junaid, Eraj Khan, Shams Ullah
2016 conf
Kaleidoscope
Suhaidi Hassan, Ikram Ud Din, Adib Habbal, Nur Haryani Zakaria
tests/integration/test_basicproperties.py
← Index tests/integration/test_basicproperties.py python
"""
Integration tests for the BasicPropertiesExtractor class.
"""
import pytest
import os
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration]


class TestBasicPropertiesExtractorInitialization:
    """Tests for BasicPropertiesExtractor initialization."""

    def test_initialization(self, elf_binary_path, mock_logger):
        """Test basic initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.filepath == elf_binary_path
            assert extractor.basic_properties is None
            assert extractor.is_packed is None
            assert extractor.is_fat is None
            assert extractor.parent_sha256 is None
            assert extractor.child_sha256 is None
            assert extractor.child_architecture is None
            assert extractor.child_filetype is None

    def test_initialization_with_fat_params(self, elf_binary_path, mock_logger):
        """Test initialization with FAT Mach-O parameters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123", "def456"]
            child_archs = ["x86_64", "arm64"]
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True,
                child_sha256=child_hashes,
                child_architecture=child_archs,
                child_filetype=child_types
            )

            assert extractor.is_fat is True
            assert extractor.child_sha256 == child_hashes
            assert extractor.child_architecture == child_archs
            assert extractor.child_filetype == child_types

    def test_initialization_with_parent_sha256(self, elf_binary_path, mock_logger):
        """Test initialization with parent_sha256 for slice binaries."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            parent_hash = "parent_sha256_hash_here"

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                parent_sha256=parent_hash
            )

            assert extractor.parent_sha256 == parent_hash

    def test_elastic_index_suffix(self, elf_binary_path, mock_logger):
        """Test that elastic_index has correct suffix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert "-basic_properties" in extractor.elastic_index


class TestBasicPropertiesExtractorTag:
    """Tests for tag method."""

    def test_tag_value(self, elf_binary_path, mock_logger):
        """Test that tag returns correct value."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.tag() == Tag.BASIC_PROPERTIES.value
            assert extractor.tag() == "basic_properties"


class TestBasicPropertiesExtract:
    """Tests for extract method."""

    def test_extract_elf_binary(self, elf_binary_path, mock_logger):
        """Test extracting properties from ELF binary."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.models.dataclasses import BasicProperties

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, BasicProperties)
            assert result.sample_name == os.path.basename(elf_binary_path)
            assert result.filesize > 0
            assert result.file_entropy >= 0
            assert result.filetype is not None
            assert result.filetype_mime is not None
            assert result.filetype_magika is not None

    def test_extract_pe_binary(self, pe_binary_path, mock_logger):
        """Test extracting properties from PE binary."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.models.dataclasses import BasicProperties

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

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, BasicProperties)
            assert result.filesize > 0
            # PE file should be detected
            assert "PE" in result.filetype or "executable" in result.filetype.lower()

    def test_extract_text_file(self, temp_text_file, mock_logger):
        """Test extracting properties from text file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(temp_text_file, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert "text" in result.filetype.lower() or "ASCII" in result.filetype
            assert result.file_entropy >= 0

    def test_extract_stores_in_basic_properties(self, elf_binary_path, mock_logger):
        """Test that extract stores result in basic_properties attribute."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.basic_properties is None
            result = extractor.extract()
            assert extractor.basic_properties is result


class TestBasicPropertiesFiletype:
    """Tests for file type detection."""

    def test_elf_filetype(self, elf_binary_path, mock_logger):
        """Test ELF file type detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Should detect as ELF
            assert "ELF" in result.filetype

    def test_pe_filetype_mime(self, pe_binary_path, mock_logger):
        """Test PE file type MIME detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            result = extractor.extract()

            assert result is not None
            # PE MIME types (varies by libmagic version)
            assert "dosexec" in result.filetype_mime or "x-msdownload" in result.filetype_mime or "portable-executable" in result.filetype_mime

    def test_text_filetype_mime(self, temp_text_file, mock_logger):
        """Test text file type MIME detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(temp_text_file, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Text MIME types
            assert "text" in result.filetype_mime


class TestBasicPropertiesEntropy:
    """Tests for entropy calculation in BasicPropertiesExtractor."""

    def test_entropy_reasonable_range(self, elf_binary_path, mock_logger):
        """Test that entropy is within reasonable range (0-8)."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert 0 <= result.file_entropy <= 8

    def test_entropy_rounded(self, elf_binary_path, mock_logger):
        """Test that entropy is rounded to 3 decimal places."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Check rounding to 3 decimal places
            entropy_str = str(result.file_entropy)
            if '.' in entropy_str:
                decimal_places = len(entropy_str.split('.')[1])
                assert decimal_places <= 3


class TestBasicPropertiesFilesize:
    """Tests for file size calculation."""

    def test_filesize_matches_actual(self, elf_binary_path, mock_logger):
        """Test that filesize matches actual file size."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            actual_size = os.path.getsize(elf_binary_path)
            assert result.filesize == actual_size

    def test_filesize_matches_binary_length(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that filesize matches binary content length."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result.filesize == len(elf_binary_content)


class TestBasicPropertiesPrepareExportData:
    """Tests for prepare_export_data method."""

    def test_prepare_export_elasticsearch(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            extractor.extract()

            result = extractor.prepare_export_data("ElasticsearchExporter")

            assert result is extractor.basic_properties

    def test_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            extractor.extract()

            result = extractor.prepare_export_data("ClickHouseExporter")

            # Should return tuple of (data, column_names, column_type_names)
            assert isinstance(result, tuple)
            assert len(result) == 3

            data, column_names, column_type_names = result

            assert isinstance(data, list)
            assert len(data) == 1  # One row
            assert isinstance(column_names, list)
            assert isinstance(column_type_names, list)

            # Check expected columns
            assert 'sha256' in column_names
            assert 'md5' in column_names
            assert 'sha1' in column_names
            assert 'filesize' in column_names
            assert 'file_entropy' in column_names
            assert 'filetype' in column_names
            assert 'filetype_mime' in column_names
            assert 'filetype_magika' in column_names
            # New FAT/child columns
            assert 'parent_sha256' in column_names
            assert 'child_sha256' in column_names
            assert 'child_architecture' in column_names
            assert 'child_filetype' in column_names
            assert 'is_fat' in column_names

    def test_prepare_export_clickhouse_data_types(self, elf_binary_path, mock_logger):
        """Test that ClickHouse export data has correct types."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")

            row = data[0]

            # Check that sha256 is a string with correct length
            sha256_idx = column_names.index('sha256')
            assert isinstance(row[sha256_idx], str)
            assert len(row[sha256_idx]) == 64

            # Check that filesize is an integer
            filesize_idx = column_names.index('filesize')
            assert isinstance(row[filesize_idx], int)

            # Check that file_entropy is a float
            entropy_idx = column_names.index('file_entropy')
            assert isinstance(row[entropy_idx], float)


class TestBasicPropertiesClickHouseTable:
    """Tests for get_clickhouse_table method."""

    def test_clickhouse_table_name(self, elf_binary_path, mock_logger):
        """Test correct ClickHouse table name."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.get_clickhouse_table() == "redb_basic_properties"


class TestBasicPropertiesExportData:
    """Tests for export_data method."""

    def test_export_data_with_print_exporter(self, elf_binary_path, mock_logger, mock_print_exporter, capsys):
        """Test export_data with PrintExporter."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            result = extractor.export_data()

            assert result is True

    def test_export_data_empty_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[]
            )

            result = extractor.export_data()

            # Should succeed with no exporters
            assert result is True


class TestBasicPropertiesMagika:
    """Tests for Magika file type detection."""

    def test_magika_elf_detection(self, elf_binary_path, mock_logger):
        """Test Magika detection of ELF files."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Magika should detect ELF
            assert result.filetype_magika == "elf" or "elf" in result.filetype_magika.lower()

    def test_magika_pe_detection(self, pe_binary_path, mock_logger):
        """Test Magika detection of PE files."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            result = extractor.extract()

            assert result is not None
            # Magika should detect PE
            assert "pe" in result.filetype_magika.lower() or "exe" in result.filetype_magika.lower()


class TestBasicPropertiesFATSupport:
    """Tests for FAT Mach-O and child file support."""

    def test_extract_with_fat_flag(self, elf_binary_path, mock_logger):
        """Test extraction with is_fat flag set."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True
            )

            result = extractor.extract()

            assert result is not None
            assert result.is_fat is True

    def test_extract_with_child_hashes(self, elf_binary_path, mock_logger):
        """Test extraction with child_sha256 provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123def456", "789ghi012jkl"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_sha256=child_hashes
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_sha256 == child_hashes

    def test_extract_with_child_architecture(self, elf_binary_path, mock_logger):
        """Test extraction with child_architecture provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_archs = ["x86_64", "arm64"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_architecture=child_archs
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_architecture == child_archs

    def test_extract_with_child_filetype(self, elf_binary_path, mock_logger):
        """Test extraction with child_filetype provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_filetype=child_types
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_filetype == child_types

    def test_clickhouse_export_with_fat_data(self, elf_binary_path, mock_logger):
        """Test ClickHouse export includes FAT-related fields correctly."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123", "def456"]
            child_archs = ["x86_64", "arm64"]
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True,
                child_sha256=child_hashes,
                child_architecture=child_archs,
                child_filetype=child_types,
                parent_sha256=None  # FAT container has no parent
            )
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")
            row = data[0]

            # Check FAT fields
            is_fat_idx = column_names.index('is_fat')
            assert row[is_fat_idx] is True

            child_sha256_idx = column_names.index('child_sha256')
            assert row[child_sha256_idx] == child_hashes

            child_arch_idx = column_names.index('child_architecture')
            assert row[child_arch_idx] == child_archs

            child_type_idx = column_names.index('child_filetype')
            assert row[child_type_idx] == child_types

    def test_clickhouse_export_for_slice(self, elf_binary_path, mock_logger):
        """Test ClickHouse export for a slice binary with parent_sha256."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            parent_hash = "parent_container_sha256_hash"

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                parent_sha256=parent_hash
            )
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")
            row = data[0]

            parent_idx = column_names.index('parent_sha256')
            assert row[parent_idx] == parent_hash

    def test_default_fat_fields_are_none_or_empty(self, elf_binary_path, mock_logger):
        """Test that FAT-related fields default to None/empty for non-FAT binaries."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert result.is_fat is None
            assert result.child_sha256 is None
            assert result.child_architecture is None
            assert result.child_filetype is None


@pytest.mark.unit
@pytest.mark.dataclass
class TestBasicPropertiesDataclass:
    """Tests for BasicProperties dataclass structure."""

    def test_dataclass_has_all_expected_fields(self):
        """Test that BasicProperties dataclass has all expected fields."""
        from redb.models.dataclasses import BasicProperties

        # Create a sample instance
        bp = BasicProperties(
            filename="test.exe",
            sample_name="test.exe",
            filesize=1024,
            filetype="PE32",
            filetype_mime="application/x-dosexec",
            filetype_magika="pebin",
            file_entropy=6.5
        )

        # Check required fields
        assert bp.filename == "test.exe"
        assert bp.sample_name == "test.exe"
        assert bp.filesize == 1024
        assert bp.filetype == "PE32"
        assert bp.filetype_mime == "application/x-dosexec"
        assert bp.filetype_magika == "pebin"
        assert bp.file_entropy == 6.5

        # Check optional fields default to None
        assert bp.is_packed is None
        assert bp.is_fat is None
        assert bp.child_sha256 is None
        assert bp.child_architecture is None
        assert bp.child_filetype is None

    def test_dataclass_with_optional_fat_fields(self):
        """Test BasicProperties dataclass with FAT-related optional fields."""
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="universal.app",
            sample_name="universal.app",
            filesize=2048,
            filetype="Mach-O universal",
            filetype_mime="application/x-mach-binary",
            filetype_magika="macho",
            file_entropy=7.2,
            is_fat=True,
            child_sha256=["hash1", "hash2"],
            child_architecture=["x86_64", "arm64"],
            child_filetype=["macho", "macho"]
        )

        assert bp.is_fat is True
        assert bp.child_sha256 == ["hash1", "hash2"]
        assert bp.child_architecture == ["x86_64", "arm64"]
        assert bp.child_filetype == ["macho", "macho"]