Radwa El Shawi

60 papers A* 1A 3B 6C 2Misc 2Journal 25Unranked 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
Expert Syst. Appl.
Jan Timko, Radwa El Shawi, Stefania Tomasiello
2025 conf
PAKDD (2)
Radwa El Shawi
2025 A conf
CIKM
Ahmed Soliman, Radwa El Shawi
2025 B conf
IJCNN
Tayasan Milinda H. Gedara, Radwa El Shawi, Vincenzo Loia, Stefania Tomasiello
2025 conf
EDBT/ICDT Workshops
Radwa El Shawi, Stefania Tomasiello, Evelin Loit, Ayhan Gökçe, Virmantas Povilaitis, Stefan Shilev
2025 ed.
BDA
Anirban Dasgupta, Rage Uday Kiran, Radwa El Shawi, Satish Narayana Srirama, Mainak Adhikari
2025 conf
EDBT/ICDT Workshops
Muhammad Uzair, Radwa El Shawi, Stefania Tomasiello
2025 B conf
EDBT
Mohamed Maher, Osama Fayez Oun, Mahmoud Saeed Mesmeh, Radwa El Shawi
2025 conf
AIME (2)
Mohamed Maher, Reem Ayman, Sondos Akram, Omar Marie, Radwa El Shawi
2025 conf
ECML/PKDD (10)
Mehak Mushtaq Malik, Radwa El Shawi
2025 J jnl
Future Gener. Comput. Syst.
Radwa El Shawi, Mohamadjavad Bahmani, Sherif Sakr
2025 J jnl
IEEE Access
Tayasan Milinda H. Gedara, Rosario Gaeta, Stefania Tomasiello, Radwa El Shawi
2025 conf
PAKDD (4)
Ali Ghazal, Radwa El Shawi
2024 J jnl
Expert Syst. Appl.
Hassan Eldeeb, Mohamed Maher, Radwa El Shawi, Sherif Sakr
2024 J jnl
Cogn. Comput.
Radwa El Shawi
2024 B conf
EDBT
Esraa Sayed, Mohamed Maher, Omar Sedeek, Ahmed Eldamaty, Amr Kamel, Radwa El Shawi
2024 J jnl
CoRR
Michal Tkác, Jakub Sieber, Lara Kuhlmann, Matthias Brueggenolte, Alexandru Rinciog, Michael Henke, Artur M. Schweidtmann, Qinghe Gao, Maximilian F. Theisen, Radwa El Shawi
2023 A* conf
IJCAI
Radwa El Shawi, Mouaz H. Al-Mallah
2023 A conf
CIKM
Radwa El Shawi, Dmitri Rozgonjuk
2022 J jnl
CoRR
Hassan Eldeeb, Mohamed Maher, Oleh Matsuk, Abdelrahman Aldallal, Radwa El Shawi, Sherif Sakr
2022 B conf
IEEE Big Data
Hassan Eldeeb, Shota Amashukeli, Radwa El Shawi
2022 J jnl
J. Artif. Intell. Res.
Radwa El Shawi, Mouaz H. Al-Mallah
2022 conf
ICDM (Workshops)
Radwa El Shawi, Sherif Sakr
2022 conf
ICDM (Workshops)
Radwa El Shawi, Sherif Sakr
2021 J jnl
Clust. Comput.
Radwa El Shawi, Abdul Wahab, Ahmed Barnawi, Sherif Sakr
2021 J jnl
Comput. Intell.
Radwa El Shawi, Youssef Sherif, Mouaz H. Al-Mallah, Sherif Sakr
2021 conf
WILF
Radwa El Shawi, Stefania Tomasiello, Henri Liiva
2021 J jnl
CoRR
Mohamadjavad Bahmani, Radwa El Shawi, Nshan Potikyan, Sherif Sakr
2021 B conf
EDBT
Radwa El Shawi, Youssef Sherif, Sherif Sakr
2021 conf
IEEE BigData
Radwa El Shawi, Hudson Lekunze, Sherif Sakr
2020 conf
ICPR Workshops (4)
Hassan Eldeeb, Shota Amashukeli, Radwa El Shawi
2020 A conf
ICDCS
Ahmed Abd Elrahman, Mohamed ElHelw, Radwa El Shawi, Sherif Sakr
2019 conf
ICDM Workshops
Salijona Dyrmishi, Radwa El Shawi, Sherif Sakr
2019 J jnl
CoRR
Radwa El Shawi, Mohamed Maher, Sherif Sakr
2019 conf
eBISS
Radwa El Shawi, Sherif Sakr
2019 J jnl
Clust. Comput.
Ahmed Barnawi, Ahmed Awad, Amal Elgammal, Radwa El Shawi, Abduallah Almalaise, Sherif Sakr
2019 conf
BigData Congress
Nesma Mahmoud, Youssef Essam, Radwa El Shawi, Sherif Sakr
2019 C conf
ADBIS
Radwa El Shawi, Youssef Sherif, Mouaz H. Al-Mallah, Sherif Sakr
2019 B conf
CBMS
Radwa El Shawi, Youssef Sherif, Mouaz H. Al-Mallah, Sherif Sakr
2019 J jnl
BMC Medical Informatics Decis. Mak.
Radwa El Shawi, Mouaz H. Al-Mallah, Sherif Sakr
2018 J jnl
Big Data Res.
Radwa El Shawi, Sherif Sakr, Domenico Talia, Paolo Trunfio
2018 J jnl
Clust. Comput.
Omar Batarfi, Radwa El Shawi, Ayman G. Fayoumi, Reza Nouri, Amin Beheshti, Ahmed Barnawi, Sherif Sakr
2017 J jnl
CoRR
Radwa El Shawi, Sherif Sakr
2017 J jnl
BMC Medical Informatics Decis. Mak.
Sherif Sakr, Radwa El Shawi, Amjad M. Ahmed, Waqas T. Qureshi, Clinton A. Brawner, Steven J. Keteyian, Michael J. Blaha, Mouaz H. Al-Mallah
2016 J jnl
J. Grid Comput.
Fuad Bajaber, Radwa El Shawi, Omar Batarfi, Abdulrahman H. Altalhi, Ahmed Barnawi, Sherif Sakr
2015 conf
BPM (Demos)
Ahmed Barnawi, Ahmed Awad, Amal Elgammal, Radwa El Shawi, Abduallah Almalaise, Sherif Sakr
2015 conf
BigDataService
Radwa El Shawi, Omar Batarfi, Ayman G. Fayoumi, Ahmed Barnawi, Sherif Sakr
2015 J jnl
Clust. Comput.
Omar Batarfi, Radwa El Shawi, Ayman G. Fayoumi, Reza Nouri, Amin Beheshti, Ahmed Barnawi, Sherif Sakr
2015 Misc conf
SAC
Ahmed Awad, Ahmed Barnawi, Amal Elgammal, Radwa El Shawi, Abduallah Almalaise, Sherif Sakr
2015 J jnl
Clust. Comput.
Ahmed Barnawi, Ahmed Awad, Amal Elgammal, Radwa El Shawi, Abduallah Almalaise, Sherif Sakr
2014 J jnl
Theor. Comput. Sci.
Otfried Cheong, Radwa El Shawi, Joachim Gudmundsson
2014 ch.
Large Scale and Big Data
Radwa El Shawi, Sherif Sakr
2014 conf
TPCTC
Ahmed Barnawi, Omar Batarfi, Amin Beheshti, Radwa El Shawi, Ayman G. Fayoumi, Reza Nouri, Sherif Sakr
2014 J jnl
Comput. Geom.
Radwa El Shawi, Joachim Gudmundsson, Christos Levcopoulos
2013 Misc conf
COCOON
Otfried Cheong, Radwa El Shawi, Joachim Gudmundsson
2013 J jnl
Theor. Comput. Sci.
Radwa El Shawi, Joachim Gudmundsson
2012 conf
CATS
Radwa El Shawi, Joachim Gudmundsson, Christos Levcopoulos
2011 C conf
COCOA
Radwa El Shawi, Joachim Gudmundsson
2011 ch.
Graph Data Management
Radwa El Shawi, Joachim Gudmundsson
2010 J jnl
CoRR
Radwa El Shawi, Joachim Gudmundsson, Christos Levcopoulos
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 == []