Hai Wang

53 papers A 8C 1Journal 25Unranked 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
Neural Networks
Jiaxuan Chen, Yancheng Xie, Hai Wang
2023 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Hai Wang, Xingyi Long, Xue-Xin Liu
2022 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Hai Wang, Wenjun He, Qinhui Yang, Xizhu Peng, He Tang
2021 J jnl
IEEE Trans. Computers
Hai Wang, Wei Li, Wenjie Qi, Diya Tang, Letian Huang, He Tang
2020 J jnl
IEEE Trans. Ind. Informatics
Hai Wang, Liwen Hu, Xingxing Guo, Yang Nie, He Tang
2020 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Hai Wang, Xingxing Guo, Sheldon X.-D. Tan, Chi Zhang, He Tang, Yuan Yuan
2019 J jnl
IEEE Trans. Computers
Hai Wang, Diya Tang, Ming Zhang, Sheldon X.-D. Tan, Chi Zhang, He Tang, Yuan Yuan
2019 conf
ASP-DAC
Xingxing Guo, Hai Wang, Chi Zhang, He Tang, Yuan Yuan
2019 J jnl
ACM Trans. Design Autom. Electr. Syst.
Hai Wang, Tao Xiao, Darong Huang, Lang Zhang, Chi Zhang, He Tang, Yuan Yuan
2019 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Hai Wang, Darong Huang, Rui Liu, Chi Zhang, He Tang, Yuan Yuan
2018 J jnl
IEEE Trans. Computers
Hai Wang, Jiachun Wan, Sheldon X.-D. Tan, Chi Zhang, He Tang, Yuan Yuan, Keheng Huang, Zhenghong Zhang
2018 J jnl
ACM Trans. Design Autom. Electr. Syst.
Hengyang Zhao, Qi Hua, Hai-Bao Chen, Yaoyao Ye, Hai Wang, Sheldon X.-D. Tan, Esteban Tlelo-Cuautle
2017 J jnl
Integr.
He Tang, Yong Peng, Xiang Lu, Albert Z. Wang, Hai Wang
2017 conf
SMACD
Yaoyao Ye, Taeyoung Kim, Hai-Bao Chen, Hai Wang, Esteban Tlelo-Cuautle, Sheldon X.-D. Tan
2017 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Taeyoung Kim, Zeyu Sun, Hai-Bao Chen, Hai Wang, Sheldon X.-D. Tan
2016 A conf
ICCAD
Taeyoung Kim, Zeyu Sun, Chase Cook, Jagadeesh Gaddipati, Hai Wang, Hai-Bao Chen, Sheldon X.-D. Tan
2016 conf
ISQED
Lang Zhang, Hai Wang, Sheldon X.-D. Tan
2016 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Kai He, Sheldon X.-D. Tan, Hai Wang, Guoyong Shi
2016 J jnl
ACM Trans. Design Autom. Electr. Syst.
Hai Wang, Jian Ma, Sheldon X.-D. Tan, Chi Zhang, He Tang, Keheng Huang, Zhenghong Zhang
2016 C conf
ISCAS
Hengyang Zhao, Zhongdong Qi, Shujuan Wang, Kambiz Vafai, Hai Wang, Hai-Bao Chen, Sheldon X.-D. Tan
2016 conf
SoCC
Hai Wang, Ming Zhang, Sheldon X.-D. Tan, Chi Zhang, Yuan Yuan, Keheng Huang, Zhenghong Zhang
2016 conf
ISVLSI
Hengyang Zhao, Sheldon X.-D. Tan, Hai Wang, Hai-Bao Chen
2016 J jnl
Integr.
Kai He, Sheldon X.-D. Tan, Hengyang Zhao, Xuexin Liu, Hai Wang, Guoyong Shi
2016 J jnl
ACM Trans. Design Autom. Electr. Syst.
Yue Zhao, Taeyoung Kim, Hosoon Shin, Sheldon X.-D. Tan, Xin Li, Hai-Bao Chen, Hai Wang
2016 conf
ASP-DAC
Wandi Liu, Hai Wang, Hengyang Zhao, Shujuan Wang, Hai-Bao Chen, Yuzhuo Fu, Jian Ma, Xin Li, Sheldon X.-D. Tan
2015 J jnl
Int. J. Circuit Theory Appl.
Hai-Bao Chen, Sheldon X.-D. Tan, David H. Shin, Xin Huang, Hai Wang, Guoyong Shi
2015 A conf
ICCAD
Hengyang Zhao, Daniel Quach, Shujuan Wang, Hai Wang, Hai-Bao Chen, Xin Li, Sheldon X.-D. Tan
2015 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Zao Liu, Sheldon X.-D. Tan, Xin Huang, Hai Wang
2014 conf
MWSCAS
Kai He, Sheldon X.-D. Tan, Esteban Tlelo-Cuautle, Hai Wang, He Tang
2014 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Zao Liu, Sahana Swarup, Sheldon X.-D. Tan, Hai-Bao Chen, Hai Wang
2014 J jnl
Integr.
Zao Liu, Sheldon X.-D. Tan, Hai Wang, Yingbo Hua, Ashish Gupta
2014 conf
APCCAS
Jian Ma, Hai Wang, Sheldon X.-D. Tan, Chi Zhang, He Tang
2013 A conf
DATE
Hai Wang, Sheldon X.-D. Tan, Sahana Swarup, Xuexin Liu
2013 conf
ASP-DAC
Zao Liu, Sheldon X.-D. Tan, Hai Wang, Sahana Swarup, Ashish Gupta
2013 J jnl
ACM Trans. Design Autom. Electr. Syst.
Hai Wang, Sheldon X.-D. Tan, Duo Li, Ashish Gupta, Yuan Yuan
2013 conf
ASICON
Zao Liu, Xin Huang, Sheldon X.-D. Tan, Hai Wang, He Tang
2013 conf
ASP-DAC
Zao Liu, Tailong Xu, Sheldon X.-D. Tan, Hai Wang
2013 A conf
ICCAD
Xuexin Liu, Hai Wang, Sheldon X.-D. Tan
2013 conf
ASICON
He Tang, Yong Peng, Xiang Lu, Hai Wang, Albert Z. Wang
2012 A conf
DATE
Xuexin Liu, Sheldon X.-D. Tan, Hai Wang, Hao Yu
2012
Hai Wang
2012 J jnl
ACM Trans. Design Autom. Electr. Syst.
Hai Wang, Sheldon X.-D. Tan, Ryan Rakib
2012 J jnl
ACM Trans. Design Autom. Electr. Syst.
Ruijing Shen, Sheldon X.-D. Tan, Hai Wang, Jinjun Xiong
2012 J jnl
Integr.
Hai Wang, Hao Yu, Sheldon X.-D. Tan
2012 A conf
DATE
Xuexin Liu, Sheldon X.-D. Tan, Hai Wang
2012 A conf
DATE
Hai Wang, Sheldon X.-D. Tan, Xuexin Liu, Ashish Gupta
2012 conf
NEWCAS
Xuexin Liu, Sheldon X.-D. Tan, Zao Liu, Hai Wang, Tailong Xu
2011 conf
ASICON
Sahana Swarup, Sheldon X.-D. Tan, Zao Liu, Hai Wang, Zhigang Hao, Guoyong Shi
2011 conf
IGCC
Zao Liu, Sheldon X.-D. Tan, Hai Wang, Rafael Quintanilla, Ashish Gupta
2011 A conf
ICCAD
Hai Wang, Sheldon X.-D. Tan, Guangdeng Liao, Rafael Quintanilla, Ashish Gupta
2010 conf
ASP-DAC
Hao Yu, Xuexin Liu, Hai Wang, Sheldon X.-D. Tan
2010 conf
ASP-DAC
Hai Wang, Sheldon X.-D. Tan, Gengsheng Chen
2009 conf
ASP-DAC
Hai Wang, Hao Yu, Sheldon X.-D. Tan
tests/unit/test_apk_apktool_wrapper.py
← Index tests/unit/test_apk_apktool_wrapper.py python
"""
Unit tests for apktool wrapper subprocess management and smali directory detection.

All subprocess calls are mocked — no apktool/Java installation required.
"""
import os
import tempfile

