Xavier Pueyo

55 papers B 1C 2Misc 1Journal 33Unranked 16
YearRankTypeTitle / Venue / Authors
2024 J jnl
ACM Journal on Computing and Cultural Heritage
Imanol Muñoz-Pandiella, Xavier Pueyo, Carles Bosch
2024 J jnl
ACM Journal on Computing and Cultural Heritage
Anna Pagès-Vilà, Xavier Pueyo, Imanol Muñoz-Pandiella
2023 J jnl
Comput. Graph.
Imanol Muñoz-Pandiella, Carlos Andújar, Begonya Cayuela, Xavier Pueyo, Carles Bosch
2022 conf
GCH
Imanol Muñoz-Pandiella, Oscar Argudo, Immaculada Lorés Otzet, Joan Font Comas, Genís Àvila Casademont, Xavier Pueyo, Carlos Andújar
2021 conf
CEIG
Milagros Guardia, Paola Pogliani, Giulia Bordi, Panayiotis Charalambous, Carlos Andújar, Imanol Muñoz-Pandiella, Xavier Pueyo
2020 conf
GCH
Milagros Guardia, Paola Pogliani, Giulia Bordi, Panayiotis Charalambous, Carlos Andújar, Xavier Pueyo
2020 J jnl
Comput. Graph.
Oriol Pueyo, Albert Sabrià, Xavier Pueyo, Gustavo Patow, Michael Wimmer
2019 J jnl
Graph. Model.
Oriol Pueyo, Xavier Pueyo, Gustavo Patow
2018 J jnl
IEEE Trans. Vis. Comput. Graph.
Imanol Muñoz-Pandiella, Carles Bosch, Nicolas Mérillou, Gustavo Patow, Stéphane Mérillou, Xavier Pueyo
2017 J jnl
Comput. Graph. Forum
Imanol Muñoz-Pandiella, Carles Bosch, Nicolas Mérillou, Xavier Pueyo, Stéphane Mérillou
2016 conf
MAM@EGSR
Imanol Muñoz-Pandiella, Carles Bosch, Nicolas Mérillou, Xavier Pueyo, Stéphane Mérillou, Gustavo Patow
2014 J jnl
Frontiers Robotics AI
Xavier Pueyo, Carles Bosch, Gustavo Patow
2013 conf
Eurographics (Lab Presentations)
Xavier Pueyo
2009 J jnl
Vis. Comput.
Jean-François El Hajjar, Vincent Jolivet, Djamchid Ghazanfarpour, Xavier Pueyo
2009 conf
CEIG
Adrià Forés, Sumanta N. Pattanaik, Carles Bosch, Xavier Pueyo
2008 J jnl
Comput. Graph. Forum
Carles Bosch, Xavier Pueyo, Stéphane Mérillou, Djamchid Ghazanfarpour
2007 J jnl
Comput. Graph.
Gustavo Patow, Xavier Pueyo, Àlvar Vinacua
2006 conf
Eurographics (Tutorials)
Céline Loscos, Katrien Jacobs, Gustavo Patow, Xavier Pueyo
2006 conf
EGPGV@EuroVis/EGVE
Juan A. Magallon, Gustavo Patow, Francisco J. Serón, Xavier Pueyo
2005 J jnl
Comput. Graph. Forum
Gustavo Patow, Xavier Pueyo
2005 J jnl
Vis. Comput.
Eva Cerezo, Frederic Pérez, Xavier Pueyo, Francisco J. Serón, François X. Sillion
2005 conf
SCCG
Juan-Roberto Jiménez, Karol Myszkowski, Xavier Pueyo
2005 J jnl
Vis. Comput.
Juan-Roberto Jiménez, Xavier Pueyo
2004 J jnl
Comput. Graph. Forum
Carles Bosch, Xavier Pueyo, Stéphane Mérillou, Djamchid Ghazanfarpour
2004 J jnl
Int. J. Shape Model.
Gustavo Patow, Xavier Pueyo, Àlvar Vinacua
2003 ed.
Eurographics (State of the Art Reports)
Claudio Montani, Xavier Pueyo
2003 J jnl
Comput. Graph. Forum
Gustavo Patow, Xavier Pueyo
2003 conf
Eurographics (Posters)
Juan-Roberto Jiménez, Xavier Pueyo
2003 J jnl
IEEE Trans. Vis. Comput. Graph.
Ignacio Martín, Xavier Pueyo, Dani Tost
2003 J jnl
Comput. Graph.
Manuel Próspero dos Santos, Xavier Pueyo, Luiz Velho
2002 C ed.
EGPGV
Dirk Bartz, Xavier Pueyo, Erik Reinhard
2001 C conf
Computer Graphics International
Gonzalo Besuievsky, Xavier Pueyo
2001 J jnl
Comput. Animat. Virtual Worlds
Gonzalo Besuievsky, Xavier Pueyo
2000 Misc conf
PG
Frederic Pérez, Ignacio Martín, Xavier Pueyo, François X. Sillion
2000 J jnl
Parallel Distributed Comput. Pract.
Marta Fairén González, Xavier Pueyo
1998 conf
Computer Animation and Simulation
Gonzalo Besuievsky, Xavier Pueyo
1998 J jnl
Comput. Graph. Forum
Ignacio Martín, Xavier Pueyo, Dani Tost
1998 J jnl
Comput. Graph.
Ignacio Martín, Frederic Pérez, Xavier Pueyo
1997 J jnl
Comput. Graph.
Carlos Ureña, Xavier Pueyo, Juan Carlos Torres
1997 B conf
Graphics Interface
Ignacio Martín, Xavier Pueyo, Dani Tost
1997 conf
Rendering Techniques
Frederic Pérez, Xavier Pueyo, François X. Sillion
1997 J jnl
Comput. Animat. Virtual Worlds
Xavier Pueyo, Dani Tost, Ignacio Martín, Blanca Garcia
1997 conf
PRS
Luc Renambot, Bruno Arnaldi, Thierry Priol, Xavier Pueyo
1997 J jnl
Parallel Comput.
Bruno Arnaldi, Thierry Priol, Luc Renambot, Xavier Pueyo
1996 J jnl
Comput. Graph.
Xavier Pueyo, Frederic Pérez, Joan Antoni Sellarès, Josep Suy
1996 J jnl
Vis. Comput.
Mateu Sbert, Xavier Pueyo, László Neumann, Werner Purgathofer
1996 ed.
Rendering Techniques
Xavier Pueyo, Peter Schröder
1995 conf
Rendering Techniques
Mateu Sbert, Frederic Pérez, Xavier Pueyo
1995 conf
Rendering Techniques
László Neumann, Werner Purgathofer, Robert F. Tobler, Attila Neumann, Pavol Eliás, Martin Feda, Xavier Pueyo
1994 J jnl
Comput. Animat. Virtual Worlds
Josep Vilaplana, Xavier Pueyo
1991 J jnl
Vis. Comput.
Xavier Pueyo
1988 J jnl
Vis. Comput.
Dani Tost, Xavier Pueyo
1988 J jnl
Comput. Graph. Forum
Xavier Pueyo, Dani Tost
1987 conf
Eurographics
Xavier Pueyo, Joan Carles Mendoza
1987 J jnl
IEEE Computer Graphics and Applications
Xavier Pueyo, Pere Brunet
tests/integration/test_base_extractor.py
← Index tests/integration/test_base_extractor.py python
"""
Integration tests for the base Extractor class.
"""
import pytest
import hashlib
import math
from unittest.mock import Mock, patch, MagicMock
from collections import Counter

