Rana Alabdan

21 papers Journal 20Unranked 1
YearRankTypeTitle / Venue / Authors
2026 J jnl
Int. J. Inf. Sec.
Amani K. Samha, Hanan Abdullah Mengash, Mohammed A. AlAqil, Hamed AlQahtani, Somia A. Asklany, Rana Alabdan
2025 J jnl
IEEE Trans. Big Data
Fahd N. Al-Wesabi, Marwa Ismael Obayya, Jamal M. Alsamri, Rana Alabdan, Nojood O. Aljehane, Sana Alazwari, Fahad F. Alruwaili, Manar Ahmed Hamza, A Swathi
2025 J jnl
Signal Image Video Process.
Rana Alabdan, Mohammed A. AlAqil, Eman M. Alanazi, Abu Sarwar Zamani
2024 J jnl
IEEE Trans. Consumer Electron.
Rana Alabdan, Hend Khalid Alkahtani, Kamal M. Othman, Roobaea Alroobaea, Sultan Abdullah Algarni, Abeer A. K. Alharbi, K. Shankar
2024 J jnl
IEEE Trans. Consumer Electron.
Marwa Ismael Obayya, Fahd N. Al-Wesabi, Rana Alabdan, Majdi Khalid, Mohammed Assiri, Mohamed Ibrahim Alsaid, Azza Elneil Osman, Amani A. Alneil
2024 J jnl
Cogn. Comput.
Rana Alabdan, Jamal M. Alsamri, Siwar Ben Haj Hassine, Faiz Abdullah Alotaibi, Saud S. Alotaibi, Ayman Yafoz, Mrim M. Alnfiai, Mesfer Al Duhayyim
2023 conf
SIGMIS-CPR
Eman Alyami, Ghadeer R. Alsaeed, Rana Alabdan, Deborah J. Armstrong, Sam Zaza
2023 J jnl
IEEE Access
Mohamed Ahmed Elfaki, Haya Mesfer Alshahrani, Khalid Mahmood, Rana Alabdan, Mofadal Alymani, Hussain Alshahrani, Abdelwahed Motwakel, Amani A. Alneil
2023 J jnl
IEEE Access
Rana Alabdan, Hanan Abdullah Mengash, Mohammed Maray, Faiz Abdullah Alotaibi, Sitelbanat Abdelbagi, Ahmed Mahmud
2023 J jnl
Future Gener. Comput. Syst.
Fahd N. Al-Wesabi, Hanan Abdullah Mengash, Radwa Marzouk, Nuha Alruwais, Randa Allafi, Rana Alabdan, Meshal Alharbi, Deepak Gupta
2022 J jnl
Sensors
Aisha Muhammad, Mohammed A. H. Ali, Sherzod Turaev, Rawad Abdulghafor, Ibrahim Haruna Shanono, Zaid Alzaid, Abdulrahman Alruban, Rana Alabdan, Ashit Kumar Dutta, Sultan Almotairi
2022 J jnl
Comput. Electr. Eng.
Mohammed Maray, Amani Abdulrahman Albraikan, Saud S. Alotaibi, Rana Alabdan, Mesfer Al Duhayyim, Waleed Khaild Al-Azzawi, Ahmed Alkhayyat
2022 J jnl
Comput. Electr. Eng.
Fadwa M. Alrowais, Mashael M. Asiri, Rana Alabdan, Radwa Marzouk, Anwer Mustafa Hilal, Ahmed Alkhayyat, Deepak Gupta
2022 J jnl
Expert Syst. J. Knowl. Eng.
Mohammed Maray, Mohammed Alghamdi, Fatma S. Alrayes, Saud S. Alotaibi, Sana Alazwari, Rana Alabdan, Mesfer Al Duhayyim
2022 J jnl
Expert Syst. J. Knowl. Eng.
Anwer Mustafa Hilal, Rana Alabdan, Mohamed Tahar Ben Othman, Siwar Ben Haj Hassine, Fahd N. Al-Wesabi, Mohammed Rizwanullah, Ishfaq Yaseen, Abdelwahed Motwakel
2022 J jnl
Image Vis. Comput.
Marwa Ismael Obayya, Saud S. Alotaibi, Sami Dhahbi, Rana Alabdan, Mesfer Al Duhayyim, Manar Ahmed Hamza, Mohammed Rizwanullah, Abdelwahed Motwakel
2022 J jnl
Comput. Networks
Anwer Mustafa Hilal, Amani Abdulrahman Albraikan, Sami Dhahbi, Saud S. Alotaibi, Rana Alabdan, Mesfer Al Duhayyim, Abdelwahed Motwakel, Ishfaq Yaseen
2021 J jnl
IEEE Access
Rawad Abdulghafor, Sherzod Turaev, Hamad Almohamedh, Rana Alabdan, Badr Almutairi, Abdulrazaq Almutairi, Sultan Almotairi
2021 J jnl
IEEE Access
Sumera Ahmad, Suraya Miskon, Rana Alabdan, Iskander Tlili
2020 J jnl
IEEE Access
Muhammad Sajjad Shabbir, Qamar Din, Rana Alabdan, Asifa Tassaddiq, Khalil Ahmad
2020 J jnl
Future Internet
Rana Alabdan
tests/unit/test_apk_apktool_wrapper.py
← Index tests/unit/test_apk_apktool_wrapper.py python
"""
Unit tests for apktool wrapper subprocess management and smali directory detection.

All subprocess calls are mocked — no apktool/Java installation required.
"""
import os
import tempfile

