Vincent van der Leest

25 papers A 5C 1Journal 7Unranked 12
YearRankTypeTitle / Venue / Authors
2016 J jnl
J. Cryptogr. Eng.
Roel Maes, Vincent van der Leest, Erik van der Sluis, Frans M. J. Willems
2015 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Mafalda Cortez, Said Hamdioui, Ali Kaichouhi, Vincent van der Leest, Roel Maes, Geert Jan Schrijen
2015 A conf
CHES
Roel Maes, Vincent van der Leest, Erik van der Sluis, Frans M. J. Willems
2015 J jnl
IACR Cryptol. ePrint Arch.
Roel Maes, Vincent van der Leest, Erik van der Sluis, Frans M. J. Willems
2014 conf
HOST
Roel Maes, Vincent van der Leest
2014 conf
ISSE
Vincent van der Leest, Roel Maes, Geert Jan Schrijen, Pim Tuyls
2014 conf
TRUST
André Schaller, Tolga Arul, Vincent van der Leest, Stefan Katzenbeisser
2013 conf
HOST
Mafalda Cortez, Said Hamdioui, Vincent van der Leest, Roel Maes, Geert Jan Schrijen
2013 A conf
DATE
Vincent van der Leest, Pim Tuyls
2013 conf
TrustED@CCS
Robbert van den Berg, Boris Skoric, Vincent van der Leest
2013 J jnl
IACR Cryptol. ePrint Arch.
Robbert van den Berg, Boris Skoric, Vincent van der Leest
2013 J jnl
IACR Cryptol. ePrint Arch.
Anthony Van Herrewege, Vincent van der Leest, André Schaller, Stefan Katzenbeisser, Ingrid Verbauwhede
2013 conf
TrustED@CCS
Anthony Van Herrewege, Vincent van der Leest, André Schaller, Stefan Katzenbeisser, Ingrid Verbauwhede
2012 conf
HOST
Peter Simons, Erik van der Sluis, Vincent van der Leest
2012 A conf
DATE
Geert Jan Schrijen, Vincent van der Leest
2012 conf
Cryptography and Security
Vincent van der Leest, Erik van der Sluis, Geert Jan Schrijen, Pim Tuyls, Helena Handschuh
2012 conf
ESSCIRC
Roel Maes, Vladimir Rozic, Ingrid Verbauwhede, Patrick Koeberl, Erik van der Sluis, Vincent van der Leest
2012 A conf
CHES
Vincent van der Leest, Bart Preneel, Erik van der Sluis
2011 conf
NordSec
Mathias Claes, Vincent van der Leest, An Braeken
2011 C conf
ISCAS
Georgios N. Selimis, Mario Konijnenburg, Maryam Ashouei, Jos Huisken, Harmke de Groot, Vincent van der Leest, Geert Jan Schrijen, Marten van Hulst, Pim Tuyls
2011 conf
STC@CCS
Ilze Eichhorn, Patrick Koeberl, Vincent van der Leest
2011 A conf
CHES
Stefan Katzenbeisser, Ünal Koçabas, Vincent van der Leest, Ahmad-Reza Sadeghi, Geert Jan Schrijen, Heike Schröder, Christian Wachsmann
2011 J jnl
IACR Cryptol. ePrint Arch.
Stefan Katzenbeisser, Ünal Koçabas, Vincent van der Leest, Ahmad-Reza Sadeghi, Geert Jan Schrijen, Heike Schröder, Christian Wachsmann
2011 J jnl
J. Cryptogr. Eng.
Stefan Katzenbeisser, Ünal Koçabas, Vincent van der Leest, Ahmad-Reza Sadeghi, Geert Jan Schrijen, Christian Wachsmann
2010 conf
STC@CCS
Vincent van der Leest, Geert Jan Schrijen, Helena Handschuh, Pim Tuyls
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 == []