James M. Noras

41 papers B 6C 9Misc 1Journal 15Unranked 10
YearRankTypeTitle / Venue / Authors
2022 J jnl
IEEE Trans. Green Commun. Netw.
Yasir Ismael Abdulraheem Al-Yasir, Ahmed Maan Abdulkhaleq, Naser Ojaroudi Parchin, Issa T. E. Elfergani, Jonathan Rodriguez, James M. Noras, Raed A. Abd-Alhameed, Ashwain Rayit, Rami Qahwaji
2020 J jnl
Telecommun. Syst.
Khalid W. Hameed, Nnabuike N. Eya, James M. Noras, Raed A. Abd-Alhameed
2019 conf
5G World Forum
Yasir Ismael Abdulraheem Al-Yasir, Naser Ojaroudi Parchin, Ali Alabdallah, Ahmed Maan Abdulkhaleq, Raed A. Abd-Alhameed, James M. Noras
2019 J jnl
Future Internet
Naser Ojaroudi Parchin, Haleh Jahanbakhsh Basherlou, Raed A. Abd-Alhameed, James M. Noras
2019 J jnl
IEEE Access
Naser Ojaroudi Parchin, Yasir Ismael Abdulraheem Al-Yasir, Ammar H. Ali, Issa T. E. Elfergani, James M. Noras, Jonathan Rodriguez, Raed A. Abd-Alhameed
2019 conf
5G World Forum
Naser Ojaroudi Parchin, Haleh Jahanbakhsh Basherlou, Yasir Ismael Abdulraheem Al-Yasir, Atta Ullah, Raed A. Abd-Alhameed, James M. Noras
2019 conf
5G World Forum
Ahmed Maan Abdulkhaleq, Maan A. Yahya, Jack Brunning, Yasir Al-Yasir, Naser Ojaroudi Parchin, Ashwain Rayit, Raed A. Abd-Alhameed, James M. Noras
2019 conf
5G World Forum
Naser Ojaroudi Parchin, Yasir Ismael Abdulraheem Al-Yasir, Haleh Jahanbakhsh Basherlou, Ahmed Maan Abdulkhaleq, Maryam Sajedin, Raed A. Abd-Alhameed, James M. Noras
2019 J jnl
Sensors
Naser Ojaroudi Parchin, Haleh Jahanbakhsh Basherlou, Yasir Ismael Abdulraheem Al-Yasir, Atta Ullah, Raed A. Abd-Alhameed, James M. Noras
2019 J jnl
IEEE Access
George A. Oguntala, Raed A. Abd-Alhameed, Nazar T. Ali, Yim-Fun Hu, James M. Noras, Nnabuike N. Eya, Issa T. E. Elfergani, Jonathan Rodriguez
2018 C conf
BROADNETS
Ahmed Maan Abdulkhaleq, Yasir Al-Yasir, Naser Ojaroudi Parchin, Jack Brunning, Neil J. McEwan, Ashwain Rayit, Raed A. Abd-Alhameed, James M. Noras, Nabeel Abduljabbar
2018 C conf
WINCOM
Mohammed A. G. Al-Sadoon, A. Zweid, Rameez Asif, Mohammed S. Bin-Melha, Nabeel Abduljabbar, James M. Noras, R. A. Abd-Alhameed
2018 C conf
BROADNETS
Mohammed A. G. Al-Sadoon, N. A. Abduljabbar, Nazar T. Ali, Rameez Asif, A. Zweid, Haru Alhassan, James M. Noras, R. A. Abd-Alhameed
2018 C conf
BROADNETS
Yasir Ismael Abdulraheem Al-Yasir, Naser Ojaroudi Parchin, Issa T. E. Elfergani, Raed A. Abd-Alhameed, James M. Noras, Jonathan Rodriguez, Amar Al-jzari, Waleed I. Hammed
2018 C conf
BROADNETS
Naser Ojaroudi Parchin, Yasir Al-Yasir, Ahmed Maan Abdulkhaleq, Issa T. E. Elfergani, Ashwain Rayit, James M. Noras, Jonathan Rodriguez, Raed A. Abd-Alhameed
2018 J jnl
IEEE Access
Adel Y. I. Ashyap, Zuhairiah Zainal Abidin, Samsul Haimi Dahlan, Huda A. Majid, Muhammad Ramlee Kamarudin, Akram Alomainy, Raed A. Abd-Alhameed, Jamal Sulieman Kosha, James M. Noras
2018 J jnl
Comput. Sci. Rev.
George A. Oguntala, Raed Abd-Alhameed, Stephen M. R. Jones, James M. Noras, Mohammad N. Patwary, Jonathan Rodriguez
2018 J jnl
IEEE Access
Adel Y. I. Ashyap, Zuhairiah Zainal Abidin, Samsul Haimi Dahlan, Huda A. Majid, Waddah A. M. A., Muhammad Ramlee Kamarudin, George A. Oguntala, Raed A. Abd-Alhameed, James M. Noras
2018 C conf
WINCOM
Mohammed A. G. Al-Sadoon, Rameez Asif, Mohammed S. Bin-Melha, Huthaifa A. Obeidat, A. Zweid, James M. Noras, R. A. Abd-Alhameed
2018 B conf
IWCMC
Khalid W. Hameed, James M. Noras, Ayman Radwan, Fadi Al-Turjman, Jonathan Rodriguez, Raed A. Abd-Alhameed
2018 C conf
BROADNETS
Khalid W. Hameed, Ahmed Maan Abdulkhaleq, Yasir Al-Yasir, Naser Ojaroudi Parchin, Ashwain Rayit, Majid Al Khambashi, Raed A. Abd-Alhameed, James M. Noras
2017 J jnl
Sensors
Mohammed A. G. Al-Sadoon, Nazar T. Ali, Yousif A. Dama, Abdulkareim Zuid, Stephen M. R. Jones, Raed A. Abd-Alhameed, James M. Noras
2017 B conf
IWCMC
George A. Oguntala, Raed A. Abd-Alhameed, Stephen M. R. Jones, James M. Noras
2016 J jnl
Signal Image Video Process.
Adeel Ahmed, Yim-Fun Hu, James M. Noras, Prashant Pillai
2016 conf
SMACD
H. J. Mohammed, F. Abdulsalam, A. S. Abdulla, Ramzy S. Ali, R. A. Abd-Alhameed, James M. Noras, Yasir Ismael Abdulraheem Al-Yasir, A. Ali, Jonathan Rodriguez, Abdelgader M. Abdalla
2016 conf
WISATS
Mohammed A. G. Al-Sadoon, Abdulkareem S. Abdullah, Ramzy S. Ali, Ali A. S. Alabdullah, Raed A. Abd-Alhameed, Steve M. R. Jones, James M. Noras
2016 J jnl
Digit. Commun. Networks
Mohammad N. Patwary, Shree Krishna Sharma, Symeon Chatzinotas, Yunfei Chen, Mohamed Abdel-Maguid, Raed Abd-Alhameed, James M. Noras, Björn E. Ottersten
2015 conf
CIT/IUCC/DASC/PICom
A. F. Mirza, F. Abdulsalam, Rameez Asif, Y. A. S. Dama, M. M. Abusitta, Fauzi Elmegri, Raed A. Abd-Alhameed, James M. Noras, Rami Qahwaji
2015 conf
CIT/IUCC/DASC/PICom
H. S. O. Migdadi, Huthaifa A. Obeidat, Kelvin O. O. Anoh, N. N. Khatib, James M. Noras, Rami Qahwaji, Raed A. Abd-Alhameed
2015 C conf
WOWMOM
Adeel Ahmed, Yim-Fun Hu, James M. Noras, Prashant Pillai
2012 conf
TEMU
Rameez Asif, Raed A. Abd-Alhameed, Ogbonnaya O. Anoh, Yousif A. Dama, H. S. O. Migdadi, James M. Noras, Abubakar Sadiq Hussaini, Jonathan Rodriguez
2007 J jnl
Signal Process.
Yuan Zhou, James M. Noras, Simon J. Shepherd
2004 J jnl
Signal Process.
Costas Chaikalis, James M. Noras
2003 B conf
WCNC
Costas Chaikalis, James M. Noras, Felip Riera-Palou
2002 Misc conf
ICASSP
Felip Riera-Palou, James M. Noras, David G. M. Cruickshank
2002 B conf
PIMRC
Costas Chaikalis, Felip Riera-Palou, James M. Noras
1998 conf
ACCV (2)
William Booth, James M. Noras, Donglai Xu
1997 J jnl
J. Univers. Comput. Sci.
Jamaludin Omar, James M. Noras
1995 B conf
FPL
Fabio G. Guerrero, James M. Noras
1994 B conf
FPL
Ibrahim bin Mat, James M. Noras
1994 C conf
ISCAS
Michael F. Dossis, James M. Noras, Gary J. Porter
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 == []