pytestmark = [pytest.mark.integration]


class TestExtractorStaticMethods:
    """Tests for static methods in Extractor class."""

    def test_process_binary_string_printable(self):
        """Test processing a printable binary string."""
        from redb.extractors.extractor import Extractor

        # Test with printable ASCII characters
        input_bytes = b"Hello World\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "Hello World"

    def test_process_binary_string_non_printable(self):
        """Test processing a string with non-printable characters."""
        from redb.extractors.extractor import Extractor

        # Test with non-printable characters
        input_bytes = b"\x01\x02Hello\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x01" in result
        assert "\\x02" in result
        assert "Hello" in result

    def test_process_binary_string_empty(self):
        """Test processing an empty binary string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == ""

    def test_process_binary_string_all_printable(self):
        """Test processing a fully printable string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"TestString123"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "TestString123"

    def test_remove_non_utf8_valid(self):
        """Test removing non-UTF8 characters from valid UTF8 string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"Hello World"
        result = Extractor.remove_non_utf8(input_bytes)
        assert result == b"Hello World"

    def test_remove_non_utf8_with_invalid(self):
        """Test removing non-UTF8 characters from mixed string."""
        from redb.extractors.extractor import Extractor

        # Mix of valid UTF8 and invalid bytes
        input_bytes = b"Hello\xff\xfeWorld"
        result = Extractor.remove_non_utf8(input_bytes)
        # Should remove the invalid bytes
        assert b"\xff" not in result
        assert b"\xfe" not in result
        assert b"Hello" in result
        assert b"World" in result

    def test_remove_non_utf8_empty(self):
        """Test removing non-UTF8 from empty string."""
        from redb.extractors.extractor import Extractor

        result = Extractor.remove_non_utf8(b"")
        assert result == b""


class TestExtractorEntropyCalculation:
    """Tests for entropy calculation in Extractor class."""

    def test_calculate_entropy_empty_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with empty data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(b"")
            assert result == 0.0

    def test_calculate_entropy_uniform_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with uniform (low entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # All same bytes = 0 entropy
            uniform_data = b"\x00" * 256
            result = extractor.calculate_entropy(uniform_data)
            assert result == 0.0

    def test_calculate_entropy_random_data(self, elf_binary_path, mock_logger, high_entropy_data):
        """Test entropy calculation with random (high entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(high_entropy_data)
            # Random data should have entropy close to 8 (max for bytes)
            assert result > 7.0

    def test_calculate_entropy_binary_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with binary data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # Two equally distributed values = 1 bit entropy
            binary_data = b"\x00\x01" * 128
            result = extractor.calculate_entropy(binary_data)
            assert abs(result - 1.0) < 0.01

    def test_calculate_entropy_string_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with string data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # String with two equally distributed characters
            string_data = "ab" * 100
            result = extractor.calculate_entropy(string_data)
            assert abs(result - 1.0) < 0.01


class TestExtractorInitialization:
    """Tests for Extractor initialization."""

    def test_extractor_hashes_computed_on_init(self, elf_binary_path, mock_logger, known_hashes):
        """Test that hashes are computed during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.md5 == known_hashes['md5']
            assert extractor.sha1 == known_hashes['sha1']
            assert extractor.sha256 == known_hashes['sha256']

    def test_extractor_hash_dataclass_created(self, elf_binary_path, mock_logger, known_hashes):
        """Test that Hash dataclass is created during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.hash.md5 == known_hashes['md5']
            assert extractor.hash.sha1 == known_hashes['sha1']
            assert extractor.hash.sha256 == known_hashes['sha256']

    def test_extractor_binary_cached_property(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that binary content is loaded as cached property."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            # Access binary property
            binary = extractor.binary
            assert binary == elf_binary_content

            # Second access should return cached value (same id)
            assert extractor.binary is binary

    def test_extractor_with_exporters(self, elf_binary_path, mock_logger, mock_print_exporter):
        """Test extractor initialization with exporters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            assert len(extractor.exporters) == 1
            assert extractor.exporters[0] is mock_print_exporter

    def test_extractor_with_index_prefix(self, elf_binary_path, mock_logger):
        """Test extractor initialization with custom index prefix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                index_prefix="custom_prefix"
            )

            assert "custom_prefix" in extractor.elastic_index

    def test_extractor_known_benign_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_benign flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                known_benign=True
            )

            assert extractor.known_benign is True
            assert extractor.known_malicious is False

    def test_extractor_known_malicious_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_malicious flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                known_malicious=True
            )

            assert extractor.known_benign is False
            assert extractor.known_malicious is True


class TestExtractorExportData:
    """Tests for export_data method."""

    def test_export_data_with_print_exporter(self, elf_binary_path, mock_logger, mock_print_exporter, capsys):
        """Test export_data with PrintExporter."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            result = extractor.export_data()
            # Should succeed with PrintExporter
            assert result is True

    def test_export_data_no_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters configured."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[]
            )

            result = extractor.export_data()
            # Should succeed with no exporters (nothing to export)
            assert result is True


class TestExtractorEdgeCases:
    """Tests for edge cases in Extractor class."""

    def test_extractor_with_nonexistent_file(self, mock_logger):
        """Test extractor with non-existent file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            with pytest.raises(FileNotFoundError):
                BasicPropertiesExtractor("/nonexistent/file.bin", mock_logger)

    def test_entropy_none_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with None returns 0."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(None)
            assert result == 0.0

    def test_process_binary_string_high_bytes(self):
        """Test processing binary string with high byte values."""
        from redb.extractors.extractor import Extractor

        # Characters above 126 are non-printable
        input_bytes = b"\x7f\x80\x81\xff"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x7f" in result
        assert "\\x80" in result
        assert "\\xff" in result