import pytest
from unittest.mock import MagicMock, patch

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


class TestApktoolDisassembler:
    """Tests for ApktoolDisassembler subprocess wrapper."""

    @patch.dict(os.environ, {}, clear=False)
    def test_init_defaults(self):
        os.environ.pop("APKTOOL_PATH", None)
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        a = ApktoolDisassembler()
        assert a.apktool_path == "apktool"
        assert a.timeout == 120

    def test_init_custom(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        a = ApktoolDisassembler(apktool_path="/opt/apktool", timeout=120)
        assert a.apktool_path == "/opt/apktool"
        assert a.timeout == 120

    def test_init_from_env(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        with patch.dict(os.environ, {"APKTOOL_PATH": "/usr/bin/apktool", "APKTOOL_TIMEOUT": "90"}):
            a = ApktoolDisassembler()
            assert a.apktool_path == "/usr/bin/apktool"
            assert a.timeout == 90

    @patch("subprocess.Popen")
    def test_disassemble_success(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("output", "")
        mock_proc.returncode = 0
        mock_popen.return_value = mock_proc

        a = ApktoolDisassembler()
        result = a.disassemble("/test.apk", "/output")
        assert result is True

    @patch("subprocess.Popen")
    def test_disassemble_failure(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("", "error")
        mock_proc.returncode = 1
        mock_popen.return_value = mock_proc

        a = ApktoolDisassembler(log=MagicMock())
        result = a.disassemble("/test.apk", "/output")
        assert result is False

    @patch("subprocess.Popen")
    def test_disassemble_timeout(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        import subprocess
        mock_proc = MagicMock()
        mock_proc.communicate.side_effect = subprocess.TimeoutExpired(cmd="apktool", timeout=10)
        mock_proc.pid = 12345
        mock_popen.return_value = mock_proc

        with patch("os.getpgid", return_value=12345), \
             patch("os.killpg"):
            a = ApktoolDisassembler(timeout=10, log=MagicMock())
            result = a.disassemble("/test.apk", "/output")
            assert result is False

    @patch("subprocess.Popen", side_effect=FileNotFoundError)
    def test_disassemble_not_found(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        a = ApktoolDisassembler(log=MagicMock())
        result = a.disassemble("/test.apk", "/output")
        assert result is False

    @patch("subprocess.Popen")
    def test_disassemble_command_args(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("", "")
        mock_proc.returncode = 0
        mock_popen.return_value = mock_proc

        a = ApktoolDisassembler(apktool_path="/opt/apktool")
        a.disassemble("/test.apk", "/output")

        cmd = mock_popen.call_args[0][0]
        assert cmd[0] == "/opt/apktool"
        assert "d" in cmd
        assert "--no-res" in cmd
        assert "--force" in cmd
        assert "/test.apk" in cmd

    def test_get_smali_directories_single_dex(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        with tempfile.TemporaryDirectory() as tmpdir:
            os.makedirs(os.path.join(tmpdir, "smali"))
            a = ApktoolDisassembler()
            dirs = a.get_smali_directories(tmpdir)
            assert len(dirs) == 1
            assert dirs[0].endswith("smali")

    def test_get_smali_directories_multi_dex(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        with tempfile.TemporaryDirectory() as tmpdir:
            os.makedirs(os.path.join(tmpdir, "smali"))
            os.makedirs(os.path.join(tmpdir, "smali_classes2"))
            os.makedirs(os.path.join(tmpdir, "smali_classes3"))
            # Should not be included
            os.makedirs(os.path.join(tmpdir, "res"))
            os.makedirs(os.path.join(tmpdir, "original"))

            a = ApktoolDisassembler()
            dirs = a.get_smali_directories(tmpdir)
            assert len(dirs) == 3

    def test_get_smali_directories_empty(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        with tempfile.TemporaryDirectory() as tmpdir:
            a = ApktoolDisassembler()
            dirs = a.get_smali_directories(tmpdir)
            assert dirs == []

    def test_get_smali_directories_nonexistent(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        a = ApktoolDisassembler()
        dirs = a.get_smali_directories("/nonexistent/path")
        assert dirs == []