Ishtiaq Rasool Khan

61 papers A 1B 5C 4Misc 1Journal 28Unranked 21
YearRankTypeTitle / Venue / Authors
2025 J jnl
J. Inf. Knowl. Manag.
Maryum Bibi, Wajid Aziz, Ishtiaq Rasool Khan, Malik Sajjad Ahmed Nadeem
2025 J jnl
Signal Image Video Process.
Naureen Mujtaba, Ishtiaq Rasool Khan, Nadeem Ahmad Khan, Muhammad Awais Bin Altaf
2024 J jnl
Signal Process. Image Commun.
Xueyu Han, Ishtiaq Rasool Khan, Susanto Rahardja
2024 J jnl
IEEE Trans. Multim.
Theyab A. Alotaibi, Ishtiaq Rasool Khan, Farid Bourennani
2024 J jnl
Comput. Biol. Medicine
Madini O. Alassafi, Wajid Aziz, Rayed AlGhamdi, Abdulrahman A. Alshdadi, Malik Sajjad Ahmed Nadeem, Ishtiaq Rasool Khan, Nabeel Albishry, Adel A. Bahaddad, Ali Altalbe
2023 J jnl
Signal Image Video Process.
Muhammad Waqar Mirza, Asif Siddiq, Ishtiaq Rasool Khan
2023 conf
BioCAS
Romil Imtiaz, Muhammad Waqar Mirza, Asif Siddiq, Muhammad Farooq-i-Azam, Ishtiaq Rasool Khan, Susanto Rahardja
2023 J jnl
Comput. Electr. Eng.
Muhammad Hamza Muneer, Muhammad Adeel Pasha, Ishtiaq Rasool Khan
2023 J jnl
Digit. Signal Process.
Xueyu Han, Ishtiaq Rasool Khan, Susanto Rahardja
2023 J jnl
IEEE Access
Muhammad Murtaza Khan, Muhammad U. Ilyas, Ishtiaq Rasool Khan, Saleh M. Alshomrani, Susanto Rahardja
2022 conf
SiPS
Naureen Mujtaba, Ishtiaq Rasool Khan, Nadeem Ahmad Khan, Muhammad Awais Bin Altaf
2022 C conf
MMSP
Naureen Mujtaba, Ishtiaq Rasool Khan, Nadeem Ahmad Khan, Muhammad Awais Bin Altaf
2022 J jnl
IEEE Trans. Image Process.
Ishtiaq Rasool Khan, Theyab A. Alotaibi, Asif Siddiq, Farid Bourennani
2022 J jnl
IEEE Trans. Consumer Electron.
Asif Siddiq, Jameel Ahmed, Ishtiaq Rasool Khan
2022 J jnl
Signal Image Video Process.
Asif Siddiq, Jameel Ahmed, Monagi H. Alkinani, Ishtiaq Rasool Khan
2022 C conf
MMSP
Abdul Rahman Quraishi, Salman Nadeem, Nadeem Ahmad Khan, Ishtiaq Rasool Khan
2021 C conf
MMSP
Theyab A. Alotaibi, Farid Bourennani, Ishtiaq Rasool Khan
2021 B conf
ICIP
Syed Talha Abid Ali, Abdul Hakeem Usama, Ishtiaq Rasool Khan, Muhammad Murtaza Khan, Asif Siddiq
2020 conf
SIGGRAPH Posters
Asif Siddiq, Jameel Ahmed, Ishtiaq Rasool Khan
2020 conf
APSIPA
Asif Siddiq, Ishtiaq Rasool Khan, Jameel Ahmed
2020 J jnl
IEEE Access
Muhammad Jawad, Malik Sajjad Ahmed Nadeem, Seong-O Shim, Ishtiaq Rasool Khan, Aliya Shaheen, Nazneen Habib, Lal Hussain, Wajid Aziz
2020 J jnl
IEEE Access
Ishtiaq Rasool Khan, Wajid Aziz, Seong-O Shim
2019 J jnl
IEEE Access
Gulraiz Iqbal Choudhary, Wajid Aziz, Ishtiaq Rasool Khan, Susanto Rahardja, Pasi Fränti
2019 J jnl
IEEE Access
Lal Hussain, Wajid Aziz, Abdulrahman A. Alshdadi, Malik Sajjad Ahmed Nadeem, Ishtiaq Rasool Khan, Qurat-ul-Ain Aini
2019 J jnl
IEEE Access
Maryum Bibi, Malik Sajjad Ahmed Nadeem, Imtiaz Hussain Khan, Seong-O Shim, Ishtiaq Rasool Khan, Uzma Naqvi, Wajid Aziz
2019 conf
SIGGRAPH Posters
Anam Mehmood, Ishtiaq Rasool Khan, Hassan Dawood, Hussain Dawood
2018 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Fidaa Abed, Ishtiaq Rasool Khan, Susanto Rahardja
2018 J jnl
IEEE Trans. Ind. Electron.
Ishtiaq Rasool Khan, Susanto Rahardja, Muhammad Murtaza Khan, Muhammad Mobeen Movania, Fidaa Abed
2018 conf
SIGGRAPH Posters
Jiangyan Han, Ishtiaq Rasool Khan, Susanto Rahardja
2017 conf
SIGGRAPH Asia Technical Briefs
Seong-O Shim, Ishtiaq Rasool Khan
2016 J jnl
Signal Image Video Process.
Ishtiaq Rasool Khan
2016 conf
SIGGRAPH Asia Posters
Ishtiaq Rasool Khan, Muhammad Murtaza Khan
2015 J jnl
J. Electronic Imaging
Ishtiaq Rasool Khan
2015 J jnl
Multim. Syst.
Ishtiaq Rasool Khan
2014 conf
SIGGRAPH Posters
Ishtiaq Rasool Khan
2013 J jnl
IEEE Trans. Multim.
Miaolong Yuan, Ishtiaq Rasool Khan, Farzam Farbiz, Susu Yao, Arthur Niswar, Min-Hui Foo
2012 conf
SIGGRAPH ASIA Posters
Miaolong Yuan, Ishtiaq Rasool Khan, Farzam Farbiz
2012 conf
SIGGRAPH ASIA Posters
Arthur Niswar, Ishtiaq Rasool Khan, Farzam Farbiz
2011 conf
VRCAI
Miaolong Yuan, Ishtiaq Rasool Khan, Farzam Farbiz, Arthur Niswar, Zhiyong Huang
2011 B conf
ICIP
Susu Yao, Ishtiaq Rasool Khan, Farzam Farbiz
2011 conf
VRCAI
Arthur Niswar, Ishtiaq Rasool Khan, Farzam Farbiz
2010 B conf
ICIP
Ishtiaq Rasool Khan, Farzam Farbiz
2010 conf
SIGGRAPH Posters
Ishtiaq Rasool Khan
2010 J jnl
Digit. Signal Process.
Ishtiaq Rasool Khan
2010 ch.
Brain-Inspired Information Technology
Ishtiaq Rasool Khan, Takashi Morie, Hiroyuki Miyamoto, Yasutaka Kuriya, Masaki Shimizu
2009 B conf
ICIP
Ishtiaq Rasool Khan, Masahiro Okuda
2009 conf
SIGGRAPH ASIA Art Gallery & Emerging Technologies
Susanto Rahardja, Farzam Farbiz, Corey Manders, Zhiyong Huang, Jamie Suat Ling Ng, Ishtiaq Rasool Khan, Ee Ping Ong, Peng Song
2009 conf
SIGGRAPH ASIA Sketches
Ishtiaq Rasool Khan, Zhiyong Huang, Farzam Farbiz, Corey Manders, Susanto Rahardja
2008 B conf
SMC
Ishtiaq Rasool Khan, Hiroyuki Miyamoto, Takashi Morie
2008 Misc conf
ICASSP
Ishtiaq Rasool Khan
2007 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Ishtiaq Rasool Khan, Masahiro Okuda
2007 J jnl
IEEE Signal Process. Lett.
Ishtiaq Rasool Khan, Masahiro Okuda
2007 conf
ICASSP (1)
Shin-ichiro Takahashi, Masaaki Ikehara, Ishtiaq Rasool Khan, Masahiro Okuda
2006 conf
ICASSP (3)
Ishtiaq Rasool Khan, Masahiro Okuda
2006 conf
AINA (2)
Masahiro Okuda, Ishtiaq Rasool Khan
2005 conf
ISCAS (4)
Ishtiaq Rasool Khan, Masahiro Okuda, Ryoji Ohba
2005 C conf
MMSP
Ishtiaq Rasool Khan, Masahiro Okuda
2004 A conf
ICME
Ishtiaq Rasool Khan, Masahiro Okuda, Shinichi Takahashi
2003 J jnl
EURASIP J. Adv. Signal Process.
Ishtiaq Rasool Khan, Ryoji Ohba
2003 conf
ISCAS (4)
Ishtiaq Rasool Khan, Masahiro Okuda, Ryoji Ohba
2001 J jnl
Int. J. Circuit Theory Appl.
Ishtiaq Rasool Khan, Ryoji Ohba
tests/unit/test_apk_jadx_wrapper.py
← Index tests/unit/test_apk_jadx_wrapper.py python
"""
Unit tests for JADX wrapper subprocess management and output parsing.

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

import pytest
from unittest.mock import MagicMock, patch, call

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


class TestJADXDecompiler:
    """Tests for JADXDecompiler subprocess wrapper."""

    @patch.dict(os.environ, {}, clear=False)
    def test_init_defaults(self):
        os.environ.pop("JADX_PATH", None)
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        assert j.jadx_path == "jadx"
        assert j.timeout == 300

    def test_init_custom_path(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler(jadx_path="/usr/local/bin/jadx", timeout=300)
        assert j.jadx_path == "/usr/local/bin/jadx"
        assert j.timeout == 300

    def test_init_from_env(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        with patch.dict(os.environ, {"JADX_PATH": "/opt/jadx/bin/jadx", "JADX_TIMEOUT": "120"}):
            j = JADXDecompiler()
            assert j.jadx_path == "/opt/jadx/bin/jadx"
            assert j.timeout == 120

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

        j = JADXDecompiler()
        result = j.decompile("/test.apk", "/output")
        assert result is True

    @patch("subprocess.Popen")
    def test_decompile_nonzero_exit_no_sources(self, mock_popen):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("", "error msg")
        mock_proc.returncode = 1
        mock_popen.return_value = mock_proc

        j = JADXDecompiler(log=MagicMock())
        result = j.decompile("/test.apk", "/nonexistent_output")
        assert result is False

    @patch("subprocess.Popen")
    def test_decompile_timeout(self, mock_popen):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        import subprocess
        mock_proc = MagicMock()
        mock_proc.communicate.side_effect = subprocess.TimeoutExpired(cmd="jadx", timeout=10)
        mock_proc.pid = 12345
        mock_popen.return_value = mock_proc

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

    @patch("subprocess.Popen", side_effect=FileNotFoundError)
    def test_decompile_not_found(self, mock_popen):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler(log=MagicMock())
        result = j.decompile("/test.apk", "/output")
        assert result is False

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

        j = JADXDecompiler(jadx_path="/opt/jadx")
        j.decompile("/test.apk", "/output")

        cmd = mock_popen.call_args[0][0]
        assert cmd[0] == "/opt/jadx"
        assert "--no-res" in cmd
        assert "--no-imports" in cmd
        assert "--threads-count" in cmd
        assert "/test.apk" in cmd

    def test_parse_java_methods_empty_dir(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        result = j.parse_java_methods("/nonexistent")
        assert result == {}

    def test_parse_java_methods_with_files(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        with tempfile.TemporaryDirectory() as tmpdir:
            sources_dir = os.path.join(tmpdir, "sources", "com", "example")
            os.makedirs(sources_dir)

            java_content = textwrap.dedent("""\
                package com.example;

                public class MyClass {
                    public void doStuff(int x) {
                        System.out.println(x);
                    }

                    private String getName() {
                        return "test";
                    }
                }
            """)
            with open(os.path.join(sources_dir, "MyClass.java"), "w") as f:
                f.write(java_content)

            j = JADXDecompiler()
            methods = j.parse_java_methods(tmpdir)
            assert len(methods) >= 1

    def test_extract_methods_from_java(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        source = textwrap.dedent("""\
            public void foo(int x) {
                if (x > 0) {
                    System.out.println(x);
                }
            }
        """)
        j = JADXDecompiler()
        methods = j._extract_methods_from_java(source, "com.example.Test")
        assert len(methods) == 1
        key = list(methods.keys())[0]
        assert "foo" in key

    def test_is_method_declaration_valid(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        result = j._is_method_declaration("    public void foo(int x) {")
        assert result is not None
        assert result[0] == "foo"

    def test_is_method_declaration_control_flow(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        # 'if', 'for', etc. should not be recognized as methods
        assert j._is_method_declaration("        if (x > 0) {") is None
        assert j._is_method_declaration("        for (int i = 0; i < 10; i++) {") is None

    def test_is_method_declaration_static(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        result = j._is_method_declaration("    public static void main(String[] args) {")
        assert result is not None
        assert result[0] == "main"