Vibhu Saujanya Sharma

74 papers A* 9A 4B 4C 4Journal 11Unranked 42
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Priyavanshi Pathania, Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Tiffani Nevels, Sanjay Podder, Adam P. Burden
2025 J jnl
CoRR
Rohit Mehra, Priyavanshi Pathania, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2025 conf
GREENS@ICSE
Samarth Sikand, Rohit Mehra, Priyavanshi Pathania, Nikhil Bamby, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2025 J jnl
CoRR
Samarth Sikand, Rohit Mehra, Priyavanshi Pathania, Nikhil Bamby, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2025 conf
GREENS@ICSE
Priyavanshi Pathania, Nikhil Bamby, Rohit Mehra, Samarth Sikand, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2025 J jnl
CoRR
Priyavanshi Pathania, Nikhil Bamby, Rohit Mehra, Samarth Sikand, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2025 J jnl
CoRR
Samarth Sikand, Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2025 J jnl
CoRR
Priyavanshi Pathania, Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2025 J jnl
CoRR
Rajrupa Chattaraj, Sridhar Chimalakonda, Vibhu Saujanya Sharma, Vikrant Kaulgud
2025 conf
ISEC
Raveendra Kumar Medicherla, Asha Rajbhoj, Manasi Patwardhan, Lalit Mohan Sanagavarapu, Vibhu Saujanya Sharma, Ravindra Naik, Pooja Aggarwal
2024 conf
RAIE@ICSE
Samarth Sikand, Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2024 conf
ISEC
Samarth Sikand, Kanchanjot Kaur Phokela, Vibhu Saujanya Sharma, Kapil Singi, Vikrant Kaulgud, Teresa Tung, Pragya Sharma, Adam P. Burden
2024 conf
ICSA-C
Priyavanshi Pathania, Rohit Mehra, Samarth Sikand, Vibhu Saujanya Sharma, Vikrant Kaulgud, Nikhil Bamby, Sanjay Podder, Adam P. Burden
2023 A* conf
ASE
Rohit Mehra, Priyavanshi Pathania, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2023 conf
ESEC/SIGSOFT FSE
Shriram Shanbhag, Sridhar Chimalakonda, Vibhu Saujanya Sharma, Vikrant Kaulgud
2023 A* conf
ASE
Samarth Sikand, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder
2023 A* conf
ASE
Kanchanjot Kaur Phokela, Samarth Sikand, Kapil Singi, Kuntal Dey, Vibhu Saujanya Sharma, Vikrant Kaulgud
2023 A* conf
ASE
Samdyuti Suri, Sankar Narayan Das, Kapil Singi, Kuntal Dey, Vibhu Saujanya Sharma, Vikrant Kaulgud
2023 conf
GREENS@ICSE
Samdyuti Suri, Sankar Narayan Das, Kuntal Dey, Kapil Singi, Vibhu Saujanya Sharma, Vikrant Kaulgud
2023 A* conf
ASE
Priyavanshi Pathania, Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2022 A* conf
ASE
Priyavanshi Pathania, Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2022 J jnl
CoRR
Priyavanshi Pathania, Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2022 A conf
EASE
Shriram Shanbhag, Sridhar Chimalakonda, Vibhu Saujanya Sharma, Vikrant Kaulgud
2022 conf
ICSE (SEIP)
Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2022 J jnl
CoRR
Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2022 A conf
ICSME
Shriram Shanbhag, Sridhar Chimalakonda, Vibhu Saujanya Sharma, Vikrant Kaulgud
2021 conf
ASE Workshops
Paul Walsh, Jhilam Bera, Vibhu Saujanya Sharma, Vikrant Kaulgud, Raghotham M. Rao, Orlaith Ross
2020 conf
ICSE (Workshops)
Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2020 conf
VR Workshops
Vibhu Saujanya Sharma, Rohit Mehra, Vikrant Kaulgud, Sanjay Podder
2020 A* conf
ASE
Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder, Adam P. Burden
2019 A* conf
ASE
Vibhu Saujanya Sharma, Rohit Mehra, Sanjay Podder, Adam P. Burden
2019 conf
BotSE@ICSE
Vibhu Saujanya Sharma, Rohit Mehra, Vikrant Kaulgud, Sanjay Podder
2019 conf
CHASE@ICSE
Vibhu Saujanya Sharma, Rohit Mehra, Vikrant Kaulgud, Sanjay Podder
2019 B conf
VRST
Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder
2019 C conf
ICGSE
Vibhu Saujanya Sharma, Rohit Mehra, Vikrant Kaulgud, Sanjay Podder
2019 conf
SEmotion@ICSE
Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder
2019 A* conf
ASE
Rohit Mehra, Vibhu Saujanya Sharma, Vikrant Kaulgud, Sanjay Podder
2018 conf
ICSE (NIER)
Vibhu Saujanya Sharma, Rohit Mehra, Vikrant Kaulgud, Sanjay Podder
2017 conf
RCoSE@ICSE
Poulami Debnath, Vibhu Saujanya Sharma, Vikrant Kaulgud
2017 conf
RCoSE@ICSE
Kapil Singi, Vikrant Kaulgud, Vibhu Saujanya Sharma, Neville Dubash, Sanjay Podder
2017 conf
CHASE@ICSE
Vibhu Saujanya Sharma, Rohit Mehra, Vikrant Kaulgud
2016 conf
GAS@ICSE
Vibhu Saujanya Sharma, Vikrant S. Kaulgud, Pradeepkumar Duraisamy
2016 C conf
ICGSE
Vibhu Saujanya Sharma, Vikrant S. Kaulgud
2016 conf
ISEC
Amitabh Saxena, Pradeepkumar Duraisamy Soundrapandian, Vibhu Saujanya Sharma, Vikrant S. Kaulgud
2016 conf
CSED@ICSE
Vikrant Kaulgud, Amitabh Saxena, Sanjay Podder, Vibhu Saujanya Sharma, Chethana Dinakar
2015 B conf
CLOUD
Poulami Debnath, Vibhu Saujanya Sharma, Vikrant S. Kaulgud
2015 conf
ASE Workshops
Vibhu Saujanya Sharma, Vikrant S. Kaulgud
2015 C conf
APSEC
Amitabh Saxena, Vikrant S. Kaulgud, Vibhu Saujanya Sharma
2015 conf
ASE Workshops
Vikrant S. Kaulgud, Vibhu Saujanya Sharma
2014 conf
TwinPeaks
Vibhu Saujanya Sharma, Roshni R. Ramnani, Shubhashis Sengupta
2014 conf
IEEE SCC
Vibhu Saujanya Sharma, Samit Anwer
2013 conf
WETSoM
Vibhu Saujanya Sharma, Vikrant S. Kaulgud
2013 conf
WETSoM
Vikrant S. Kaulgud, Vibhu Saujanya Sharma
2013 conf
CloudCom (1)
Vibhu Saujanya Sharma, Samit Anwer
2013 conf
CloudCom (1)
Vibhu Saujanya Sharma, Aravindan Santharam
2013 conf
IEEE CLOUD
Vibhu Saujanya Sharma, Shubhashis Sengupta, Satish Nagasamudram
2012 conf
SC Companion
Vibhor Aggarwal, Shubhashis Sengupta, Vibhu Saujanya Sharma, Aravindan Santharam
2012 conf
ISEC
Santonu Sarkar, Vibhu Saujanya Sharma, Rajiv Agarwal
2012 conf
WETSoM
Vibhu Saujanya Sharma, Vikrant S. Kaulgud
2012 conf
IEEE CLOUD
Vibhu Saujanya Sharma, Shubhashis Sengupta, K. M. Annervaz
2011 B conf
SERVICES
Shubhashis Sengupta, Vikrant S. Kaulgud, Vibhu Saujanya Sharma
2011 conf
WETSoM
Vikrant S. Kaulgud, Vibhu Saujanya Sharma
2011 B conf
CHASE
Vibhu Saujanya Sharma, Vikrant S. Kaulgud
2010 conf
ISEC
Subhajit Datta, Vikrant S. Kaulgud, Vibhu Saujanya Sharma, Nishant Kumar
2009 C conf
APSEC
Vibhu Saujanya Sharma, Santonu Sarkar, Kunal Verma, Arun Panayappan, Alex Kass
2008 conf
CBSE
Vibhu Saujanya Sharma, Pankaj Jalote
2007 J jnl
ACM Trans. Softw. Eng. Methodol.
Pankaj Jalote, Brendan Murphy, Vibhu Saujanya Sharma
2007 J jnl
J. Syst. Softw.
Vibhu Saujanya Sharma, Kishor S. Trivedi
2006 conf
ICIT
Ash Mohammad Abbas, Vibhu Saujanya Sharma, Anoop Jain
2006 conf
COMPSAC (1)
Vibhu Saujanya Sharma, Pankaj Jalote, Kishor S. Trivedi
2006 A conf
ISSRE
Vibhu Saujanya Sharma, Kishor S. Trivedi
2006 A conf
ISSRE
Vibhu Saujanya Sharma, Pankaj Jalote
2005 conf
WOSP
Vibhu Saujanya Sharma, Kishor S. Trivedi
2005 conf
CBSE
Vibhu Saujanya Sharma, Pankaj Jalote, Kishor S. Trivedi
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"