Carl E. Busart

46 papers A 2B 4C 2Misc 4Journal 28Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Mohammad Saeid Anwar, Anuradha Ravi, Indrajeet Ghosh, Gaurav Shinde, Carl E. Busart, Nirmalya Roy
2025 J jnl
Trans. Mach. Learn. Res.
Peihong Yu, Manav Mishra, Alec Koppel, Carl E. Busart, Priya Narayan, Dinesh Manocha, Amrit Singh Bedi, Pratap Tokekar
2025 Misc conf
COMSNETS
Emon Dey, Anuradha Ravi, Jared Lewis, Vinay Krishna Kumar, Jade Freeman, Timothy Gregory, Niranjan Suri, Carl E. Busart, Nirmalya Roy
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Bingyi Zhang, Rajgopal Kannan, Carl E. Busart, Viktor K. Prasanna
2025 conf
L4DC
Kinjal Bhar, He Bai, Jemin George, Carl E. Busart
2025 J jnl
IEEE Trans. Parallel Distributed Syst.
Hongkuan Zhou, Bingyi Zhang, Rajgopal Kannan, Carl E. Busart, Viktor K. Prasanna
2024 Misc conf
FCCM
Dhruv Parikh, Shouyi Li, Bingyi Zhang, Rajgopal Kannan, Carl E. Busart, Viktor K. Prasanna
2024 J jnl
CoRR
Dhruv Parikh, Shouyi Li, Bingyi Zhang, Rajgopal Kannan, Carl E. Busart, Viktor K. Prasanna
2024 J jnl
CoRR
Peihong Yu, Manav Mishra, Alec Koppel, Carl E. Busart, Priya Narayan, Dinesh Manocha, Amrit S. Bedi, Pratap Tokekar
2024 J jnl
CoRR
Indranil Sur, Aswin Raghavan, Abrar Rahman, James Zachary Hare, Daniel N. Cassenti, Carl E. Busart
2024 Misc conf
FCCM
Bingyi Zhang, Rajgopal Kannan, Carl E. Busart, Viktor K. Prasanna
2024 J jnl
CoRR
Bingyi Zhang, Rajgopal Kannan, Carl E. Busart, Viktor K. Prasanna
2024 A conf
IROS
Chak Lam Shek, Xiyang Wu, Wesley A. Suttle, Carl E. Busart, Erin G. Zaroukian, Dinesh Manocha, Pratap Tokekar, Amrit Singh Bedi
2024 J jnl
CoRR
Sasindu Wijeratne, Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2024 J jnl
CoRR
Jumman Hossain, Emon Dey, Snehalraj Chugh, Masud Ahmed, MS Anwar, Abu Zaher Md Faridee, Jason Hoppes, Theron Trout, Anjon Basak, Rafidh Chowdhury, Rishabh Mistry, Hyun Kim, Jade Freeman, Niranjan Suri, Adrienne Raglin, Carl E. Busart, Timothy Gregory, Anuradha Ravi, Nirmalya Roy
2024 J jnl
CoRR
Tian Ye, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2024 J jnl
CoRR
Sachini Wickramasinghe, Dhruv Parikh, Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2024 J jnl
IEEE Trans. Parallel Distributed Syst.
Bingyi Zhang, Rajgopal Kannan, Carl E. Busart, Viktor K. Prasanna
2023 B conf
ICCCN
Emon Dey, Mikolaj Walczak, Mohammad Saeid Anwar, Nirmalya Roy, Jade Freeman, Timothy Gregory, Niranjan Suri, Carl E. Busart
2023 conf
HPEC
Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2023 J jnl
CoRR
Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2023 J jnl
CoRR
Kinjal Bhar, He Bai, Jemin George, Carl E. Busart
2023 conf
HPEC
Jacob Fein-Ashley, Tian Ye, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2023 J jnl
CoRR
Jacob Fein-Ashley, Tian Ye, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2023 J jnl
Autom.
Kinjal Bhar, He Bai, Jemin George, Carl E. Busart
2023 C conf
ICMLA
Md. Azim Khan, Nadeem Ahmed, Joyce Padela, Muhammad Shehrose Raza, Aryya Gangopadhyay, Jianwu Wang, James R. Foulds, Carl E. Busart, Robert F. Erbacher
2023 J jnl
CoRR
Bingyi Zhang, Sasindu Wijeratne, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2023 conf
HPEC
Dhruv Parikh, Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2023 J jnl
CoRR
Dhruv Parikh, Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2023 J jnl
CoRR
Tian Ye, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart, Lance M. Kaplan
2023 Misc conf
WSC
Wuxia Chen, Taposh Banerjee, Jemin George, Carl E. Busart
2023 J jnl
CoRR
Wuxia Chen, Taposh Banerjee, Jemin George, Carl E. Busart
2023 J jnl
IEEE Trans. Cloud Comput.
Xin Wang, Pei Guo, Xingyan Li, Aryya Gangopadhyay, Carl E. Busart, Jade Freeman, Jianwu Wang
2023 B conf
SMARTCOMP
Rohan Putatunda, Azim Khan, Aryya Gangopadhyay, Jianwu Wang, Carl E. Busart, Robert F. Erbacher
2022 B conf
FPL
Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2022 J jnl
CoRR
Xin Wang, Azim Khan, Jianwu Wang, Aryya Gangopadhyay, Carl E. Busart, Jade Freeman
2022 J jnl
Future Gener. Comput. Syst.
Xin Wang, Azim Khan, Jianwu Wang, Aryya Gangopadhyay, Carl E. Busart, Jade Freeman
2022 conf
CDC
Kinjal Bhar, He Bai, Jemin George, Carl E. Busart
2022 J jnl
CoRR
Kinjal Bhar, He Bai, Jemin George, Carl E. Busart
2022 A conf
IPDPS
Hongkuan Zhou, Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2022 J jnl
CoRR
Hongkuan Zhou, Bingyi Zhang, Rajgopal Kannan, Viktor K. Prasanna, Carl E. Busart
2022 C conf
ICMLA
Pretom Roy Ovi, Aryya Gangopadhyay, Robert F. Erbacher, Carl E. Busart
2022 B conf
DCOSS
Emon Dey, Jumman Hossain, Nirmalya Roy, Carl E. Busart
2022 J jnl
CoRR
Emon Dey, Jumman Hossain, Nirmalya Roy, Carl E. Busart
2021 conf
CDC
He Bai, Kinjal Bhar, Jemin George, Carl E. Busart
2021 J jnl
CoRR
Xin Wang, Pei Guo, Xingyan Li, Jianwu Wang, Aryya Gangopadhyay, Carl E. Busart, Jade Freeman
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"