K. Chandrasekaran

89 papers C 5Misc 3Journal 33Unranked 48
YearRankTypeTitle / Venue / Authors
2025 Misc conf
COMSNETS
Prasanna Kumar, Sushma S. A, K. Chandrasekaran, Sourav Kanti Addya
2024 J jnl
IEEE Geosci. Remote. Sens. Lett.
Bhavesh Varma, Naik Nitesh Navnath, K. Chandrasekaran, M. Venkatesan, Jeny Rajan
2024 C conf
PDP
K. Chandrasekaran, A. Kandasamy, Venkatesan M, Prabhavathi P, M. Gokuldhev, Aishwarya C
2023 J jnl
IEEE Trans. Comput. Soc. Syst.
Christina Terese Joseph, John Paul Martin, K. Chandrasekaran, S. P. Raja
2022 conf
ICCCNT
Ramya Shree, Suraj B. Madagaonkar, Mansi Singh, M. T. Aakash Chandra, Rathnamma V. Mydukuri, V. Venkata Ramana, K. Chandrasekaran
2022 J jnl
J. Membr. Comput.
S. Raghavan, K. Chandrasekaran
2022 J jnl
CoRR
Kowndinya Boyalakuntla, C. Marimuthu, Sridhar Chimalakonda, K. Chandrasekaran
2022 conf
ESEC/SIGSOFT FSE
Kowndinya Boyalakuntla, Marimuthu Chinnakali, Sridhar Chimalakonda, K. Chandrasekaran
2021 conf
MIND
Naik Nitesh Navnath, K. Chandrasekaran, Venkatesan Meenakshi Sundaram, Prabhavathy Panneer
2021 conf
BDET
Vignesh Srinivasan, K. Chandrasekaran
2021 J jnl
ACM Comput. Surv.
C. Marimuthu, K. Chandrasekaran, Sridhar Chimalakonda
2021 J jnl
Neurocomputing
Parth Sahu, S. Raghavan, K. Chandrasekaran
2021 J jnl
Softw. Pract. Exp.
Marimuthu Chinnakali, Sridhar Chimalakonda, K. Chandrasekaran
2021 conf
BLOCKCHAIN
John Paul Martin, Christina Terese Joseph, K. Chandrasekaran, A. Kandasamy
2021 J jnl
Inf. Sci.
S. Raghavan, K. Chandrasekaran
2021 J jnl
Int. J. Grid High Perform. Comput.
P. Sarwesh, K. Chandrasekaran, Thamizharasan S.
2021 conf
ICCCNT
Soumyajit Bhattacharyya, K. Chandrasekaran
2021 Misc conf
SAC
Paras Bhagtya, S. Raghavan, K. Chandrasekaran, Usha D.
2020 J jnl
Softw. Pract. Exp.
John Paul Martin, A. Kandasamy, K. Chandrasekaran
2020 conf
ICCCS
P. Y. Abhinav, Avakash Bhat, Christina Terese Joseph, K. Chandrasekaran
2020 J jnl
Biosyst.
S. Raghavan, Shanthanu S. Rai, Rohit M. P, K. Chandrasekaran
2020 J jnl
J. Syst. Archit.
Christina Terese Joseph, K. Chandrasekaran
2020 J jnl
J. Ambient Intell. Humaniz. Comput.
John Paul Martin, A. Kandasamy, K. Chandrasekaran
2020 J jnl
Biosyst.
S. Raghavan, Yashas Gangadhar, Varun Pattar, K. Chandrasekaran
2020 J jnl
IET Softw.
Marimuthu Chinnakali, Sanjana Palisetti, K. Chandrasekaran
2019 C conf
SEKE
C. Marimuthu, Sanjana Palisetti, K. Chandrasekaran
2019 conf
CISIM
K. S. Sagar Bharadwaj, Samvid Dharanikota, Adarsh Honawad, K. Chandrasekaran
2019 conf
KMO
Amit V. Nene, Christina Terese Joseph, K. Chandrasekaran
2019 J jnl
Int. J. Commun. Syst.
John Paul Martin, A. Kandasamy, K. Chandrasekaran, Christina Terese Joseph
2019 C conf
TENCON
Christina Terese Joseph, John Paul Martin, K. Chandrasekaran, A. Kandasamy
2019 C conf
TENCON
Chandan Naik, M. Siddhartha, John Paul Martin, K. Chandrasekaran
2019 J jnl
Softw. Pract. Exp.
Christina Terese Joseph, K. Chandrasekaran
2018 conf
KMO
Manoj V. Thomas, K. Chandrasekaran, Gopal Mugeraya
2018 conf
SocProS (2)
Gautam Ramakrishnan, V. Saicharan, K. Chandrasekaran, Rathnamma V. Mydukuri, V. Venkata Ramana
2018 J jnl
Phys. Commun.
P. Sarwesh, N. S. V. Shet, K. Chandrasekaran
2018 J jnl
Hum. centric Comput. Inf. Sci.
John Paul Martin, A. Kandasamy, K. Chandrasekaran
2018 conf
ICACCI
Natasha Yogananda Jeppu, K. Chandrasekaran
2018 conf
ICACCI
Akarsh Murali, Nibir Nirjas Das, Shiv Shankar Sukumaran, K. Chandrasekaran, Christina Terese Joseph, John Paul Martin
2018 conf
SSCI
H. L. Praveen Raj, K. Chandrasekaran
2018 conf
SSCC
K. Rithesh, Adwaith V. Gautham, K. Chandrasekaran
2017 conf
SocProS (2)
B. Shiva Prakash, K. V. Sanjeev, Ramesh Prakash, K. Chandrasekaran
2017 Misc conf
COMSNETS
Jayashree Mohan, Angad Vittal, K. Chandrasekaran, Bhaskar Krishnamachari
2017 conf
KMO
Kandiraju Sai Ashritha, T. M. Prajwala, K. Chandrasekaran
2017 J jnl
Int. J. Model. Simul. Sci. Comput.
Manoj V. Thomas, K. Chandrasekaran
2017 J jnl
Int. J. Grid High Perform. Comput.
P. Sarwesh, N. S. V. Shet, K. Chandrasekaran
2017 conf
ISEC
C. Marimuthu, K. Chandrasekaran
2017 conf
SPLC (A)
C. Marimuthu, K. Chandrasekaran
2017 conf
ICCCT
S. R. Shishira, A. Kandasamy, K. Chandrasekaran
2016 conf
KMO
Ankit Tripathi, Anant Maheshwari, K. Chandrasekaran
2016 conf
ICTCS
V. Thangam, K. Chandrasekaran
2016 conf
SSCC
V. Thangam, K. Chandrasekaran
2016 J jnl
Int. J. Cloud Appl. Comput.
Usha Divakarla, K. Chandrasekaran
2016 conf
iThings/GreenCom/CPSCom/SmartData
C. Marimuthu, K. Chandrasekaran
2016 conf
RAIT
C. Karthik, Mayank Sharma, Kirti Maurya, K. Chandrasekaran
2016 conf
ICACCI
Y. R. Mukund, Sunil S. Nayak, K. Chandrasekaran
2016 conf
KMO
Y. R. Mukund, V. Naresh, Sourabh Patil, K. Chandrasekaran, V. Vijaya Kumar, Ramaswamy Kannan Gnanamurthy
2016 conf
ICIA
Neenu George, K. Chandrasekaran, A. Binu
2016 conf
ICACCI
S. R. Shishira, A. Kandasamy, K. Chandrasekaran
2016 conf
BIC-TA (1)
S. Raghavan, K. Chandrasekaran
2016 conf
ICTCS
Sreecharan Sankaranarayanan, Dayanand Ingale, Ranveer Bhambhu, K. Chandrasekaran
2016 conf
ICC 2016
Amita Ajith Kamath, Chirag Jamadagni, K. Chandrasekaran
2015 J jnl
Open J. Cloud Comput.
Manoj V. Thomas, K. Chandrasekaran
2015 conf
ICACCI
Doshi Chintan Ketankumar, K. Chandrasekaran
2015 J jnl
Open J. Big Data
Prasad Teli, Manoj V. Thomas, K. Chandrasekaran
2015 J jnl
Unmanned Syst.
Muni Venkateswarlu K., A. Kandasamy, K. Chandrasekaran
2015 conf
ITNG
Gaurav Verma, Arun Nandewal, K. Chandrasekaran
2015 J jnl
Open J. Big Data
Y. R. Mukund, Sunil S. Nayak, K. Chandrasekaran
2015 conf
SSCC
Sachin Hosmani, H. G. Rama Bhat, K. Chandrasekaran
2015 J jnl
Int. J. Green Comput.
Akshay Atul Deshmukh, Mintu Jothish, K. Chandrasekaran
2015 conf
WCI
Nimisha Sharath, Shivani S. Parikh, K. Chandrasekaran
2015 conf
iNIS
Aditya Sundaram, Monel Gupta, Vinod Rathod, K. Chandrasekaran
2015 J jnl
Soc. Netw. Anal. Min.
Pranav Thulasiram Bhat, Rohit Varkey Thankachan, K. Chandrasekaran
2015 conf
WCI
Shruthi Puranik, Jayashree Mohan, K. Chandrasekaran
2015 J jnl
Int. J. Trust. Manag. Comput. Commun.
V. Geetha, K. Chandrasekaran
2014 conf
ICACCI
Christina Terese Joseph, K. Chandrasekaran, Robin Cyriac
2014 J jnl
Int. J. Trust. Manag. Comput. Commun.
Manoj V. Thomas, K. Chandrasekaran
2014 C conf
FedCSIS
K. Chandrasekaran, Siddharth Santurkar, Abhishek Arora
2013 conf
ICACCI
Manoj V. Thomas, K. Chandrasekaran
2013 conf
ADCONS
Manoj V. Thomas, K. Chandrasekaran
2013 conf
ICACCI
Muni Venkateswarlu K., A. Kandasamy, K. Chandrasekaran
2013 conf
ADCONS
V. Spoorthi, Balaji Rajendran, K. Chandrasekaran
2011 conf
ADCONS
Muni Venkateswarlu K., K. Chandrasekaran, A. Kandasamy
2010 conf
BIONETICS
Rio G. L. D'Souza, K. Chandrasekaran, A. Kandasamy
2010 conf
BIONETICS
Rio G. L. D'Souza, K. Chandrasekaran, A. Kandasamy
2010 conf
IC3 (1)
Rio G. L. D'Souza, K. Chandrasekaran, A. Kandasamy
2010 J jnl
CoRR
N. S. V. Shet, K. Chandrasekaran, K. C. Shet
2010 J jnl
CoRR
N. S. V. Shet, K. Chandrasekaran, K. C. Shet
2010 J jnl
CoRR
Rio G. L. D'Souza, K. Chandrasekaran, A. Kandasamy
2010 conf
ICT
Rio G. L. D'Souza, K. Chandrasekaran, A. Kandasamy
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"