Oscar Danilo Montoya

76 papers Journal 68Unranked 8
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Ind. Electron.
Diego Montoya-Acevedo, Oscar Danilo Montoya, Alejandro Garces Ruiz, Catalina González-Castaño, Carlos Restrepo
2025 J jnl
IEEE Access
Diego Montoya-Acevedo, Ignacio Parraguez-Garrido, Walter Julián Gil-González, Oscar Danilo Montoya, Catalina González-Castaño
2025 J jnl
IEEE Access
Jhony Andrés Guzmán-Henao, Rubén Iván Bolaños, Luis Fernando Grisales-Noreña, Oscar Danilo Montoya, Jesús C. Hernández
2025 J jnl
Comput.
Laura Sofía Avellaneda-Gómez, Brandon Cortés-Caicedo, Oscar Danilo Montoya, Jesús María López-Lezama
2025 J jnl
IEEE Access
Brandon Cortés-Caicedo, Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, W. Gil-Gonzalez, Jesús C. Hernández
2025 J jnl
Digit.
Roberto A. Pava-Díaz, Juan Manuel Sánchez Céspedes, Oscar Danilo Montoya
2024 J jnl
IEEE Access
Diego Montoya-Acevedo, Walter Julián Gil-González, Oscar Danilo Montoya, Carlos Restrepo, Catalina González-Castaño
2024 J jnl
IEEE Access
Oscar Danilo Montoya, Federico Martin Serra, Walter Julián Gil-González, Luis Fernando Grisales-Noreña, Jesús C. Hernández
2024 J jnl
IEEE Access
Jhony Andrés Guzmán-Henao, Rubén Iván Bolaños, Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, Harold R. Chamorro
2024 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Federico Martin Serra, Gerardo Espinosa-Pérez
2024 J jnl
IEEE Access
Víctor Manuel Garrido-Arévalo, Walter Julián Gil-González, Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, Jesús C. Hernández
2023 J jnl
IEEE Access
Oscar Danilo Montoya, Walter Julián Gil-González, Sebastián Riffo, Carlos Restrepo, Catalina González-Castaño
2023 J jnl
IEEE Access
Walter Julián Gil-González, Sebastián Riffo, Oscar Danilo Montoya, Carlos Restrepo, Jesús C. Hernández
2023 J jnl
IEEE Access
Walter Julián Gil-González, Oscar Danilo Montoya, Jesús C. Hernández
2023 J jnl
Comput.
Oscar Danilo Montoya, Oscar David Florez-Cediel, Walter Julián Gil-González
2023 J jnl
Algorithms
German Francisco Barreto-Parra, Brandon Cortés-Caicedo, Oscar Danilo Montoya
2023 J jnl
Algorithms
Walter Julián Gil-González, Oscar Danilo Montoya, César Leonardo Trujillo Rodríguez
2023 J jnl
Inf.
Daniela Patricia Bohórquez-Álvarez, Karen Dayanna Niño-Perdomo, Oscar Danilo Montoya
2023 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, Walter Julián Gil-González
2023 J jnl
Algorithms
Laura Patricia García-Pineda, Oscar Danilo Montoya
2023 J jnl
Algorithms
Nicolas Santamaria-Henao, Oscar Danilo Montoya, César Leonardo Trujillo Rodríguez
2023 J jnl
Comput.
Adriana Rincón-Miranda, Giselle Viviana Gantiva-Mora, Oscar Danilo Montoya
2023 J jnl
Sensors
Oscar Danilo Montoya, Ángeles Medina-Quesada, Walter Julián Gil-González
2022 J jnl
Comput.
David Gilberto Gracia-Velásquez, Andrés Steven Morales-Rodríguez, Oscar Danilo Montoya
2022 J jnl
Comput.
Brandon Cortés-Caicedo, Oscar Danilo Montoya, Andres Arias-Londoño
2022 J jnl
Comput.
Jose Luis Cruz-Reyes, Sergio Steven Salcedo-Marcelo, Oscar Danilo Montoya
2022 J jnl
Algorithms
Javier Andrés Mora-Burbano, Cristian David Fonseca-Díaz, Oscar Danilo Montoya
2022 J jnl
Sensors
Ángeles Medina-Quesada, Oscar Danilo Montoya, Jesús C. Hernández
2022 J jnl
Comput.
Oscar Danilo Montoya, Federico Martin Serra, Alexander Molina-Cabrera
2022 J jnl
Comput.
Oscar Danilo Montoya, Walter Julián Gil-González, Alejandro Garcés
2022 J jnl
Comput.
Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, Carlos Andrés Ramos-Paja
2022 J jnl
Sensors
Brandon Cortés-Caicedo, Federico Molina-Martin, Luis Fernando Grisales-Noreña, Oscar Danilo Montoya, Jesús C. Hernández
2022 J jnl
Algorithms
Brayan Enrique Aguirre-Angulo, Lady Carolina Giraldo-Bello, Oscar Danilo Montoya, Francisco David Moya
2022 J jnl
Sensors
Víctor Manuel Garrido, Oscar Danilo Montoya, Ángeles Medina-Quesada, Jesús C. Hernández
2022 J jnl
IEEE Access
Ehsan Akbari, Nima Shafaghatian, Farhad Zishan, Oscar Danilo Montoya, Diego Armando Giral-Ramírez
2022 J jnl
Algorithms
Simón Sepúlveda-García, Oscar Danilo Montoya, Alejandro Garcés
2022 J jnl
Comput.
Oscar Danilo Montoya, Edwin Rivas Trujillo, Diego Armando Giral-Ramírez
2022 J jnl
Algorithms
Oscar Danilo Montoya, Walter Julián Gil-González, Luis Fernando Grisales-Noreña
2022 J jnl
Comput.
Martin M. Sánchez-Mora, David Lionel Bernal-Romero, Oscar Danilo Montoya, Walter Mauircio Villa-Acevedo, Jesús María López-Lezama
2021 J jnl
Comput.
Oscar Danilo Montoya, Juan S. Giraldo, Luis Fernando Grisales-Noreña, Harold R. Chamorro, Lázaro Alvarado-Barrios
2021 J jnl
Symmetry
Brandon Cortés-Caicedo, Laura Sofía Avellaneda-Gómez, Oscar Danilo Montoya, Lázaro Alvarado-Barrios, César Álvarez-Arroyo
2021 J jnl
Comput.
Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, Edwin Rivas Trujillo
2021 J jnl
Comput.
Camilo Andres Arenas-Acuña, Jonathan Andres Rodriguez-Contreras, Oscar Danilo Montoya, Edwin Rivas Trujillo
2021 J jnl
Comput.
Oscar Danilo Montoya, Alexander Molina-Cabrera, Luis Fernando Grisales-Noreña, Ricardo A. Hincapié, Mauricio Granada
2021 J jnl
Symmetry
Oscar Danilo Montoya, Andres Arias-Londoño, Luis Fernando Grisales-Noreña, José Ángel Barrios, Harold R. Chamorro
2021 J jnl
Comput.
Walter Julián Gil-González, Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, Andrés Escobar-Mejía
2021 J jnl
Comput.
John Fernando Martínez-Gil, Nicolas Alejandro Moyano-García, Oscar Danilo Montoya, Jorge Alexander Alarcon-Villamil
2021 J jnl
Sensors
Walter Julián Gil-González, Oscar Danilo Montoya, Carlos Restrepo, Jesús C. Hernández
2021 J jnl
Comput.
David Lionel Bernal-Romero, Oscar Danilo Montoya, Andres Arias-Londoño
2021 J jnl
Appl. Soft Comput.
Juan Marín-Quintero, César Orozco-Henao, Winston S. Percybrooks, Juan Carlos Vélez, Oscar Danilo Montoya, W. Gil-Gonzalez
2020 J jnl
Symmetry
Walter Julián Gil-González, Federico Martin Serra, Oscar Danilo Montoya, Carlos Alberto Ramírez, César Orozco-Henao
2020 J jnl
Symmetry
Oscar Danilo Montoya, Walter Julián Gil-González, Carlos Ramírez-Vanegas
2020 J jnl
Comput. Electr. Eng.
Oscar Danilo Montoya, Walter Julián Gil-González
2020 J jnl
Symmetry
Oscar Danilo Montoya, Walter Julián Gil-González, Juan Antonio Dominguez-Jimenez, Alexander Molina-Cabrera, Diego Armando Giral-Ramírez
2020 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya
2020 J jnl
Symmetry
Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, W. Gil-Gonzalez, Gerardo Alcalá, Quetzalcoatl Hernández-Escobedo
2020 J jnl
IMA J. Math. Control. Inf.
Sofía Avila-Becerril, Gerardo Espinosa-Pérez, Oscar Danilo Montoya, Alejandro Garcés
2020 J jnl
Symmetry
Oscar Danilo Montoya, Walter Julián Gil-González, Alexander Molina-Cabrera
2020 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, Walter Julián Gil-González
2020 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Walter Julián Gil-González, Víctor Manuel Garrido
2020 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Walter Julián Gil-González, Luis Fernando Grisales-Noreña
2019 conf
WEA
Luis Alejandro Rojas, Oscar Danilo Montoya, Javier Campillo
2019 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Walter Julián Gil-González, Alejandro Garcés
2019 conf
WEA
William Tadeo Amin, Oscar Danilo Montoya, Luis Fernando Grisales-Noreña
2019 conf
WEA
Luis Fernando Grisales-Noreña, Oscar Daniel Garzon-Rivera, Oscar Danilo Montoya, Carlos Andrés Ramos-Paja
2019 conf
WEA
Oscar Danilo Montoya, Ricardo A. Hincapié, Mauricio Granada
2019 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya
2019 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya
2019 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Walter Julián Gil-González, Alejandro Garcés
2019 conf
LASCAS
Walter Julián Gil-González, Oscar Danilo Montoya, Alejandro Garcés, Federico Martin Serra, Guillermo Magaldi
2019 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Víctor Manuel Garrido, Walter Julián Gil-González, Luis Fernando Grisales-Noreña
2019 conf
WEA
María Lourdes Manrique, Oscar Danilo Montoya, Víctor Manuel Garrido, Luis Fernando Grisales-Noreña, Walter Julián Gil-González
2019 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, Alejandro Garcés, Sofia Avila-Becerril, Gerardo Espinosa-Pérez, Federico Martin Serra
2019 conf
WEA
Oscar Danilo Montoya, Luis Fernando Grisales-Noreña, William Tadeo Amin, Luis Alejandro Rojas, Javier Campillo
2018 conf
LASCAS
Oscar Danilo Montoya, Alejandro Garces Ruiz, Federico Martin Serra, Guillermo Magaldi
2018 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Oscar Danilo Montoya, W. Gil-Gonzalez, Federico Martin Serra
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 == []