Calogero M. Oddo

20 papers Journal 8Unranked 12
YearRankTypeTitle / Venue / Authors
2025 conf
MetroInd4.0 & IoT
Lisa A. Bernardo, D. Siorpaes, A. Vaghi, G. Desoli, Calogero M. Oddo, Fabrizia Auletta
2022 conf
dHealth
Max Haberbusch, Lisa A. Bernardo, Laura Galassi, Calogero M. Oddo, Francesco Moscato
2021 conf
MetroInd4.0&IoT
Daniela Lo Presti, Martina Zaltieri, Joshua Di Tocco, Carlo Massaroni, Giacomo D'Alesio, Jessica D'Abbraccio, Mariangela Filosa, Calogero M. Oddo, Maria Chiara Carrozza, Maurizio Ferrarin, Marco Di Rienzo, Emiliano Schena
2020 J jnl
Sensors
Daniela Lo Presti, Arianna Carnevale, Jessica D'Abbraccio, Luca Massari, Carlo Massaroni, Riccardo Sabbadini, Martina Zaltieri, Joshua Di Tocco, Marco Bravi, Sandra Miccinilli, Silvia Sterzi, Umile Giuseppe Longo, Vincenzo Denaro, Michele A. Caponero, Domenico Formica, Calogero M. Oddo, Emiliano Schena
2020 J jnl
Neural Networks
Udaya Bhaskar Rongala, Alberto Mazzoni, Anton Spanne, Henrik Jörntell, Calogero M. Oddo
2020 conf
I2MTC
Martina Zaltieri, Daniela Lo Presti, Carlo Massaroni, Emiliano Schena, Jessica D'Abbraccio, Luca Massari, Calogero M. Oddo, Domenico Formica, Michele A. Caponero, Marco Bravi, Sandra Miccinilli, Silvia Sterzi
2019 conf
MeMeA
Chiara Romano, Daniela Lo Presti, Emiliano Schena, Carlo Massaroni, Domenico Formica, Michele A. Caponero, Calogero M. Oddo, Jessica D'Abbraccio, Luca Massari, Umile Giuseppe Longo, Alessandra Berton
2019 conf
MeMeA
Daniela Lo Presti, Carlo Massaroni, Joshua Di Tocco, Emiliano Schena, Domenico Formica, Michele Arturo Caponero, Umile Giuseppe Longo, Arianna Carnevale, Jessica D'Abbraccio, Luca Massari, Calogero M. Oddo
2019 conf
MetroInd4.0&IoT
Jessica D'Abbraccio, Andrea Aliperta, Calogero M. Oddo, Martina Zaltieri, Eduardo Palermo, Luca Massari, Giuseppe Terruso, Edoardo Sinibaldi, Magdalena Kowalczyk, Emiliano Schena
2019 J jnl
Frontiers Neurorobotics
Luca Massari, Calogero M. Oddo, Edoardo Sinibaldi, Renaud Detry, Joseph Bowkett, Kalind C. Carpenter
2018 J jnl
Sensors
Francesca Sorgini, Luca Massari, Jessica D'Abbraccio, Eduardo Palermo, Arianna Menciassi, Petar B. Petrovic, Alberto Mazzoni, Maria Chiara Carrozza, Fiona N. Newell, Calogero M. Oddo
2017 J jnl
Sensors
Rocco Antonio Romeo, Calogero M. Oddo, Maria Chiara Carrozza, Eugenio Guglielmelli, Loredana Zollo
2016 conf
EMBC
Clara Genna, Fiorenzo Artoni, Chiara Fanciullacci, Carmelo Chisari, Calogero M. Oddo, Silvestro Micera
2016 J jnl
Sensors
Giuseppe Airò Farulla, Daniele Pianu, Marco Cempini, Mario Cortese, Ludovico Orlando Russo, Marco Indaco, Roberto Nerino, Antonio Chimienti, Calogero M. Oddo, Nicola Vitiello
2015 conf
Symbiotic
Silvestro Micera, Jacopo Carpaneto, Stanisa Raspopovic, Giuseppe Granata, Alberto Mazzoni, Calogero M. Oddo, Christian Cipriani, Thomas Stieglitz, Matthias Müller, Xavier Navarro, Jaume del Valle, Hans Scherberger, Luigi Raffo, Massimo Barbaro, Danilo Pani, Paolo Maria Rossini
2012 J jnl
Frontiers Neurorobotics
Leo Pape, Calogero M. Oddo, Marco Controzzi, Christian Cipriani, Alexander Förster, Maria Chiara Carrozza, Jürgen Schmidhuber
2011 J jnl
IEEE Trans. Robotics
Calogero M. Oddo, Marco Controzzi, Lucia Beccai, Christian Cipriani, Maria Chiara Carrozza
2010 conf
EuroHaptics (2)
Hoi-Fei Kwok, Kerry Darkins, Calogero M. Oddo, Lucia Beccai, Alan M. Wing
2009 conf
ROBIO
Calogero M. Oddo, Lucia Beccai, Giovanni Gerardo Muscolo, Maria Chiara Carrozza
2006 conf
EMBC
Nicola Vitiello, Umberto Olcese, Calogero M. Oddo, Jacopo Carpaneto, Silvestro Micera, Maria Chiara Carrozza, Paolo Dario
tests/integration/test_pe_extractor.py
← Index tests/integration/test_pe_extractor.py python
"""
Integration tests for the PEExtractor base class.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration, pytest.mark.pe]


class TestPEExtractorInitialization:
    """Tests for PEExtractor initialization."""

    def test_pe_extractor_with_valid_pe(self, pe_binary_path, mock_logger):
        """Test PEExtractor initialization with valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            assert extractor.pe is not None
            assert extractor.filepath == pe_binary_path

    def test_pe_extractor_with_provided_pe_object(self, pe_binary_path, mock_logger, pe_object):
        """Test PEExtractor initialization with pre-existing PE object."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger, pe=pe_object)

            # Should use the provided PE object, not create a new one
            assert extractor.pe is pe_object

    def test_pe_extractor_with_invalid_file(self, elf_binary_path, mock_logger):
        """Test PEExtractor initialization with non-PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should return None for pe when file is not a valid PE
            assert extractor.pe is None
            # Logger should have recorded an error
            assert mock_logger.error.called


