Vehbi C. Gungor

32 papers B 1Journal 24Unranked 6
YearRankTypeTitle / Venue / Authors
2021 conf
ICISDM
Fatih Coskun, Cengiz Gezer, Vehbi C. Gungor
2020 J jnl
Int. J. Commun. Syst.
Yasin Gormez, Zafer Aydin, Ramazan Karademir, Vehbi C. Gungor
2019 J jnl
Trans. Emerg. Telecommun. Technol.
Muhammad Faheem, Rizwan Aslam Butt, Basit Raza, Muhammad Waqar Ashraf, Seema Begum, Md. Asri Ngadi, Vehbi C. Gungor
2019 J jnl
Comput. Stand. Interfaces
Muhammad Faheem, Rizwan Aslam Butt, Basit Raza, Muhammad Waqar Ashraf, Md. Asri Ngadi, Vehbi C. Gungor
2018 J jnl
Int. J. Commun. Syst.
Melike Yigit, Huseyin Ugur Yildiz, Sinan Kurt, Bülent Tavli, Vehbi C. Gungor
2018 J jnl
Appl. Soft Comput.
Muhammad Faheem, Vehbi C. Gungor
2018 J jnl
Ad Hoc Networks
H. Emre Erdem, Vehbi C. Gungor
2018 J jnl
Comput. Sci. Rev.
Muhammad Faheem, Syed Bilal Hussain Shah, Rizwan Aslam Butt, Basit Raza, Muhammad Anwar, Muhammad Waqar Ashraf, Md. Asri Ngadi, Vehbi C. Gungor
2017 J jnl
Int. J. Commun. Syst.
Gurkan Tuna, Vehbi C. Gungor
2017 J jnl
Int. J. Commun. Syst.
Melike Yigit, Özlem Durmaz Incel, Selçuk Baktir, Vehbi C. Gungor
2017 J jnl
Comput. Commun.
Etimad A. Fadel, Muhammad Faheem, Vehbi C. Gungor, Laila Nassef, Nadine Akkari Adra, Muhammad Ghulam Abbas Malik, Suleiman Almasri, Ian F. Akyildiz
2016 J jnl
Comput. Stand. Interfaces
Bilal Erman Bilgin, Selçuk Baktir, Vehbi C. Gungor
2015 J jnl
Comput. Commun.
Etimad A. Fadel, Vehbi C. Gungor, Laila Nassef, Nadine Akkari, Muhammad Ghulam Abbas Malik, Suleiman Almasri, Ian F. Akyildiz
2012 conf
ICC
Ghalib A. Shah, Vehbi C. Gungor, Özgür B. Akan
2012 conf
NTMS
Gurkan Tuna, Kayhan Gulez, Tarik Veli Mumcu, Vehbi C. Gungor
2012 J jnl
Int. J. Distributed Sens. Networks
Vehbi C. Gungor, Mustafa Kemal Korkmaz
2011 J jnl
Ad Hoc Networks
Pinar Sarisaray Bölük, Vehbi C. Gungor, Sebnem Baydere, A. Emre Harmanci
2011 J jnl
IEEE Trans. Ind. Informatics
Vehbi C. Gungor, Dilan Sahin, Taskin Koçak, Salih Ergüt, Concettina Buccella, Carlo Cecati, Gerhard P. Hancke
2010 J jnl
IEEE Trans. Ind. Electron.
Vehbi C. Gungor, Bin Lu, Gerhard P. Hancke
2009 J jnl
IEEE Trans. Ind. Electron.
Vehbi C. Gungor, Gerhard P. Hancke
2009 J jnl
IEEE Trans. Ind. Electron.
Bin Lu, Vehbi C. Gungor
2008 J jnl
IEEE/ACM Trans. Netw.
Vehbi C. Gungor, Özgür B. Akan, Ian F. Akyildiz
2008 J jnl
Int. J. Sens. Networks
Vehbi C. Gungor
2007 J jnl
IEEE Trans. Mob. Comput.
Tommaso Melodia, Dario Pompili, Vehbi C. Gungor, Ian F. Akyildiz
2007 J jnl
Int. J. Commun. Syst.
Vehbi C. Gungor, Özgür B. Akan
2007 J jnl
Ad Hoc Networks
Vehbi C. Gungor, Mehmet C. Vuran, Özgür B. Akan
2007
Vehbi C. Gungor
2007 conf
ICC
Vehbi C. Gungor, Chellury Ram Sastry, Zhen Song, Ryan Integlia
2006 J jnl
Comput. Networks
Vehbi C. Gungor, Frank C. Lambert
2006 conf
ISCN
Vehbi C. Gungor, Özgür B. Akan
2006 conf
ICC
Dario Pompili, Caterina M. Scoglio, Vehbi C. Gungor
2005 B conf
MobiHoc
Tommaso Melodia, Dario Pompili, Vehbi C. Gungor, Ian F. Akyildiz
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"