Manuel Chica

65 papers B 9Misc 1Journal 46Unranked 9
YearRankTypeTitle / Venue / Authors
2024 J jnl
Expert Syst. Appl.
Zikai Zhang, Manuel Chica, Qiuhua Tang, Zixiang Li, Liping Zhang
2024 J jnl
Knowl. Based Syst.
Yuying Zhu, Wenbo Li, Chengyi Xia, Manuel Chica
2024 J jnl
IEEE Trans. Cybern.
Zikai Zhang, Qiuhua Tang, Manuel Chica, Zixiang Li
2024 J jnl
CoRR
Gui Zhang, Yichao Yao, Ziyan Zeng, Minyu Feng, Manuel Chica
2023 J jnl
Int. J. Fuzzy Syst.
Jesús Giráldez-Cru, Manuel Chica, Oscar Cordón
2023 J jnl
Inf. Fusion
Víctor Vargas-Pérez, Pablo Mesejo, Manuel Chica, Oscar Cordón
2023 J jnl
CoRR
Juan Francisco Robles, Manuel Chica, Ramón Filgueira, Antonio Agüera, Sergio Damas
2023 J jnl
Appl. Math. Comput.
Manuel Chica, Juan M. Hernández, Matjaz Perc
2023 J jnl
Prog. Artif. Intell.
Elena Romero, Manuel Chica, Sergio Damas, William Rand
2023 conf
CAI
Manuel Chica, Oscar Cordón, Juan Francisco Robles, A. Garrido, Jose Mingot, Sergio Damas
2022 conf
IberSPEECH
Manuel Chica, Alejandro Gómez Alanís, Eros Rosello, Angel M. Gomez, José A. González, Antonio M. Peinado
2022 J jnl
Knowl. Based Syst.
Raymond Chiong, Sandeep Dhakal, Timothy Chaston, Manuel Chica
2022 conf
IberSPEECH
Ángel M. Gómez, Victoria E. Sánchez, Antonio M. Peinado, Juan M. Martín-Doñas, Alejandro Gómez Alanís, Amelia Villegas-Morcillo, Eros Rosello, Manuel Chica, Celia García, Iván López-Espejo
2022 conf
IberSPEECH
Eros Rosello, Alejandro Gómez Alanís, Manuel Chica, Angel M. Gomez, José A. González, Antonio M. Peinado
2022 B conf
FUZZ-IEEE
Jesús Giráldez-Cru, Manuel Chica, Oscar Cordón
2021 J jnl
Knowl. Based Syst.
Jesús Giráldez-Cru, Manuel Chica, Oscar Cordón
2021 J jnl
Appl. Soft Comput.
Zikai Zhang, Qiuhua Tang, Manuel Chica
2021 J jnl
IEEE Comput. Intell. Mag.
Manuel Chica, Juan M. Hernández, Casiano Manrique-de-Lara-Peñate, Raymond Chiong
2021 J jnl
CoRR
Manuel Chica, Juan M. Hernández, Casiano Manrique-de-Lara-Peñate, Raymond Chiong
2021 J jnl
Expert Syst. Appl.
Amir Sayyed-Alikhani, Manuel Chica, Ali Mohammadi
2021 J jnl
CoRR
Manuel Chica, Juan M. Hernández, Francisco C. Santos
2021 J jnl
Eng. Appl. Artif. Intell.
Ignacio Moya, Enrique Bermejo Nievas, Manuel Chica, Oscar Cordón
2021 J jnl
IEEE Access
Ignacio Moya, Manuel Chica, Oscar Cordón
2021 B conf
CEC
Víctor Vargas-Pérez, Manuel Chica, Oscar Cordón
2021 J jnl
Telematics Informatics
Ignacio Moya, Manuel Chica, José L. Sáez-Lozano, Oscar Cordón
2021 J jnl
Simul.
Hung Khanh Nguyen, Raymond Chiong, Manuel Chica, Richard H. Middleton
2020 B conf
FUZZ-IEEE
Jesús Giráldez-Cru, Manuel Chica, Oscar Cordón, Francisco Herrera
2020 J jnl
Appl. Math. Comput.
Sandeep Dhakal, Raymond Chiong, Manuel Chica, Richard H. Middleton
2020 J jnl
Expert Syst. Appl.
Juan Francisco Robles, Manuel Chica, Oscar Cordón
2020 J jnl
Int. J. Intell. Syst.
Jesús Giráldez-Cru, Manuel Chica, Oscar Cordón, Francisco Herrera
2020 J jnl
Comput. Ind. Eng.
Zikai Zhang, Qiuhua Tang, Manuel Chica
2019 J jnl
Decis. Support Syst.
Ignacio Moya, Manuel Chica, Oscar Cordón
2019 B conf
CEC
Hung Khanh Nguyen, Raymond Chiong, Manuel Chica, Richard H. Middleton, Sandeep Dhakal
2019 J jnl
Comput. Ind. Eng.
Ignacio Moya, Manuel Chica, Joaquín Bautista
2019 J jnl
J. Artif. Soc. Soc. Simul.
Hung Khanh Nguyen, Raymond Chiong, Manuel Chica, Richard H. Middleton, Dung Thi Kim Pham
2019 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Manuel Chica, Raymond Chiong, José J. Ramasco, Hussein A. Abbass
2018 J jnl
IEEE Trans. Evol. Comput.
Manuel Chica, Raymond Chiong, Michael Kirley, Hisao Ishibuchi
2018 J jnl
Swarm Evol. Comput.
Enrique Bermejo Nievas, Manuel Chica, Sergio Damas, Sancho Salcedo-Sanz, Oscar Cordón
2018 Misc conf
HAIS
Enrique Bermejo Nievas, Manuel Chica, Sergio Damas, Sancho Salcedo-Sanz, Oscar Cordón
2018 J jnl
IEEE Trans. Cybern.
Krzysztof Trawinski, Manuel Chica, David P. Pancho, Sergio Damas, Oscar Cordón
2017 J jnl
Knowl. Based Syst.
Ignacio Moya, Manuel Chica, José L. Sáez-Lozano, Oscar Cordón
2017 B conf
CEC
Manuel Chica, Raymond Chiong, Marc T. P. Adam, Sergio Damas, Timm Teubner
2017 B conf
CEC
Enrique Bermejo Nievas, Manuel Chica, Sancho Salcedo-Sanz, Oscar Cordón
2017 J jnl
CoRR
Manuel Chica, Raymond Chiong, José J. Ramasco, Hussein A. Abbass
2017 J jnl
Inf. Sci.
Manuel Chica, José Barranquero, Tomasz Kajdanowicz, Sergio Damas, Oscar Cordón
2016 J jnl
Decis. Support Syst.
Manuel Chica, Oscar Cordón, Sergio Damas, Valentin Iglesias, Jose Mingot
2016 B conf
CEC
Juan Francisco Robles, Manuel Chica, Oscar Cordón
2015 conf
SSCI
Manuel Chica, Joaquín Bautista, Sergio Damas, Oscar Cordón
2015 J jnl
Soft Comput.
Manuel Chica, Oscar Cordón, Sergio Damas, Joaquín Bautista
2015 J jnl
CoRR
Manuel Chica, Pascual Campoy Cervera
2015 J jnl
CoRR
Krzysztof Trawinski, Manuel Chica, David P. Pancho, Sergio Damas, Oscar Cordón
2013 J jnl
Appl. Soft Comput.
Juan Rada-Vilela, Manuel Chica, Oscar Cordón, Sergio Damas
2013 J jnl
Comput. Biol. Medicine
Manuel Chica, Pascual Campoy Cervera, María A. Pérez, Tomás Rodríguez, Rubén Rodríguez, Óscar Valdemoros
2012 J jnl
Eng. Appl. Artif. Intell.
Manuel Chica, Oscar Cordón, Sergio Damas, Joaquín Bautista
2012 J jnl
Comput. Biol. Medicine
Manuel Chica, Pascual Campoy Cervera, María A. Pérez, Tomás Rodríguez, Rubén Rodríguez, Óscar Valdemoros
2011 conf
CIPLS
Manuel Chica, Oscar Cordón, Sergio Damas, Joaquín Bautista
2011 J jnl
Memetic Comput.
Manuel Chica, Oscar Cordón, Sergio Damas, Joaquín Bautista
2011 J jnl
Comput. Ind. Eng.
Manuel Chica, Oscar Cordón, Sergio Damas
2011 J jnl
Expert Syst. Appl.
Manuel Chica, Oscar Cordón, Sergio Damas, Joaquín Bautista
2011 B conf
IEEE Congress on Evolutionary Computation
Manuel Chica, Oscar Cordón, Sergio Damas
2010 conf
IEA/AIE (3)
Manuel Chica, Oscar Cordón, Sergio Damas, Joaquín Bautista
2010 J jnl
Inf. Sci.
Manuel Chica, Oscar Cordón, Sergio Damas, Joaquín Bautista
2009 conf
MCDM
Manuel Chica, Oscar Cordón, Sergio Damas, Joaquín Bautista
2008 conf
ANTS Conference
Manuel Chica, Oscar Cordón, Sergio Damas, Jordi Pereira, Joaquín Bautista
2007 B conf
FUZZ-IEEE
Jose Joaquin Aguilera, Manuel Chica, María José del Jesus, Francisco Herrera
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"