Ilaria Castellani

69 papers A* 1A 1B 7C 2Journal 31Unranked 23
YearRankTypeTitle / Venue / Authors
2025 conf
ESOP (1)
Giovanni Bernardi, Ilaria Castellani, Paul Laforgue, Léo Stefanesco
2025 J jnl
CoRR
Giovanni Bernardi, Ilaria Castellani, Paul Laforgue, Léo Stefanesco
2024 C conf
PPDP
Ilaria Castellani
2024 J jnl
J. Log. Algebraic Methods Program.
Luc Edixhoven, Sung-Shik Jongmans, José Proença, Ilaria Castellani
2024 C ed.
COORDINATION
Ilaria Castellani, Francesco Tiezzi
2024 J jnl
Fundam. Informaticae
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini
2024 conf
PLACES@ETAPS
Ilaria Castellani, Paola Giannini
2023 conf
EXPRESS/SOS
Ilaria Castellani, Ornela Dardha, Luca Padovani, Davide Sangiorgi
2023 J jnl
J. Log. Algebraic Methods Program.
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini
2023 J jnl
J. Log. Algebraic Methods Program.
Ilaria Castellani, Pedro R. D'Argenio, Mohammad Reza Mousavi, Ana Sokolova
2023 ed.
PLACES@ETAPS
Ilaria Castellani, Alceste Scalas
2022 conf
PLACES@ETAPS
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini
2022 B conf
CONCUR
Ilaria Castellani, Paul Gastin, Orna Kupferman, Mickael Randour, Davide Sangiorgi
2022 J jnl
CoRR
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini
2021 J jnl
CoRR
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini
2020 J jnl
Theor. Comput. Sci.
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini, Ross Horne
2019 conf
Models, Languages, and Tools for Concurrent and Distributed Programming
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini
2019 J jnl
Acta Informatica
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini
2019 J jnl
J. Log. Algebraic Methods Program.
Ilaria Castellani, Mohammad Reza Mousavi
2017 B conf
CONCUR
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Paola Giannini
2017 J jnl
J. Log. Algebraic Methods Program.
Ilaria Castellani, Mohammad Reza Mousavi
2016 J jnl
Bull. EATCS
Ilaria Castellani, Silvia Crafa
2016 J jnl
Math. Struct. Comput. Sci.
Sara Capecchi, Ilaria Castellani, Mariangiola Dezani-Ciancaglini
2016 conf
PLACES
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Ugo de'Liguoro
2016 J jnl
Formal Aspects Comput.
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Jorge A. Pérez
2015 J jnl
CoRR
Massimo Bartoletti, Ilaria Castellani, Pierre-Malo Deniélou, Mariangiola Dezani-Ciancaglini, Silvia Ghilezan, Jovanka Pantovic, Jorge A. Pérez, Peter Thiemann, Bernardo Toninho, Hugo Torres Vieira
2015 J jnl
J. Log. Algebraic Methods Program.
Massimo Bartoletti, Ilaria Castellani, Pierre-Malo Deniélou, Mariangiola Dezani-Ciancaglini, Silvia Ghilezan, Jovanka Pantovic, Jorge A. Pérez, Peter Thiemann, Bernardo Toninho, Hugo Torres Vieira
2014 J jnl
Bull. EATCS
Ilaria Castellani
2014 conf
BEAT
Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Jorge A. Pérez
2014 J jnl
Inf. Comput.
Sara Capecchi, Ilaria Castellani, Mariangiola Dezani-Ciancaglini
2013 conf
TGC
Pejman Attar, Ilaria Castellani
2011 conf
TGC
Viviana Bono, Sara Capecchi, Ilaria Castellani, Mariangiola Dezani-Ciancaglini
2011 conf
EXPRESS
Sara Capecchi, Ilaria Castellani, Mariangiola Dezani-Ciancaglini
2010 B conf
CONCUR
Sara Capecchi, Ilaria Castellani, Mariangiola Dezani-Ciancaglini, Tamara Rezk
2008 conf
Concurrency, Graphs and Models
Gérard Boudol, Ilaria Castellani, Matthew Hennessy, Mogens Nielsen, Glynn Winskel
2007 conf
SecCO@CONCUR
Ilaria Castellani
2007 J jnl
J. Log. Algebraic Methods Program.
Ana Almeida Matos, Gérard Boudol, Ilaria Castellani
2005 conf
APC 25
Roberto M. Amadio, Gérard Boudol, Frédéric Boussinot, Ilaria Castellani
2005 J jnl
CoRR
Roberto M. Amadio, Gérard Boudol, Ilaria Castellani, Frédéric Boussinot
2002 J jnl
Theor. Comput. Sci.
Gérard Boudol, Ilaria Castellani
2001 A* conf
ICALP
Gérard Boudol, Ilaria Castellani
2001 ch.
Handbook of Process Algebra
Ilaria Castellani
1999 ed.
EXPRESS
Ilaria Castellani, Björn Victor
1999 conf
EXPRESS
Ilaria Castellani, Björn Victor
1999 conf
FSTTCS
Ilaria Castellani, Madhavan Mukund, P. S. Thiagarajan
1998 ed.
EXPRESS
Ilaria Castellani, Catuscia Palamidessi
1998 J jnl
Theor. Comput. Sci.
Roberto M. Amadio, Ilaria Castellani, Davide Sangiorgi
1998 conf
EXPRESS
Ilaria Castellani, Catuscia Palamidessi
1998 conf
FSTTCS
Ilaria Castellani, Matthew Hennessy
1997 J jnl
Theor. Comput. Sci.
Ilaria Castellani, Guo-Qiang Zhang
1996 J jnl
Theor. Comput. Sci.
André Arnold, Ilaria Castellani
1996 B conf
CONCUR
Roberto M. Amadio, Ilaria Castellani, Davide Sangiorgi
1995 J jnl
Int. J. Found. Comput. Sci.
Ilaria Castellani
1994 J jnl
Formal Aspects Comput.
Gérard Boudol, Ilaria Castellani, Matthew Hennessy, Astrid Kiehn
1994 J jnl
Inf. Comput.
Gérard Boudol, Ilaria Castellani
1993 A conf
STACS
Ilaria Castellani
1993 B conf
MFCS
Ilaria Castellani
1993 J jnl
Theor. Comput. Sci.
Gérard Boudol, Ilaria Castellani, Matthew Hennessy, Astrid Kiehn
1992 B conf
CONCUR
Gérard Boudol, Ilaria Castellani, Matthew Hennessy, Astrid Kiehn
1991 B conf
MFCS
Gérard Boudol, Ilaria Castellani, Matthew Hennessy, Astrid Kiehn
1990 conf
Semantics of Systems of Concurrent Processes
Gérard Boudol, Ilaria Castellani
1989 J jnl
J. ACM
Ilaria Castellani, Matthew Hennessy
1988 J jnl
Theor. Comput. Sci.
Gérard Boudol, Ilaria Castellani
1988 conf
REX Workshop
Gérard Boudol, Ilaria Castellani
1987 J jnl
J. Comput. Syst. Sci.
Ilaria Castellani
1987 conf
TAPSOFT, Vol.1
Gérard Boudol, Ilaria Castellani
1985 conf
TAPSOFT, Vol.1
Ilaria Castellani
1982 conf
Graph-Grammars and Their Application to Computer Science
Ilaria Castellani, Ugo Montanari
1982 conf
Formal Description of Programming Concepts
Ilaria Castellani, Paola Franceschi, Ugo Montanari
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"