Mahdi Fahmideh

74 papers A 2B 3Journal 58Unranked 11
YearRankTypeTitle / Venue / Authors
2025 conf
ICSE-SEIS
Davoud Mougouei, Ahmad Azarnik, Mahdi Fahmideh, Elahe Mougouei, Hoa Khanh Dam, Arif Ali Khan, Saima Rafi, Javed Ali Khan, Aakash Ahmad
2025 J jnl
IEEE Internet Things J.
Akbar Telikani, Jun Shen, Bo Du, Mahdi Fahmideh, Jun Yan
2025 J jnl
Knowl. Based Syst.
Danial Javaheri, Hassan Chizari, Mahdi Fahmideh, Mohammad H. Nadimi-Shahraki, Junbeom Hur
2025 J jnl
Internet Things
Naghmeh Khajehali, Jun Yan, Yang-Wai Chow, Mahdi Fahmideh
2025 J jnl
CoRR
Aakash Ahmad, Muhammad Waseem, Bakheet Aljedaani, Mahdi Fahmideh, Peng Liang, Feras M. Awaysheh
2025 J jnl
Behav. Inf. Technol.
Davoud Mougouei, Saima Rafi, Mahdi Fahmideh, Elahe Mougouei, Javed Ali Khan, Hoa Khanh Dam, Arif Nurwidyantoro, Michel Chaudron
2024 J jnl
CoRR
Bakheet Aljedaani, Aakash Ahmad, Mahdi Fahmideh, Arif Ali Khan, Jun Shen
2024 B conf
ENASE
Muhammad Waseem, Teerath Das, Aakash Ahmad, Peng Liang, Mahdi Fahmideh, Tommi Mikkonen
2024 J jnl
Expert Syst. Appl.
Danial Javaheri, Mahdi Fahmideh, Hassan Chizari, Pooia Lalbakhsh, Junbeom Hur
2024 J jnl
Empir. Softw. Eng.
Arif Ali Khan, Javed Ali Khan, Muhammad Azeem Akbar, Peng Zhou, Mahdi Fahmideh
2024 J jnl
Decis. Support Syst.
Mahdi Fahmideh, Babak Abedin, Jun Shen
2023 J jnl
Sensors
Naghmeh Khajehali, Jun Yan, Yang-Wai Chow, Mahdi Fahmideh
2023 J jnl
IEEE Trans. Comput. Soc. Syst.
Arif Ali Khan, Muhammad Azeem Akbar, Mahdi Fahmideh, Peng Liang, Muhammad Waseem, Aakash Ahmad, Mahmood Khan Niazi, Pekka Abrahamsson
2023 conf
QSW
Arif Ali Khan, Muhammad Azeem Akbar, Aakash Ahmad, Mahdi Fahmideh, Mohammad Shameem, Valtteri Lahtinen, Muhammad Waseem, Tommi Mikkonen
2023 J jnl
CoRR
Danial Javaheri, Mahdi Fahmideh, Hassan Chizari, Pooia Lalbakhsh, Junbeom Hur
2023 J jnl
ACM Comput. Surv.
Mahdi Fahmideh, John C. Grundy, Aakash Ahmad, Jun Shen, Jun Yan, Davoud Mougouei, Peng Wang, Aditya Ghose, Anuradha Gunawardana, Uwe Aickelin, Babak Abedin
2023 J jnl
CoRR
Aakash Ahmad, Muhammad Waseem, Peng Liang, Mahdi Fahmideh, Arif Ali Khan, David Georg Reichelt, Tommi Mikkonen
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Wei Wei, Jun Shen, Akbar Telikani, Mahdi Fahmideh, Wei Gao
2023 J jnl
CoRR
Arif Ali Khan, Javed Ali Khan, Muhammad Azeem Akbar, Peng Zhou, Mahdi Fahmideh
2023 J jnl
J. Syst. Softw.
Arif Ali Khan, Aakash Ahmad, Muhammad Waseem, Peng Liang, Mahdi Fahmideh, Tommi Mikkonen, Pekka Abrahamsson
2023 J jnl
Internet Things
Abdul Razzaq, Aakash Ahmad, Asad Waqar Malik, Mahdi Fahmideh, Rabie A. Ramadan
2023 A conf
EASE
Aakash Ahmad, Muhammad Waseem, Peng Liang, Mahdi Fahmideh, Mst Shamima Aktar, Tommi Mikkonen
2023 J jnl
CoRR
Aakash Ahmad, Muhammad Waseem, Peng Liang, Mahdi Fahmideh, Mst Shamima Aktar, Tommi Mikkonen
2023 J jnl
IEEE Trans. Serv. Comput.
Dong Lu, Yanlong Zhai, Jun Shen, Mahdi Fahmideh, Jianqing Wu, Jude Tchaye-Kondi, Liehuang Zhu
2023 J jnl
CoRR
Muhammad Waseem, Teerath Das, Aakash Ahmad, Mahdi Fahmideh, Peng Liang, Tommi Mikkonen
2022 J jnl
Inf. Softw. Technol.
Mahdi Fahmideh, John Grundy, Ghassan Beydoun, Didar Zowghi, Willy Susilo, Davoud Mougouei
2022 J jnl
CoRR
Arif Ali Khan, Muhammad Azeem Akbar, Muhammad Waseem, Mahdi Fahmideh, Aakash Ahmad, Peng Liang, Mahmood Niazi, Pekka Abrahamsson
2022 J jnl
CoRR
Arif Ali Khan, Muhammad Azeem Akbar, Aakash Ahmad, Mahdi Fahmideh, Mohammad Shameem, Valtteri Lahtinen, Muhammad Waseem, Tommi Mikkonen
2022 conf
WINSYS
Mohiuddin Ahmed, A. F. M. Suaib Akhter, A. N. M. Bazlur Rashid, Mahdi Fahmideh, Al-Sakib Khan Pathan, Adnan Anwar
2022 J jnl
Knowl. Based Syst.
Qiang Wu, Jianqing Wu, Jun Shen, Bo Du, Akbar Telikani, Mahdi Fahmideh, Chao Liang
2022 conf
QP4SE@ESEC/SIGSOFT FSE
Arif Ali Khan, Mahdi Fahmideh, Aakash Ahmad, Muhammad Waseem, Mahmood Khan Niazi, Valtteri Lahtinen, Tommi Mikkonen
2022 A conf
EASE
Arif Ali Khan, Sher Badshah, Peng Liang, Muhammad Waseem, Bilal Khan, Aakash Ahmad, Mahdi Fahmideh, Mahmood Khan Niazi, Muhammad Azeem Akbar
2022 J jnl
CoRR
Mahdi Fahmideh, Jun Yan, Jun Shen, Aakash Ahmad, Davoud Mougouei, Anup Shrestha
2022 conf
PACIS
Mahdi Fahmideh, Ghassan Beydoun, Madhushi Niluka Bandara, Aakash Ahmad, Arif Ali Khan, Anup Shrestha
2022 J jnl
CoRR
Arif Ali Khan, Aakash Ahmad, Muhammad Waseem, Peng Liang, Mahdi Fahmideh, Tommi Mikkonen, Pekka Abrahamsson
2022 J jnl
IEEE Trans. Software Eng.
Mahdi Fahmideh, Aakash Ahmad, Ali Behnaz, John Grundy, Willy Susilo
2022 conf
QSW
Aakash Ahmad, Arif Ali Khan, Muhammad Waseem, Mahdi Fahmideh, Tommi Mikkonen
2021 J jnl
CoRR
Mahdi Fahmideh, Jun Yan, Jun Shen, Davoud Mougouei, Yanlong Zhai, Aakash Ahmad
2021 B conf
FUZZ-IEEE
Davoud Mougouei, Aditya Ghose, Hoa Khanh Dam, Mahdi Fahmideh, David M. W. Powers
2021 J jnl
CoRR
Mahdi Fahmideh, John C. Grundy, Ghassan Beydoun, Didar Zowghi, Willy Susilo, Davoud Mougouei
2021 conf
EDOC Workshops
Aakash Ahmad, Madhushi Niluka Bandara, Mahdi Fahmideh, Henderik A. Proper, Giancarlo Guizzardi, Jeffrey Soar
2021 J jnl
CoRR
Aakash Ahmad, Madhushi Niluka Bandara, Mahdi Fahmideh, Henderik A. Proper, Giancarlo Guizzardi, Jeffrey Soar
2021 conf
ICIOT
Mahdi Fahmideh, Anuradha Gunawardana, Shiping Chen, Jun Shen, Brian Yecies
2021 J jnl
CoRR
Mahdi Fahmideh, Anuradha Gunawardana, Shiping Chen, Jun Shen, Brian Yecies
2021 J jnl
CoRR
Mahdi Fahmideh, Graham Low, Ghassan Beydoun
2021 J jnl
CoRR
Mahdi Fahmideh, John Grundy, Aakash Ahmed, Jun Shen, Jun Yan, Davoud Mougouei, Peng Wang, Aditya Ghose, Anuradha Gunawardana, Uwe Aickelin, Babak Abedin
2021 J jnl
CoRR
Mahdi Fahmideh, Aakash Ahmed, Ali Behnaz, John Grundy, Willy Susilo
2021 J jnl
IEEE Access
Aakash Ahmad, Mahdi Fahmideh, Ahmed B. Altamimi, Iyad A. Katib, Aiiad Albeshri, Abdulrahman Alreshidi, Adwan Alownie Alanazi, Rashid Mehmood
2021 J jnl
CoRR
Aakash Ahmad, Mahdi Fahmideh, Ahmed B. Altamimi, Iyad A. Katib, Aiiad Albeshri, Abdulrahman Alreshidi, Adwan Alanazi, Rashid Mehmood
2021 J jnl
Pervasive Mob. Comput.
Chiara Boldrini, Aakash Ahmad, Mahdi Fahmideh, Rabie Ramadan, Mohamed F. Younis
2020 J jnl
CoRR
Mahdi Fahmideh, Pooyan Jamshidi, Fereidoon Shams
2020 J jnl
CoRR
Mahdi Fahmideh, Farhad Daneshgar, Fethi A. Rabhi, Ghassan Beydoun
2020 J jnl
CoRR
Mahdi Fahmideh, Thorsten Lammers
2020 J jnl
CoRR
Mahdi Fahmideh, Didar Zowghi
2020 J jnl
Inf. Syst.
Mahdi Fahmideh, Didar Zowghi
2020 J jnl
CoRR
Mahdi Fahmideh, Ghassan Beydoun
2020 J jnl
CoRR
Mahdi Fahmideh, Farhad Daneshgar, Ghassan Beydoun, Fethi A. Rabhi
2020 J jnl
CoRR
Mahdi Fahmideh, Farhad Daneshgar, Fethi A. Rabhi
2020 J jnl
CoRR
Mahdi Fahmideh, Graham Low, Ghassan Beydoun, Farhad Daneshgar
2020 J jnl
CoRR
Mahdi Fahmideh, Jafar Habibi, Fereidoon Shams, Sedigheh Khoshnevis
2020 J jnl
CoRR
Mahdi Fahmideh, Mohsen Sharifi, Pooyan Jamshidi
2020 J jnl
CoRR
Mahdi Fahmideh, Ghassan Beydoun, Graham Low
2020 J jnl
CoRR
Mahdi Fahmideh, Didar Zowghi
2020 J jnl
CoRR
Mahdi Fahmideh, Mohsen Sharifi, Pooyan Jamshidi, Fereidoon Shams, Hassan Haghighi
2020 J jnl
CoRR
Mahdi Fahmideh, Ghassan Beydoun
2020 J jnl
CoRR
Mahdi Fahmideh, Fereidoon Shams, Pooyan Jamshidi
2019 J jnl
Eur. J. Inf. Syst.
Mahdi Fahmideh, Farhad Daneshgar, Fethi A. Rabhi, Ghassan Beydoun
2019 J jnl
Comput. Ind. Eng.
Mahdi Fahmideh, Ghassan Beydoun
2019 J jnl
Inf. Sci.
Mahdi Fahmideh, Ghassan Beydoun, Graham Low
2018 conf
ACIS
Mahdi Fahmideh, Thorsten Lammers
2018 J jnl
J. Syst. Softw.
Mahdi Fahmideh, Ghassan Beydoun
2016 conf
ESOCC Workshops
Mahdi Fahmideh, Farhad Daneshgar, Fethi A. Rabhi
2011 B conf
RCIS
Mahdi Fahmideh, Mohsen Sharifi, Pooyan Jamshidi, Fereidoon Shams, Hassan Haghighi
2011 conf
ICSECS (3)
Mahdi Fahmideh, Fereidoon Shams, Pooyan Jamshidi
tests/integration/test_base_extractor.py
← Index tests/integration/test_base_extractor.py python
"""
Integration tests for the base Extractor class.
"""
import pytest
import hashlib
import math
from unittest.mock import Mock, patch, MagicMock
from collections import Counter

