Vaidyanathan K. Jayaraman

21 papers Journal 11Unranked 9
YearRankTypeTitle / Venue / Authors
2012 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Shaini Joseph, Shreyas Karnik, Pravin Nilawe, Vaidyanathan K. Jayaraman, Susan Idicula-Thomas
2012 conf
SEMCCO
Shameek Ghosh, Nayana Ramachandran, C. Venkateshwari, Vaidyanathan K. Jayaraman
2012 conf
BIC-TA (1)
Atulji Srivastava, Saurabh Chakrabarti, Subrata Das, Shameek Ghosh, Vaidyanathan K. Jayaraman
2012 conf
SocProS
Manish Kumar, Srikant Jayaraman, Shikha Bhat, Shameek Ghosh, Vaidyanathan K. Jayaraman
2010 J jnl
Nucleic Acids Res.
Shaini Thomas, Shreyas Karnik, Ram Shankar Barai, Vaidyanathan K. Jayaraman, Susan Idicula-Thomas
2010 J jnl
Int. J. Funct. Informatics Pers. Medicine
Aniruddha J. Joshi, Sharat Chandran, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2009 conf
BIBM
Aniruddha J. Joshi, Sharat Chandran, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2009 conf
PReMI
Shreyas Karnik, Ajay Prasad, Alok Diwevedi, V. Sundararajan, Vaidyanathan K. Jayaraman
2009 conf
PReMI
Shreyas Karnik, Joydeep Mitra, Arunima Singh, Bhaskar D. Kulkarni, V. Sundarajan, Vaidyanathan K. Jayaraman
2007 conf
PReMI
Rajshekhar, Ankur Gupta, Amar Nath Samanta, Bhaskar D. Kulkarni, Vaidyanathan K. Jayaraman
2007 ch.
Analysis of Biological Data: A Soft Computing Approach
Ankur Gupta, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2007 conf
PReMI
Pankaj Kumar, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2005 J jnl
Pattern Recognit.
Rajiv Kumar, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2005 conf
PReMI
Aniruddha J. Joshi, Rajshekhar, Sharat Chandran, Sanjay Phadke, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2005 J jnl
Comput. Chem. Eng.
Abhijit J. Kulkarni, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2004 J jnl
Comput. Chem. Eng.
P. S. Shelokar, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2004 J jnl
Comput. Chem. Eng.
Abhijit J. Kulkarni, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2004 J jnl
Pattern Recognit. Lett.
Rajiv Kumar, Abhijit J. Kulkarni, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2003 J jnl
J. Heuristics
J. Rajesh, Kapil Gupta, Hari Shankar Kusumakar, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
2001 J jnl
Comput. Chem.
J. Rajesh, Kapil Gupta, Hari Shankar Kusumakar, Vaidyanathan K. Jayaraman, Bhaskar D. Kulkarni
1995 J jnl
Comput. Oper. Res.
Vaidyanathan K. Jayaraman, Rajesh Srivastava
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"