Haifang Zhou

52 papers A* 1A 1B 3C 6Misc 1Journal 17Unranked 23
YearRankTypeTitle / Venue / Authors
2026 J jnl
Neural Networks
Ruyi Zhang, Hongzuo Xu, Songlei Jian, Yusong Tan, Haifang Zhou, Rulin Xu
2026 J jnl
CoRR
Ruyi Zhang, Heng Gao, Songlei Jian, Yusong Tan, Haifang Zhou
2026 conf
CNML
Xiaolong Zhu, Haifang Zhou
2025 conf
ACL (Findings)
Ruyi Zhang, Songlei Jian, Yusong Tan, Heng Gao, Haifang Zhou, Kai Lu
2025 conf
SIGSOFT FSE Companion
Xingpei Li, Zhijie Jiang, Zhouyang Jia, Yuanliang Zhang, Si Zheng, Haifang Zhou, Shanshan Li
2024 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Jingcan Duan, Bin Xiao, Siwei Wang, Haifang Zhou, Xinwang Liu
2024 conf
Internetware
Rulin Xu, Luohui Chen, Ruyi Zhang, Yuanliang Zhang, Wei Xiao, Haifang Zhou, Xiaoguang Mao
2024 J jnl
CoRR
Ruyi Zhang, Hongzuo Xu, Songlei Jian, Yusong Tan, Haifang Zhou, Rulin Xu
2024 conf
SIGSOFT FSE Companion
Haoran Liu, Zhouyang Jia, Huiping Zhou, Haifang Zhou, Shanshan Li
2024 conf
MSN
Zhihang Zhang, Chenlin Huang, Yan Ding, Jinzhu Kong, Qing Liao, Pan Dong, Haifang Zhou
2023 A conf
ISSRE
Jiaying Li, Yan Lei, Shanshan Li, Haifang Zhou, Yue Yu, Zhouyang Jia, Yingwei Ma, Teng Wang
2023 A* conf
ACM Multimedia
Jingcan Duan, Pei Zhang, Siwei Wang, Jingtao Hu, Hu Jin, Jiaxin Zhang, Haifang Zhou, Xinwang Liu
2023 J jnl
CoRR
Jingcan Duan, Pei Zhang, Siwei Wang, Jingtao Hu, Hu Jin, Jiaxin Zhang, Haifang Zhou, Xinwang Liu
2023 conf
Internetware
Xiangbing Huang, Yingwei Ma, Haifang Zhou, Zhijie Jiang, Yuanliang Zhang, Teng Wang, Shanshan Li
2022 B conf
ICPADS
Ruyi Zhang, Yijie Wang, Haifang Zhou, Bin Li, Hongzuo Xu
2022 B conf
SMC
Ruyi Zhang, Yijie Wang, Hongzuo Xu, Haifang Zhou
2022 J jnl
CoRR
Jingcan Duan, Siwei Wang, Xinwang Liu, Haifang Zhou, Jingtao Hu, Hu Jin
2021 J jnl
IEEE Access
Peng Xi, Peijie Lin, Yaohai Lin, Haifang Zhou, Shuying Cheng, Zhicong Chen, Lijun Wu
2021 J jnl
Neural Comput. Appl.
Runze Huang, Qianying Zheng, Haifang Zhou
2020 J jnl
IEEE Access
Pancheng Wang, Shasha Li, Haifang Zhou, Jintao Tang, Ting Wang
2019 conf
NLPCC (1)
Pancheng Wang, Shasha Li, Haifang Zhou, Jintao Tang, Ting Wang
2019 J jnl
Scientometrics
Pancheng Wang, Shasha Li, Haifang Zhou, Jintao Tang, Ting Wang
2019 conf
MIWAI
Chunge Song, Lijun Wu, Zhicong Chen, Haifang Zhou, Peijie Lin, Shuying Cheng, Zhenhui Wu
2018 J jnl
Parallel Comput.
Minquan Fang, Jianbin Fang, Weimin Zhang, Haifang Zhou, Jianxing Liao, Yuangang Wang
2018 conf
BIRNDL@SIGIR
Pancheng Wang, Shasha Li, Ting Wang, Haifang Zhou, Jintao Tang
2018 J jnl
计算机科学
Siyao Li, Haifang Zhou, Minquan Fang
2017 conf
NCCET
Zhisheng Li, Lei Wang, Qiang Dou, Yuxing Tang, Shasha Guo, Haifang Zhou, Wenyuan Lu
2017 conf
iThings/GreenCom/CPSCom/SmartData
Haifang Zhou, Chang Gao, Xunyun Liu
2017 conf
ISPA/IUCC
Zhisheng Li, Lei Wang, Shasha Guo, Yu Deng, Qiang Dou, Haifang Zhou, Wenyuan Lu
2016 J jnl
计算机科学
Yuanyuan Tang, Haifang Zhou, Minquan Fang, Xiaolong Shen
2015 conf
IGTA
Guangjun Dong, Chaojie Zhu, Haifang Zhou, Sheng Luo
2013 Misc conf
ICNC
Tianwen Yao, Haifang Zhou, Minquan Fang, Haibin Hu
2009 J jnl
EURASIP J. Embed. Syst.
Baofeng Li, Yong Dou, Haifang Zhou, Xingming Zhou
2009 conf
CTS
Lili Jia, Huiping Zhou, Haifang Zhou, Chengzheng Sun, Zhiying Wang
2008 C conf
HPCC
Panfeng Wang, Zhiyuan Wang, Yunfei Du, Xuejun Yang, Haifang Zhou
2008 C conf
HPCC
Panfeng Wang, Yunfei Du, Hongyi Fu, Xuejun Yang, Haifang Zhou
2007 conf
APPT
Panfeng Wang, Yunfei Du, Hongyi Fu, Haifang Zhou, Xuejun Yang, Wenjing Yang
2007 J jnl
Frontiers Comput. Sci. China
Xuejun Yang, Panfeng Wang, Yunfei Du, Haifang Zhou
2007 C conf
CIT
Yunfei Du, Panfeng Wang, Hongyi Fu, Jia Jia, Haifang Zhou, Xuejun Yang
2007 J jnl
Frontiers Comput. Sci. China
Xuejun Yang, Huizhan Yi, Xiangli Qu, Haifang Zhou
2006 C conf
ISPA
Yunfei Du, Haifang Zhou, Panfeng Wang, Xuejun Yang, Hengzhu Liu
2006 J jnl
Concurr. Comput. Pract. Exp.
Haifang Zhou, Xuejun Yang, Hengzhu Liu, Yu Tang
2005 conf
EGC
Xiangli Qu, Xuejun Yang, Yuhua Tang, Haifang Zhou
2005 C conf
ICA3PP
Haifang Zhou, Yu Tang, Xuejun Yang, Hengzhu Liu
2005 B conf
ICPP
Haifang Zhou, Xuejun Yang, Hengzhu Liu, Yu Tang
2004 conf
GCC Workshops
Guoteng Pan, Qiang Dou, Luoguo Xie, Guangming Liu, Haifang Zhou, Xiaoqian Zhu, Erhua He
2004 conf
GCC Workshops
Xiangli Qu, Xuejun Yang, Guang Xiang, Haifang Zhou
2004 C conf
NPC
Haifang Zhou, Xuejun Yang, Yu Tang, Nong Xiao
2004 conf
GCC
Haifang Zhou, Xuejun Yang, Yu Tang, Xiangli Qu, Nong Xiao
2004 conf
GCC Workshops
Xuejun Yang, Zhi-ming Chang, Haifang Zhou, Xiangli Qu, Chunjiang Li
2004 conf
ICESS
Guanghui Liu, Fei Xia, Xuejun Yang, Haifang Zhou, Heng Zhao, Yu Deng
2003 conf
GCC (2)
Yu Tang, Haifang Zhou, Kai-Tao He, Luo Chen, Ning Jing
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"