Vasile Stoicu-Tivadar

50 papers Misc 10Journal 1Unranked 38
YearRankTypeTitle / Venue / Authors
2024 conf
EFMI-STC
Norbert Gal-Nadasan, Vasile Stoicu-Tivadar, Emanuela Gal-Nadasan, Anca Raluca Dinu
2024 conf
EFMI-STC
Sebastian-Bogdan Zigrea, Vasile Stoicu-Tivadar
2024 conf
MIE
Darius Turcian, Vasile Stoicu-Tivadar
2023 conf
EFMI-STC
Emilian Erman Mahmut, Stelian Nicola, Vasile Stoicu-Tivadar
2023 conf
EFMI-STC
Darius Turcian, Vasile Stoicu-Tivadar
2023 conf
EFMI-STC
Norbert Gal-Nadasan, Vasile Stoicu-Tivadar, Emanuela Gal-Nadasan, Anca Raluca Dinu
2022 conf
MIE
Emilian Erman Mahmut, Stelian Nicola, Vasile Stoicu-Tivadar
2021 conf
ICIMTH
Darius Turcian, Vasile Stoicu-Tivadar
2020 conf
MIE
Emilian Erman Mahmut, Dorin Berian, Michele Della Ventura, Vasile Stoicu-Tivadar
2020 conf
EFMI-STC
Emilian Erman Mahmut, Stelian Nicola, Vasile Stoicu-Tivadar
2019 conf
ICIMTH
Emilian Erman Mahmut, Michele Della Ventura, Dorin Berian, Vasile Stoicu-Tivadar
2019 conf
ICIMTH
Emanuela Georgiana Gal-Nadasan, Norbert Gal-Nadasan, Vasile Stoicu-Tivadar, Dan V. Poenaru, Diana Popa-Andrei
2018 conf
ICIMTH
Emilian Erman Mahmut, Stelian Nicola, Vasile Stoicu-Tivadar
2018 conf
EFMI-STC
Emilian Erman Mahmut, Vasile Stoicu-Tivadar
2018 conf
EFMI-STC
Norbert Gal-Nadasan, Mihaela Crisan-Vida, Vasile Stoicu-Tivadar, Alexandra Gradea, Emanuela Gal-Nadasan
2018 Misc conf
SACI
Emilian Erman Mahmut, Vasile Stoicu-Tivadar
2017 conf
eHealth
Norbert Gal-Nadasan, Emanuela Georgiana Gal-Nadasan, Vasile Stoicu-Tivadar, Dan V. Poenaru, Diana Popa-Andrei
2016 conf
MIE
Norbert Gal, Diana Andrei, Dan V. Poenaru, Vasile Stoicu-Tivadar, Emanuela Gal-Nadasan
2016 conf
SOFA (1)
Norbert Gal-Nadasan, Vasile Stoicu-Tivadar, Dan V. Poenaru, Diana Popa-Andrei, Emanuela Gal-Nadasan
2016 conf
ICIMTH
Daniel-Alexandru Jurcau, Vasile Stoicu-Tivadar
2016 conf
SOFA (1)
Daniel-Alexandru Jurcau, Vasile Stoicu-Tivadar
2015 conf
MIE
Bogdan Ionescu, Cristian Gadea, Bogdan Solomon, Dan Ionescu, Vasile Stoicu-Tivadar, Mircea Trifan
2015 conf
MIE
Norbert Gal, Diana Andrei, Dan Ion Nemes, Emanuela Nadasan, Vasile Stoicu-Tivadar
2015 Misc conf
SACI
Bogdan Ionescu, Cristian Gadea, Bogdan Solomon, Mircea Trifan, Dan Ionescu, Vasile Stoicu-Tivadar
2015 conf
MIE
Vasile Topac, Daniel-Alexandru Jurcau, Vasile Stoicu-Tivadar
2014 conf
SOFA (1)
Norbert Gal, Diana Andrei, Vasile Stoicu-Tivadar, Dan Ion Nemes, Emanuela Nadasan
2014 conf
SOFA (1)
Daniel-Alexandru Jurcau, Vasile Stoicu-Tivadar, Alexandru Serban
2014 conf
MIE
Lacramioara Stoicu-Tivadar, Vasile Stoicu-Tivadar, Dorin Berian, Simona Dragan, Alexandru Serban, Corina Serban
2013 conf
MedInfo
Valentin-Sergiu Gomoi, Mihaela Marcella Vida, Raul Robu, Vasile Stoicu-Tivadar, Elena Bernad, Oana Sorina Lupse
2012 Misc conf
SOFA
Daniel Dragu, Valentin-Sergiu Gomoi, Vasile Stoicu-Tivadar
2012 conf
MIE
Norbert Gal, Vasile Stoicu-Tivadar
2012 conf
MIE
Valentin-Sergiu Gomoi, Daniel Dragu, Vasile Stoicu-Tivadar
2012 ch.
Recent Advances in Intelligent Engineering Systems
Vasile Stoicu-Tivadar, Lacramioara Stoicu-Tivadar, Sorin Puscoci, Dorin Berian, Vasile Topac
2011 Misc conf
SACI
Daniel Dragu, Valentin-Sergiu Gomoi, Vasile Stoicu-Tivadar
2011 conf
EFMI-STC
Valentin-Sergiu Gomoi, Mihaela Marcella Vida, Lacramioara Stoicu-Tivadar, Vasile Stoicu-Tivadar
2011 Misc conf
SACI
Mihaela Marcella Vida, Oana Sorina Lupse, Lacramioara Stoicu-Tivadar, Vasile Stoicu-Tivadar
2011 Misc conf
SACI
Sorin Puscoci, Lacramioara Stoicu-Tivadar, Vasile Stoicu-Tivadar, Dorin Berian, Florin Serbanescu, Silviu Ionita, Flavius Bajan
2011 Misc conf
SACI
Vasile Stoicu-Tivadar, Dorin Berian
2011 conf
MIE
Vasile Topac, Vasile Stoicu-Tivadar
2011 conf
EFMI-STC
Raul Robu, Vasile Stoicu-Tivadar
2011 conf
EFMI-STC
Norbert Gal, Vasile Stoicu-Tivadar
2010 conf
EFMI-STC
Lacramioara Stoicu-Tivadar, Vasile Stoicu-Tivadar, Dorin Berian
2009 Misc conf
SACI
Vasile Stoicu-Tivadar, Lacramioara Stoicu-Tivadar, Vasile Topac, Dorin Berian
2009 Misc conf
SACI
Vasile Stoicu-Tivadar, Dorin Berian
2009 conf
AICT
Vasile Topac, Vasile Stoicu-Tivadar
2009 conf
MIE
Vasile Topac, Vasile Stoicu-Tivadar
2007 Misc conf
SACI
Vasile Stoicu-Tivadar, Dorin Berian, D. Nica
2006 J jnl
Int. J. Medical Informatics
Lacramioara Stoicu-Tivadar, Vasile Stoicu-Tivadar
2006 conf
MIE
Lacramioara Stoicu-Tivadar, Francesco Sicurello, Vasile Stoicu-Tivadar, Victor Moga, Mariana Moga, Gianni Pellicanò, Giannluca Ronco
2003 conf
MIE
Lacramioara Stoicu-Tivadar, Vasile Stoicu-Tivadar, Marius Marginean, Dorin Berian
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 == []