Haibo Zhao

45 papers A* 1A 3B 1C 3Misc 1Journal 30Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Netw. Sci. Eng.
Ya Liu, Kai Yang, Yu Zhu, Keying Yang, Haibo Zhao
2025 J jnl
CoRR
Ya Liu, Kai Yang, Yu Zhu, Keying Yang, Haibo Zhao
2025 J jnl
CoRR
Yu Qi, Haibo Zhao, Ziyu Guo, Siyuan Ma, Ziyan Chen, Yaokun Han, Renrui Zhang, Zitiantao Lin, Shiji Xin, Yijian Huang, Kai Cheng, Peiheng Wang, Jiazheng Liu, Jiayi Zhang, Yizhe Zhu, Wenqing Wang, Yiran Qin, Xupeng Zhu, Haojie Huang, Lawson L. S. Wong
2025 B conf
GLOBECOM
Zehua Yu, Haibo Zhao, Dawei Gao, Liwu Wen, Qinghua Guo, Jinshan Ding
2025 J jnl
CoRR
Xuejiao Ma, Haibo Zhao, Zinuo Guo, Yijie Guo, Guanhong Liu, Bo Jiang
2025 J jnl
IEEE Signal Process. Lett.
Zehua Yu, Haibo Zhao, Qinghua Guo, Jinshan Ding
2025 J jnl
IEEE Access
Haibo Zhao, Yuchen Xia
2025 J jnl
CoRR
Haibo Zhao, Yu Qi, Boce Hu, Yizhe Zhu, Ziyan Chen, Heng Tian, Xupeng Zhu, Owen Howell, Haojie Huang, Robin Walters, Dian Wang, Robert Platt
2025 A* conf
ICML
Haibo Zhao, Dian Wang, Yizhe Zhu, Xupeng Zhu, Owen Lewis Howell, Linfeng Zhao, Yaoyao Qian, Robin Walters, Robert Platt
2025 J jnl
CoRR
Haibo Zhao, Dian Wang, Yizhe Zhu, Xupeng Zhu, Owen Howell, Linfeng Zhao, Yaoyao Qian, Robin Walters, Robert Platt
2025 J jnl
IEEE Trans. Instrum. Meas.
Haibo Zhao, Yongtao Ma, Pengfei Kang, Kaihua Liu
2025 J jnl
CoRR
Yizhe Zhu, Zhang Ye, Boce Hu, Haibo Zhao, Yu Qi, Dian Wang, Robert Platt
2024 J jnl
IEEE Internet Things J.
Zemin Wang, Yongtao Ma, Xiuyan Liang, Yicheng Chu, Haibo Zhao, Kai Huang, Kaihua Liu
2024 conf
ACM TUR-C
Weibei Fan, Kaiyun Liu, Fu Xiao, Haibo Zhao, Yuxian Fan, Yizhou Zhao
2024 Misc conf
CoRL
Dian Wang, Stephen Hart, David Surovik, Tarik Kelestemur, Haojie Huang, Haibo Zhao, Mark Yeatman, Jiuguang Wang, Robin Walters, Robert Platt
2024 J jnl
CoRR
Dian Wang, Stephen Hart, David Surovik, Tarik Kelestemur, Haojie Huang, Haibo Zhao, Mark Yeatman, Jiuguang Wang, Robin Walters, Robert Platt
2024 J jnl
IEEE Internet Things J.
Haibo Zhao, Yongtao Ma, Xiaofeng Wang
2024 J jnl
Neurocomputing
Xinyue Huang, Yongtao Ma, Zedong Yu, Haibo Zhao
2024 conf
CAIBDA
Peilei Fan, Ran Li, Liang Liang, Yujia Zhao, Haibo Zhao
2024 J jnl
CoRR
Yuxuan Zhang, Lifu Wei, Qing Zhang, Yiren Song, Jiaming Liu, Huaxia Li, Xu Tang, Yao Hu, Haibo Zhao
2024 J jnl
CoRR
Rui Wang, Hailong Guo, Jiaming Liu, Huaxia Li, Haibo Zhao, Xu Tang, Yao Hu, Hao Tang, Peipei Li
2024 J jnl
IEEE Internet Things J.
Haibo Zhao, Yongtao Ma, Yuxiang Han, Chenglong Tian, Xinyue Huang
2023 J jnl
IEEE Internet Things J.
Chenglong Tian, Yongtao Ma, Xiuyan Liang, Wanru Ning, Haibo Zhao
2022 J jnl
IEEE Access
Yinghai Xie, Xianhuai Li, Haibo Zhao
2021 C conf
IV
Pan Wang, Jianru Xue, Jian Dou, Di Wang, Haibo Zhao
2021 conf
BIC
Xin Guan, Shufang Xie, Fengyuan Liu, Haibo Zhao, Zhongyuan Liang
2020 J jnl
Sensors
Haibo Zhao, Xiaoxiang Wei, Yiming Zhong, Peihong Wang
2018 conf
CSAE
Haibo Zhao, Fei Zheng, Jian Wu, Baosong Nan, Boliang Li, Kuizhi Mei
2018 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Haibo Zhao, Chengguang Wang
2017 conf
ISGT Asia
Jinxin Dong, Hui Han, Xiusheng Ren, Zheng Wang, Jiawei Wang, Haibo Zhao
2017 J jnl
IEICE Electron. Express
Tongfei Yu, Haibo Zhao, Zhiping Li, Jungang Miao
2015 J jnl
J. Comput. Phys.
Zuwei Xu, Haibo Zhao, Chuguang Zheng
2013 J jnl
J. Comput. Phys.
Haoming Wang, Haibo Zhao, Zhaoli Guo, Yongxiang He, Chuguang Zheng
2012 C conf
IGARSS
Yongfang Zhang, Jungang Miao, Haibo Zhao, Guangbin Cui, Yan Shi
2012 C conf
IGARSS
Haibo Zhao, Yongfang Zhang, Cheng Zheng, Jungang Miao
2012 J jnl
Trans. Edutainment
Min Lu, Haibo Zhao
2011 J jnl
Trans. Edutainment
Min Lu, Haibo Zhao
2010 J jnl
J. Comput. Phys.
Haibo Zhao, F. Einar Kruis, Chuguang Zheng
2009 J jnl
Serv. Oriented Comput. Appl.
Haibo Zhao, Prashant Doshi
2009 J jnl
J. Comput. Phys.
Haibo Zhao, Chuguang Zheng
2009
Haibo Zhao
2009 A conf
ICWS
Haibo Zhao, Prashant Doshi
2007 A conf
ICWS
Haibo Zhao, Prashant Doshi
2006 A conf
ICSOC
Haibo Zhao, Prashant Doshi
2005 J jnl
Appl. Math. Comput.
Haibo Zhao, Chuguang Zheng, Minghou 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"