import pytest
from unittest.mock import MagicMock, patch

pytestmark = [pytest.mark.unit, pytest.mark.apk, pytest.mark.decompile]


class TestApktoolDisassembler:
    """Tests for ApktoolDisassembler subprocess wrapper."""

    @patch.dict(os.environ, {}, clear=False)
    def test_init_defaults(self):
        os.environ.pop("APKTOOL_PATH", None)
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        a = ApktoolDisassembler()
        assert a.apktool_path == "apktool"
        assert a.timeout == 120

    def test_init_custom(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        a = ApktoolDisassembler(apktool_path="/opt/apktool", timeout=120)
        assert a.apktool_path == "/opt/apktool"
        assert a.timeout == 120

    def test_init_from_env(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        with patch.dict(os.environ, {"APKTOOL_PATH": "/usr/bin/apktool", "APKTOOL_TIMEOUT": "90"}):
            a = ApktoolDisassembler()
            assert a.apktool_path == "/usr/bin/apktool"
            assert a.timeout == 90

    @patch("subprocess.Popen")
    def test_disassemble_success(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("output", "")
        mock_proc.returncode = 0
        mock_popen.return_value = mock_proc

        a = ApktoolDisassembler()
        result = a.disassemble("/test.apk", "/output")
        assert result is True

    @patch("subprocess.Popen")
    def test_disassemble_failure(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("", "error")
        mock_proc.returncode = 1
        mock_popen.return_value = mock_proc

        a = ApktoolDisassembler(log=MagicMock())
        result = a.disassemble("/test.apk", "/output")
        assert result is False

    @patch("subprocess.Popen")
    def test_disassemble_timeout(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        import subprocess
        mock_proc = MagicMock()
        mock_proc.communicate.side_effect = subprocess.TimeoutExpired(cmd="apktool", timeout=10)
        mock_proc.pid = 12345
        mock_popen.return_value = mock_proc

        with patch("os.getpgid", return_value=12345), \
             patch("os.killpg"):
            a = ApktoolDisassembler(timeout=10, log=MagicMock())
            result = a.disassemble("/test.apk", "/output")
            assert result is False

    @patch("subprocess.Popen", side_effect=FileNotFoundError)
    def test_disassemble_not_found(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        a = ApktoolDisassembler(log=MagicMock())
        result = a.disassemble("/test.apk", "/output")
        assert result is False

    @patch("subprocess.Popen")
    def test_disassemble_command_args(self, mock_popen):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("", "")
        mock_proc.returncode = 0
        mock_popen.return_value = mock_proc

        a = ApktoolDisassembler(apktool_path="/opt/apktool")
        a.disassemble("/test.apk", "/output")

        cmd = mock_popen.call_args[0][0]
        assert cmd[0] == "/opt/apktool"
        assert "d" in cmd
        assert "--no-res" in cmd
        assert "--force" in cmd
        assert "/test.apk" in cmd

    def test_get_smali_directories_single_dex(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        with tempfile.TemporaryDirectory() as tmpdir:
            os.makedirs(os.path.join(tmpdir, "smali"))
            a = ApktoolDisassembler()
            dirs = a.get_smali_directories(tmpdir)
            assert len(dirs) == 1
            assert dirs[0].endswith("smali")

    def test_get_smali_directories_multi_dex(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        with tempfile.TemporaryDirectory() as tmpdir:
            os.makedirs(os.path.join(tmpdir, "smali"))
            os.makedirs(os.path.join(tmpdir, "smali_classes2"))
            os.makedirs(os.path.join(tmpdir, "smali_classes3"))
            # Should not be included
            os.makedirs(os.path.join(tmpdir, "res"))
            os.makedirs(os.path.join(tmpdir, "original"))

            a = ApktoolDisassembler()
            dirs = a.get_smali_directories(tmpdir)
            assert len(dirs) == 3

    def test_get_smali_directories_empty(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        with tempfile.TemporaryDirectory() as tmpdir:
            a = ApktoolDisassembler()
            dirs = a.get_smali_directories(tmpdir)
            assert dirs == []

    def test_get_smali_directories_nonexistent(self):
        from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
        a = ApktoolDisassembler()
        dirs = a.get_smali_directories("/nonexistent/path")
        assert dirs == []