Haiming Chen

57 papers B 13C 2Misc 1Journal 31Unranked 10
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Shuai Chen, Weihao Zhang, Guoming Zhang, Xiaoyu Ji, Haiming Chen, Xinyan Zhou
2025 J jnl
Algorithms
Ruijin Zhuang, Haiming Chen, Daoyong Chen, Xinyan Zhou
2025 J jnl
IEEE Internet Things J.
Peihao Wu, Haiming Chen, Tianhao Wu, Kaiqi Gu, Yinshui Xia
2025 J jnl
IEEE Internet Things J.
Weihao Zhang, Xinyan Zhou, Dingxin Yu, Guoming Zhang, Xianliang Jiang, Haiming Chen
2025 J jnl
Comput. Secur.
Yue Hou, Xinyan Zhou, Huakang Xia, Jian Wang, Haiming Chen
2024 J jnl
IEEE Internet Things J.
Di Wang, Haiming Chen, Sihan Lao, Steve Drew
2024 J jnl
Future Gener. Comput. Syst.
Wei Qin, Haiming Chen, Lei Wang, Yinshui Xia, Alfredo Nascita, Antonio Pescapè
2024 J jnl
Future Internet
Yihu Zhou, Haiming Chen, Zhibin Dou
2024 conf
ICC
Weihao Zhang, Xinyan Zhou, Haiming Chen
2024 J jnl
IEEE Trans. Cloud Comput.
Haiming Chen, Lei Wang, Wei Qin, Xinyan Zhou, Li Cui
2023 conf
ICA3PP (3)
Di Wang, Haiming Chen, Cangchen Wu
2023 J jnl
Comput. Networks
Menghan Zhang, Xianliang Jiang, Guang Jin, Penghui Li, Haiming Chen
2023 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Siyuan Tang, Xianliang Jiang, Menghan Zhang, Guang Jin, Haiming Chen
2023 J jnl
Comput. Networks
Yi Xie, Xianliang Jiang, Guanghui Gong, Ziyi Jiang, Guang Jin, Haiming Chen
2022 J jnl
IEEE Access
Linjie Yan, Haiming Chen, Youpeng Tu, Xinyan Zhou
2022 conf
HPCC/DSS/SmartCity/DependSys
Yi Xie, Xianliang Jiang, Guang Jin, Haiming Chen
2022 B conf
ICPADS
Jiaqi Pan, Xinyan Zhou, Zenan Zhang, Xiaoyu Ji, Haiming Chen
2022 conf
HPCC/DSS/SmartCity/DependSys
Guanghui Gong, Xianliang Jiang, Guang Jin, Yi Xie, Haiming Chen
2022 B conf
ICPADS
Guanghui Gong, Xianliang Jiang, Yi Xie, Guang Jin, Jianan Zhang, Haiming Chen
2022 conf
CWSN
Wei Qin, Haiming Chen, Lei Wang
2022 J jnl
Inf.
Liu Liu, Haiming Chen, Zhengtao Xu
2022 J jnl
Future Internet
Youpeng Tu, Haiming Chen, Linjie Yan, Xinyan Zhou
2022 J jnl
J. Cloud Comput.
Haiming Chen, Wei Qin, Lei Wang
2021 conf
ICA3PP (2)
Lei Wang, Haiming Chen, Wei Qin
2020 J jnl
IEEE Internet Things J.
Xiaoguang Niu, Luyao Xie, Jiawei Wang, Haiming Chen, Dandan Liu, Ruizhi Chen
2020 J jnl
J. Ambient Intell. Humaniz. Comput.
Xiwen Liu, Haiming Chen, Antonio Montieri, Antonio Pescapè
2019 J jnl
IEEE Internet Things J.
Haiming Chen, Kaibin Xie, Li Cui, Antonio Pescapè
2019 J jnl
IEEE Access
Xiaoguang Niu, Da Shen, Zejun Zhang, Zhen Wang, Jiawei Wang, Haiming Chen
2019 J jnl
IEEE Access
Jianhui Zhuang, Xianliang Jiang, Guang Jin, Jiahua Zhu, Haiming Chen
2019 conf
IDCS
Haiming Chen, Xiwen Liu, Ze Zhao, Giuseppe Aceto, Antonio Pescapè
2019 conf
ICCCS
Xiwen Liu, Haiming Chen, Xianliang Jiang, Jiangbo Qian, Giuseppe Aceto, Antonio Pescapè
2019 conf
ACM TUR-C
Md. Asif Hasan, Haiming Chen, Yimo Lin, Xiwen Liu
2019 conf
SDS
Haiming Chen, Valerio Persico, Antonio Pescapè
2018 C conf
APCC
Giuseppe Aceto, Fabio Palumbo, Valerio Persico, Haiming Chen, Antonio Pescapè
2018 B conf
ICCCN
Xianliang Jiang, Guang Jin, Haiming Chen
2017 J jnl
J. Comput. Sci. Technol.
Haiming Chen, Li Cui, Gang Zhou
2017 J jnl
Trans. Emerg. Telecommun. Technol.
Tingpei Huang, Haiming Chen, Li Cui, Shibao Li
2017 J jnl
IEEE Trans. Mob. Comput.
Haiming Chen, Zhaoliang Zhang, Li Cui, Changcheng Huang
2017 J jnl
IEEE Internet Things J.
Yongsen Ma, Gang Zhou, Shan Lin, Haiming Chen
2015 C conf
SEKE
Kaibin Xie, Haiming Chen, Dong Li, Li Cui
2015 B conf
ICPADS
Meng Li, Haiming Chen, Xi Huang, Li Cui
2015 J jnl
Wirel. Pers. Commun.
Tingpei Huang, Haiming Chen, Yuqing Zhang, Li Cui
2015 B conf
ICPADS
Kaibin Xie, Haiming Chen, Xi Huang, Li Cui
2014 B conf
ICPADS
Hailong Shi, Dong Li, Haiming Chen, Jiefan Qiu, Li Cui
2013 J jnl
Int. J. Sens. Networks
Tingpei Huang, Haiming Chen, Li Cui, Zhaoliang Zhang
2013 J jnl
Int. J. Distributed Sens. Networks
Tingpei Huang, Haiming Chen, Li Cui, Yuqing Zhang
2012 B conf
GLOBECOM
Tingpei Huang, Haiming Chen, Zhaoliang Zhang, Li Cui
2012 B conf
WCNC
Tingpei Huang, Haiming Chen, Zhaoliang Zhang, Li Cui
2012 B conf
ICPADS
Zhaoliang Zhang, Haiming Chen, Tingpei Huang, Xinyu Liu, Li Cui
2011 Misc conf
SenSys
Jingjing Zhang, Rui Wang, Shilong Lu, Jibing Gong, Ze Zhao, Haiming Chen, Li Cui, Nanyue Wang, Youhua Yu
2010 B conf
MASS
Dong Li, Ze Zhao, Li Cui, He Zhu, Le Zhang, Zhaoliang Zhang, Yi Wang, Haiming Chen
2009 B conf
GLOBECOM
Haiming Chen, Li Cui, Victor O. K. Li
2009 J jnl
Wirel. Sens. Netw.
Haiming Chen, Li Cui, Changcheng Huang, He Zhu
2009 J jnl
IEEE Trans. Parallel Distributed Syst.
Xiang-Yang Li, Yu Wang, Haiming Chen, Xiaowen Chu, Yanwei Wu, Yong Qi
2008 J jnl
Sci. China Ser. F Inf. Sci.
Linfang Dong, Yantai Shu, Haiming Chen, Maode Ma
2007 B conf
GLOBECOM
Yi Hu, Xiang-Yang Li, Haiming Chen, Xiaohua Jia
2006 B conf
MASS
Xiang-Yang Li, Haiming Chen, Yantai Shu, Xiaowen Chu, Yanwei Wu
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"