class TestPEExtractorMethods:
    """Tests for PEExtractor helper methods."""

    def test_check_dotnet_true(self, pe_binary_path, mock_logger):
        """Test _check_dotnet returns True for .NET PE."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            # The test PE file is a .NET binary
            if extractor.pe is not None:
                result = extractor._check_dotnet()
                # d8637bdbcfc9112fcb1f0167b398e771 is a .NET binary
                assert result is True

    def test_check_dotnet_false(self, elf_binary_path, mock_logger):
        """Test _check_dotnet returns False for non-PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should return False when PE is None
            result = extractor._check_dotnet()
            assert result is False

    def test_is_signed_false(self, pe_binary_path, mock_logger):
        """Test _is_signed method."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is not None:
                result = extractor._is_signed()
                # Result depends on the actual binary
                assert isinstance(result, bool)

    def test_has_overlay(self, pe_binary_path, mock_logger):
        """Test _has_overlay method."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is not None:
                result = extractor._has_overlay()
                assert isinstance(result, bool)


class TestGeneratePEFileObject:
    """Tests for _generate_pefile_object method."""

    def test_generate_pefile_object_valid(self, pe_binary_path, mock_logger):
        """Test _generate_pefile_object with valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            # The PE object should be created successfully
            assert extractor.pe is not None

    def test_generate_pefile_object_invalid(self, temp_text_file, mock_logger):
        """Test _generate_pefile_object with invalid file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(temp_text_file, mock_logger)

            # Should return None for invalid PE
            assert extractor.pe is None


class TestGenerateDotNetFileObject:
    """Tests for _generate_dotnetfile_object method."""

    def test_generate_dotnetfile_object_valid(self, pe_binary_path, mock_logger):
        """Test _generate_dotnetfile_object with .NET PE file."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is not None and extractor._check_dotnet():
                dotnet, error = extractor._generate_dotnetfile_object()
                # Should create dotnet object for .NET PE
                assert dotnet is not None
                assert error is None

    def test_generate_dotnetfile_object_invalid(self, elf_binary_path, mock_logger):
        """Test _generate_dotnetfile_object with non-.NET file."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

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

            dotnet, error = extractor._generate_dotnetfile_object()
            # Should return error for non-.NET file
            assert dotnet is None
            assert error is not None


class TestPEExtractorTag:
    """Tests for tag method in PE extractors."""

    def test_pe_features_tag(self, pe_binary_path, mock_logger):
        """Test that PEFeaturesExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_FEATURES.value

    def test_pe_import_tag(self, pe_binary_path, mock_logger):
        """Test that PEImportExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_IMPORT.value

    def test_pe_section_tag(self, pe_binary_path, mock_logger):
        """Test that PESectionExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_SECTION.value


class TestPEExtractorClickHouseTable:
    """Tests for get_clickhouse_table method in PE extractors."""

    def test_pe_features_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PEFeaturesExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)
            assert extractor.get_clickhouse_table() == "redb_pe_features"

    def test_pe_import_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PEImportExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)
            assert extractor.get_clickhouse_table() == "redb_pe_imports"

    def test_pe_section_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PESectionExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)
            assert extractor.get_clickhouse_table() == "redb_pe_sections"


class TestPEExtractorPrepareExportData:
    """Tests for prepare_export_data method in PE extractors."""

    def test_pe_features_prepare_export_elasticsearch(self, pe_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is not None:
                # First extract
                extractor.extract()
                result = extractor.prepare_export_data("ElasticsearchExporter")
                # Should return the pe_features dataclass
                assert result is extractor.pe_features

    def test_pe_features_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is not None:
                # First extract
                extractor.extract()
                result = extractor.prepare_export_data("ClickHouseExporter")

                # Should return tuple of (data, column_names, column_type_names)
                assert isinstance(result, tuple)
                assert len(result) == 3
                data, column_names, column_type_names = result
                assert isinstance(data, list)
                assert isinstance(column_names, list)
                assert isinstance(column_type_names, list)
                # Column names and types should match in length
                assert len(column_names) == len(column_type_names)