James J. Chen

29 papers Journal 27Unranked 2
YearRankTypeTitle / Venue / Authors
2021 conf
BIBM
Weizhong Zhao, Huyen Le, James J. Chen, Hesha J. Duggirala, Richard Forshee, Taxiarchis Botsis, Henry Francis, Huixiao Hong, Weida Tong, Yi-Ting Hwang, Wen Zou
2017 conf
BCB
Wen Zou, Weizhong Zhao, James J. Chen, Roger Perkins
2016 J jnl
BMC Bioinform.
Weizhong Zhao, James J. Chen, Roger Perkins, Yuping Wang, Zhichao Liu, Huixiao Hong, Weida Tong, Wen Zou
2016 J jnl
BMC Bioinform.
Weizhong Zhao, James J. Chen, Roger Perkins, Yuping Wang, Zhichao Liu, Huixiao Hong, Weida Tong, Wen Zou
2016 J jnl
J. Am. Medical Informatics Assoc.
Hesha J. Duggirala, Joseph M. Tonning, Ella Smith, Roselie A. Bright, John D. Baker, Robert Ball, Carlos Bell, Susan J. Bright-Ponte, Taxiarchis Botsis, Khaled Bouri, Marc Boyer, Keith Burkhart, G. Steven Condrey, James J. Chen, Stuart Chirtel, Ross W. Filice, Henry Francis, Hongying Jiang, Jonathan Levine, David Martin, Taiye Oladipo, Rene O'Neill, Lee Anne M. Palmer, Antonio Paredes, George Rochester, Deborah Sholtes, Ana Szarfman, Hui-Lee Wong, Zhiheng Xu, Taha A. Kass-Hout
2015 J jnl
BMC Bioinform.
Weizhong Zhao, James J. Chen, Roger Perkins, Zhichao Liu, Weigong Ge, Yijun Ding, Wen Zou
2014 J jnl
BMC Bioinform.
Weizhong Zhao, Wen Zou, James J. Chen
2013 J jnl
Briefings Bioinform.
Wei-Jiun Lin, James J. Chen
2013 J jnl
BMC Bioinform.
Wen Zou, Hailin Tang, Weizhong Zhao, Joe Meehan, Steven L. Foley, Wei-Jiun Lin, Hung-Chia Chen, Hong Fang, Rajesh Nayak, James J. Chen
2013 J jnl
BMC Bioinform.
Tzu-Pin Lu, Eric Y. Chuang, James J. Chen
2010 J jnl
BMC Bioinform.
Hong Fang, Joshua Xu, Don Ding, Scott A. Jackson, Isha R. Patel, Jonathan G. Frye, Wen Zou, Rajesh Nayak, Steven L. Foley, James J. Chen, Zhenqiang Su, Yanbin Ye, Steve Turner, Steve Harris, Guangxu Zhou, Carl Cerniglia, Weida Tong
2010 J jnl
BMC Bioinform.
Wei-Jiun Lin, Huey-miin Hsueh, James J. Chen
2009 J jnl
Artif. Intell. Medicine
Ralph L. Kodell, Bruce A. Pearce, Songjoon Baek, Hojin Moon, Hongshik Ahn, John F. Young, James J. Chen
2009 J jnl
Briefings Bioinform.
Songjoon Baek, Chen-An Tsai, James J. Chen
2009 J jnl
Bioinform.
Chen-An Tsai, James J. Chen
2008 J jnl
BMC Bioinform.
Huixiao Hong, Zhenqiang Su, Weigong Ge, Leming M. Shi, Roger Perkins, Hong Fang, Joshua Xu, James J. Chen, Tao Han, Jim Kaput, James C. Fuscoe, Weida Tong
2007 J jnl
Comput. Stat. Data Anal.
Hongshik Ahn, Hojin Moon, Melissa J. Fazzari, Noha Lim, James J. Chen, Ralph L. Kodell
2007 J jnl
Artif. Intell. Medicine
Hojin Moon, Hongshik Ahn, Ralph L. Kodell, Songjoon Baek, Chien-Ju Lin, James J. Chen
2007 J jnl
BMC Bioinform.
James J. Chen, Chen-An Tsai, Shengli Tzeng, Chun-Houh Chen
2007 J jnl
Comput. Stat. Data Anal.
Chen-An Tsai, James J. Chen
2007 J jnl
BMC Bioinform.
James J. Chen, Huey-miin Hsueh, Robert R. Delongchamp, Chien-Ju Lin, Chen-An Tsai
2007 J jnl
Bioinform.
James J. Chen, Taewon Lee, Robert R. Delongchamp, Tao Chen, Chen-An Tsai
2005 J jnl
BMC Bioinform.
Leming M. Shi, Weida Tong, Hong Fang, Uwe Scherf, Jing Han, Raj K. Puri, Felix W. Frueh, Federico M. Goodsaid, Lei Guo, Zhenqiang Su, Tao Han, James C. Fuscoe, Z. Alex Xu, Tucker A. Patterson, Huixiao Hong, Qian Xie, Roger Perkins, James J. Chen, Daniel A. Casciano
2005 J jnl
BMC Bioinform.
Leming M. Shi, Weida Tong, Zhenqiang Su, Tao Han, Jing Han, Raj K. Puri, Hong Fang, Felix W. Frueh, Federico M. Goodsaid, Lei Guo, William S. Branham, James J. Chen, Z. Alex Xu, Stephen C. Harris, Huixiao Hong, Qian Xie, Roger Perkins, James C. Fuscoe
2005 J jnl
Bioinform.
Dung-Tsa Chen, James J. Chen, Seng-jaw Soong
2005 J jnl
Comput. Stat. Data Anal.
Yunhee Choi, Hongshik Ahn, James J. Chen
2005 J jnl
Bioinform.
Chen-An Tsai, Sue-Jane Wang, Dung-Tsa Chen, James J. Chen
2004 J jnl
Bioinform.
James J. Chen, Robert R. Delongchamp, Chen-An Tsai, Huey-miin Hsueh, Frank Sistare, Karol L. Thompson, Varsha G. Desai, James C. Fuscoe
2004 J jnl
J. Comput. Biol.
Sue-Jane Wang, James J. Chen
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"