Victor Rivera

51 papers B 4Journal 26Unranked 19
YearRankTypeTitle / Venue / Authors
2023 conf
ICECET
Sebastian Luque, Victor Rivera, Nelly Huarcaya
2020 J jnl
SN Comput. Sci.
Victor Rivera, Bertrand Meyer
2020 J jnl
CoRR
Victor Rivera, Hamna Aslam, Alexandr Naumchev, Daniel de Carvalho, Mansur Khazeev, Manuel Mazzara
2020 B conf
ICECCS
Victor Rivera
2020 J jnl
CoRR
Victor Rivera
2020 book
Antonio Bucchiarone, Nicola Dragoni, Schahram Dustdar, Patricia Lago, Manuel Mazzara, Victor Rivera, Andrey Sadovykh
2020 ch.
Microservices, Science and Engineering
Manuel Mazzara, Antonio Bucchiarone, Nicola Dragoni, Victor Rivera
2019 conf
AINA Workshops
Dragos Strugar, Rasheed Hussain, Manuel Mazzara, Victor Rivera, Ilya Afanasyev, Jooyoung Lee
2019 J jnl
CoRR
Manuel Mazzara, Antonio Bucchiarone, Nicola Dragoni, Victor Rivera
2019 conf
FISEE
Victor Rivera, Hamna Aslam, Alexandr Naumchev, Daniel de Carvalho, Mansur Khazeev, Manuel Mazzara
2019 conf
TOOLS
Gheorghe Pinzaru, Victor Rivera
2018 J jnl
CoRR
Victor Rivera, Bertrand Meyer
2018 J jnl
CoRR
Victor Rivera, Bertrand Meyer
2018 conf
IEEE Conf. on Intelligent Systems
Vladislav Tkachuk, Maria Koreneva, Ilya Afanasyev, Victor Rivera, Manuel Mazzara
2018 conf
AINA Workshops
Sadyk Sayfullin, Fedor Akhmetov, Manuel Mazzara, Ruslan Mustafin, Victor Rivera
2018 conf
AINA Workshops
Rinat Khatipov, Aydar Negimatzhanov, Ilgiz Zamaleev, Anvar Zakirov, Manuel Mazzara, Victor Rivera
2018 J jnl
CoRR
Rinat Khatipov, Manuel Mazzara, Aydar Negimatzhanov, Victor Rivera, Anvar Zakirov, Ilgiz Zamaleev
2018 J jnl
CoRR
Dragos Strugar, Rasheed Hussain, Manuel Mazzara, Victor Rivera
2018 conf
SEDA
Victor Rivera, Jooyoung Lee, Manuel Mazzara
2018 B conf
AINA
Ruslan Rezin, Ilya Afanasyev, Manuel Mazzara, Victor Rivera
2018 J jnl
CoRR
Dragos Strugar, Rasheed Hussain, Manuel Mazzara, Victor Rivera, Jooyoung Lee, Ruslan Mustafin
2018 conf
iThings/GreenCom/CPSCom/SmartData
Dragos Strugar, Rasheed Hussain, Manuel Mazzara, Victor Rivera, Jooyoung Lee, Ruslan Mustafin
2018 J jnl
CoRR
Dragos Strugar, Rasheed Hussain, Jooyoung Lee, Manuel Mazzara, Victor Rivera
2018 J jnl
Soc. Netw. Anal. Min.
Jooyoung Lee, Rasheed Hussain, Victor Rivera, Davlatbek Isroilov
2018 conf
ICL (1)
Daniel de Carvalho, Rasheed Hussain, Adil Khan, Mansur Khazeev, JooYong Lee, Sergey Masyagin, Manuel Mazzara, Ruslan Mustafin, Alexandr Naumchev, Victor Rivera
2018 B conf
AINA
Almaz Melnikov, Jooyoung Lee, Victor Rivera, Manuel Mazzara, Luca Longo
2018 J jnl
CoRR
Almaz Melnikov, Manuel Mazzara, Victor Rivera, Jooyoung Lee, Luca Longo
2017 J jnl
Int. J. Softw. Tools Technol. Transf.
Victor Rivera, Néstor Cataño, Tim Wahls, Camilo Rueda
2017 J jnl
CoRR
Kizilov Mikhail, Antonio Bucchiarone, Manuel Mazzara, Larisa Safina, Victor Rivera
2017 J jnl
CoRR
Mansur Khazeev, Victor Rivera, Manuel Mazzara
2017 conf
MATES@VLDB
Sergei Solonets, Victor Drobny, Victor Rivera, Jooyoung Lee
2017 conf
BICOD
Andrei Lebedev, Jooyoung Lee, Victor Rivera, Manuel Mazzara
2017 J jnl
CoRR
Andrei Lebedev, Jooyoung Lee, Victor Rivera, Manuel Mazzara
2017 J jnl
CoRR
Manuel Mazzara, Kevin Khanda, Ruslan Mustafin, Victor Rivera, Larisa Safina, Alberto Sillitti
2017 J jnl
CoRR
Ruslan Rezin, Ilya Afanasyev, Manuel Mazzara, Victor Rivera
2017 J jnl
CoRR
Leonard Johard, Victor Rivera, Manuel Mazzara, Jooyoung Lee
2017 J jnl
CoRR
Daniel de Carvalho, Jooyoung Lee, Adil Khan, Manuel Mazzara, Mansur Khazeev, Ruslan Mustafin, Alexandr Naumchev, Victor Rivera
2017 J jnl
CoRR
Victor Rivera, Jooyoung Lee, Manuel Mazzara, Leonard Johard
2016 J jnl
CoRR
Victor Rivera
2016 B conf
AINA
Larisa Safina, Manuel Mazzara, Fabrizio Montesi, Victor Rivera
2016 conf
SEDA
Kizilov Mikhail, Antonio Bucchiarone, Manuel Mazzara, Larisa Safina, Victor Rivera
2016 conf
NFM
Néstor Cataño, Victor Rivera
2016 conf
SEDA
Mansur Khazeev, Victor Rivera, Manuel Mazzara, Leonard Johard
2016 conf
SOCA
Alexey Bandura, Nikita Kurilenko, Manuel Mazzara, Victor Rivera, Larisa Safina, Alexander Tchitchigin
2016 J jnl
CoRR
Alexey Bandura, Nikita Kurilenko, Manuel Mazzara, Victor Rivera, Larisa Safina, Alexander Tchitchigin
2016 conf
SEDA
Manuel Mazzara, Kevin Khanda, Ruslan Mustafin, Victor Rivera, Larisa Safina, Alberto Sillitti
2016 J jnl
CoRR
Alexander Tchitchigin, Larisa Safina, Manuel Mazzara, Mohamed Elwakil, Fabrizio Montesi, Victor Rivera
2016 conf
SEDA
Leonard Johard, Victor Rivera, Manuel Mazzara, Jooyoung Lee
2016 conf
FormaliSE@ICSE
Victor Rivera, Sukriti Bhattacharya, Néstor Cataño
2016 J jnl
CoRR
Alexandr Naumchev, Bertrand Meyer, Victor Rivera
2016 J jnl
CoRR
Mansur Khazeev, Victor Rivera, Manuel Mazzara, Alexander Tchitchigin
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 == []