Xiaodong Pan

52 papers C 1Misc 1Journal 44Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
Comput. Appl. Math.
Siyu Xu, Longyu He, Xiaodong Pan
2026 J jnl
Int. J. Mach. Learn. Cybern.
Siyu Xu, Xiaodong Pan, Longyu He, Chao Fu, Keyun Qin, Yexing Dan
2026 J jnl
Fuzzy Sets Syst.
Siyu Xu, Xiaodong Pan, Yexing Dan, Keyun Qin
2026 J jnl
Fuzzy Sets Syst.
Hanhan Shen, Xiaodong Pan
2025 J jnl
J. Vis.
Xiangyang Wu, Qian Li, Xiaodong Pan, Xiaozhi Liu, Zhen Liu
2025 J jnl
Inf. Sci.
Yexing Dan, Xiaodong Pan
2025 J jnl
IEEE Trans. Instrum. Meas.
Jiangning Sun, Xinfu Lu, Guanghui Wei, Haojiang Wan, Xiaodong Pan, Xiaopeng Li
2025 J jnl
Comput. Appl. Math.
Siyu Xu, Xiaodong Pan, Yexing Dan, Keyun Qin
2025 J jnl
Inf. Sci.
Xiaoyu Peng, Xiaodong Pan, Yexing Dan, Juan Dai
2025 J jnl
Symmetry
Xiaodong Pan, Deshi Liu, Jingfan Feng, Xueyu Geng
2025 J jnl
Fuzzy Sets Syst.
Juan Dai, Yexing Dan, Xiaodong Pan, Ya-Ming Wang
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Sen Yang, Zhenhua Wang, Xiaodong Pan, Deting Li, Ali Zolghadri
2025 J jnl
Comput. Appl. Math.
Yexing Dan, Xiaodong Pan, Junsheng Qiao
2024 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Jiangning Sun, Xinfu Lu, Guanghui Wei, Haojiang Wan, Xiaodong Pan, Xuxu Lyu
2024 J jnl
Frontiers Neurorobotics
Yan Xing, Xu Han, Xiaodong Pan, Dong An, Weidong Liu, Yuanshen Bai
2024 J jnl
IEEE Trans. Instrum. Meas.
Jiangning Sun, Xinfu Lu, Guanghui Wei, Haojiang Wan, Xiaodong Pan
2024 J jnl
Comput. Appl. Math.
Juan Dai, Yexing Dan, Xiaodong Pan
2024 J jnl
Comput. Appl. Math.
Xiaoyu Peng, Xiaodong Pan
2024 J jnl
J. Cloud Comput.
Zicong Miao, Weize Li, Xiaodong Pan
2024 J jnl
Appl. Intell.
Hanhan Shen, Qin Yao, Xiaodong Pan
2024 J jnl
J. Intell. Fuzzy Syst.
Hanhan Shen, Fu Zhang, Xiaodong Pan, Xiaofei Sun
2023 J jnl
J. Intell. Fuzzy Syst.
Hanhan Shen, Xiaodong Pan, Xiaoyu Peng, Yexing Dan, Junsheng Qiao
2023 J jnl
Symmetry
Xiaodong Pan, Haijun Zhu, Huailin Zheng, Honglei Sun, Xueyu Geng
2023 J jnl
Fuzzy Sets Syst.
Yexing Dan, Xiaodong Pan
2023 J jnl
J. Intell. Fuzzy Syst.
Siyu Xu, Keyun Qin, Xiaodong Pan, Chao Fu
2022 J jnl
IEEE Trans. Instrum. Meas.
Heng Piao, Defu Cheng, Chen Chen, Yanzhang Wang, Peng Wang, Xiaodong Pan
2022 J jnl
IEEE Trans. Instrum. Meas.
Peng Wang, Chen Chen, Yanzhang Wang, Heng Piao, Defu Cheng, Xiaodong Pan
2022 J jnl
IEEE Trans. Instrum. Meas.
Heng Piao, Defu Cheng, Chen Chen, Yanzhang Wang, Peng Wang, Xiaodong Pan
2021 J jnl
Symmetry
Kangyu Wang, Weijie Li, Honglei Sun, Xiaodong Pan, Hongguo Diao, Bin Hu
2020 J jnl
Remote. Sens.
Yong Wan, Rongjuan Zhang, Xiaodong Pan, Chenqing Fan, Yongshou Dai
2019 conf
HPCC/SmartCity/DSS
Wenxu Zheng, Jianbin Fang, Chen Juan, Feihao Wu, Xiaodong Pan, Hao Wang, Xiaole Sun, Yuan Yuan, Min Xie, Chun Huang, Tao Tang, Zheng Wang
2019 J jnl
计算机科学
Cong Xu, Xiaodong Pan
2018 conf
HPCC/SmartCity/DSS
Feihao Wu, Chen Cui, Juan Chen, Yong Dong, Wenxu Zheng, Xiaodong Pan
2018 J jnl
Soft Comput.
Xiaodong Pan, Yang Xu
2018 conf
HPCC/SmartCity/DSS
Feihao Wu, Juan Chen, Yong Dong, Wenxu Zheng, Xiaodong Pan, Yuyang Sun
2018 J jnl
Soft Comput.
Xiaodong Pan, Yang Xu
2017 J jnl
CoRR
Xiaodong Pan, Yang Xu
2015 J jnl
Int. J. Comput. Intell. Syst.
Weitao Xu, Wenqiang Zhang, Dexian Zhang, Yang Xu, Xiaodong Pan
2015 J jnl
J. Intell. Fuzzy Syst.
Xiaodong Pan, Yang Xu
2015 J jnl
Int. J. Comput. Intell. Syst.
Xiaodong Pan, Yang Xu
2015 Misc conf
ISKE
Xiaodong Pan, Yang Xu
2014 J jnl
Future Gener. Comput. Syst.
Hai Jin, Li Deng, Song Wu, Xuanhua Shi, Hanhua Chen, Xiaodong Pan
2013 J jnl
Soft Comput.
Xiaodong Pan, Yang Xu
2013 J jnl
Sci. China Inf. Sci.
Xiaodong Pan, Dan Meng, Yang Xu
2012 J jnl
J. Supercomput.
Xuanhua Shi, Hai Jin, Hongbo Jiang, Xiaodong Pan, Dachuan Huang, Bo Yu
2012 J jnl
Fuzzy Sets Syst.
Xiaodong Pan, Dan Meng
2011 conf
BMEI
Jie Lin, Youyan Guo, Zuo Wang, Fengru Shi, Ya Yang, Qiang Yong, Xiaodong Pan, Zhisheng Jiang, Luya Wang
2010 conf
HAIS (2)
Xiaodong Pan, Yang Xu, Luis Martínez-López, Da Ruan, Jun Liu
2010 J jnl
Sci. China Inf. Sci.
Xiaodong Pan, Yang Xu
2009 C conf
CLUSTER
Hai Jin, Li Deng, Song Wu, Xuanhua Shi, Xiaodong Pan
2009 conf
ISCID (1)
Xiaodong Pan
2008 J jnl
Inf. Sci.
Xiaodong Pan, Yang Xu
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"