pytestmark = [pytest.mark.integration]


class TestExtractorStaticMethods:
    """Tests for static methods in Extractor class."""

    def test_process_binary_string_printable(self):
        """Test processing a printable binary string."""
        from redb.extractors.extractor import Extractor

        # Test with printable ASCII characters
        input_bytes = b"Hello World\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "Hello World"

    def test_process_binary_string_non_printable(self):
        """Test processing a string with non-printable characters."""
        from redb.extractors.extractor import Extractor

        # Test with non-printable characters
        input_bytes = b"\x01\x02Hello\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x01" in result
        assert "\\x02" in result
        assert "Hello" in result

    def test_process_binary_string_empty(self):
        """Test processing an empty binary string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == ""

    def test_process_binary_string_all_printable(self):
        """Test processing a fully printable string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"TestString123"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "TestString123"

    def test_remove_non_utf8_valid(self):
        """Test removing non-UTF8 characters from valid UTF8 string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"Hello World"
        result = Extractor.remove_non_utf8(input_bytes)
        assert result == b"Hello World"

    def test_remove_non_utf8_with_invalid(self):
        """Test removing non-UTF8 characters from mixed string."""
        from redb.extractors.extractor import Extractor

        # Mix of valid UTF8 and invalid bytes
        input_bytes = b"Hello\xff\xfeWorld"
        result = Extractor.remove_non_utf8(input_bytes)
        # Should remove the invalid bytes
        assert b"\xff" not in result
        assert b"\xfe" not in result
        assert b"Hello" in result
        assert b"World" in result

    def test_remove_non_utf8_empty(self):
        """Test removing non-UTF8 from empty string."""
        from redb.extractors.extractor import Extractor

        result = Extractor.remove_non_utf8(b"")
        assert result == b""


class TestExtractorEntropyCalculation:
    """Tests for entropy calculation in Extractor class."""

    def test_calculate_entropy_empty_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with empty data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(b"")
            assert result == 0.0

    def test_calculate_entropy_uniform_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with uniform (low entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # All same bytes = 0 entropy
            uniform_data = b"\x00" * 256
            result = extractor.calculate_entropy(uniform_data)
            assert result == 0.0

    def test_calculate_entropy_random_data(self, elf_binary_path, mock_logger, high_entropy_data):
        """Test entropy calculation with random (high entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(high_entropy_data)
            # Random data should have entropy close to 8 (max for bytes)
            assert result > 7.0

    def test_calculate_entropy_binary_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with binary data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # Two equally distributed values = 1 bit entropy
            binary_data = b"\x00\x01" * 128
            result = extractor.calculate_entropy(binary_data)
            assert abs(result - 1.0) < 0.01

    def test_calculate_entropy_string_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with string data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # String with two equally distributed characters
            string_data = "ab" * 100
            result = extractor.calculate_entropy(string_data)
            assert abs(result - 1.0) < 0.01


class TestExtractorInitialization:
    """Tests for Extractor initialization."""

    def test_extractor_hashes_computed_on_init(self, elf_binary_path, mock_logger, known_hashes):
        """Test that hashes are computed during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert extractor.md5 == known_hashes['md5']
            assert extractor.sha1 == known_hashes['sha1']
            assert extractor.sha256 == known_hashes['sha256']

    def test_extractor_hash_dataclass_created(self, elf_binary_path, mock_logger, known_hashes):
        """Test that Hash dataclass is created during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert extractor.hash.md5 == known_hashes['md5']
            assert extractor.hash.sha1 == known_hashes['sha1']
            assert extractor.hash.sha256 == known_hashes['sha256']

    def test_extractor_binary_cached_property(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that binary content is loaded as cached property."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            # Access binary property
            binary = extractor.binary
            assert binary == elf_binary_content

            # Second access should return cached value (same id)
            assert extractor.binary is binary

    def test_extractor_with_exporters(self, elf_binary_path, mock_logger, mock_print_exporter):
        """Test extractor initialization with exporters."""
        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]
            )

            assert len(extractor.exporters) == 1
            assert extractor.exporters[0] is mock_print_exporter

    def test_extractor_with_index_prefix(self, elf_binary_path, mock_logger):
        """Test extractor initialization with custom index prefix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert "custom_prefix" in extractor.elastic_index

    def test_extractor_known_benign_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_benign flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert extractor.known_benign is True
            assert extractor.known_malicious is False

    def test_extractor_known_malicious_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_malicious flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

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

            assert extractor.known_benign is False
            assert extractor.known_malicious is True


class TestExtractorExportData:
    """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()
            # Should succeed with PrintExporter
            assert result is True

    def test_export_data_no_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters configured."""
        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 (nothing to export)
            assert result is True


class TestExtractorEdgeCases:
    """Tests for edge cases in Extractor class."""

    def test_extractor_with_nonexistent_file(self, mock_logger):
        """Test extractor with non-existent file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            with pytest.raises(FileNotFoundError):
                BasicPropertiesExtractor("/nonexistent/file.bin", mock_logger)

    def test_entropy_none_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with None returns 0."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(None)
            assert result == 0.0

    def test_process_binary_string_high_bytes(self):
        """Test processing binary string with high byte values."""
        from redb.extractors.extractor import Extractor

        # Characters above 126 are non-printable
        input_bytes = b"\x7f\x80\x81\xff"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x7f" in result
        assert "\\x80" in result
        assert "\\xff" in result