Nathan D. Ratliff

93 papers A* 19A 12B 1C 1Misc 5Journal 49Unranked 6
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Ritvik Singh, Karl Van Wyk, Pieter Abbeel, Jitendra Malik, Nathan D. Ratliff, Ankur Handa
2025 A conf
IROS
Ritvik Singh, Jason Jingzhou Liu, Karl Van Wyk, Yu-Wei Chao, Jean-Francois Lafleche, Florian Shkurti, Nathan D. Ratliff, Ankur Handa
2024 Misc conf
CoRL
Tyler Ga Wei Lum, Martin Matak, Viktor Makoviychuk, Ankur Handa, Arthur Allshire, Tucker Hermans, Nathan D. Ratliff, Karl Van Wyk
2024 J jnl
CoRR
Tyler Ga Wei Lum, Martin Matak, Viktor Makoviychuk, Ankur Handa, Arthur Allshire, Tucker Hermans, Nathan D. Ratliff, Karl Van Wyk
2024 J jnl
CoRR
Ritvik Singh, Arthur Allshire, Ankur Handa, Nathan D. Ratliff, Karl Van Wyk
2024 A* conf
ICRA
Karl Van Wyk, Ankur Handa, Viktor Makoviychuk, Yijie Guo, Arthur Allshire, Nathan D. Ratliff
2024 J jnl
CoRR
Karl Van Wyk, Ankur Handa, Viktor Makoviychuk, Yijie Guo, Arthur Allshire, Nathan D. Ratliff
2024 J jnl
CoRR
Ritvik Singh, Jingzhou Liu, Karl Van Wyk, Yu-Wei Chao, Jean-Francois Lafleche, Florian Shkurti, Nathan D. Ratliff, Ankur Handa
2023 J jnl
CoRR
Balakumar Sundaralingam, Siva Kumar Sastry Hari, Adam Fishman, Caelan Reed Garrett, Karl Van Wyk, Valts Blukis, Alexander Millane, Helen Oleynikova, Ankur Handa, Fabio Ramos, Nathan D. Ratliff, Dieter Fox
2023 A* conf
ICRA
Balakumar Sundaralingam, Siva Kumar Sastry Hari, Adam Fishman, Caelan Reed Garrett, Karl Van Wyk, Valts Blukis, Alexander Millane, Helen Oleynikova, Ankur Handa, Fabio Ramos, Nathan D. Ratliff, Dieter Fox
2023 J jnl
CoRR
Nathan D. Ratliff, Karl Van Wyk
2023 A* conf
ICRA
Weiming Zhi, Iretiayo Akinola, Karl Van Wyk, Nathan D. Ratliff, Fabio Ramos
2022 J jnl
IEEE Robotics Autom. Lett.
Karl Van Wyk, Mandy Xie, Anqi Li, Muhammad Asif Rana, Buck Babich, Bryan Peele, Qian Wan, Iretiayo Akinola, Balakumar Sundaralingam, Dieter Fox, Byron Boots, Nathan D. Ratliff
2022 Misc conf
CoRL
Mandy Xie, Ankur Handa, Stephen Tyree, Dieter Fox, Harish Ravichandar, Nathan D. Ratliff, Karl Van Wyk
2021 J jnl
CoRR
Mandy Xie, Anqi Li, Karl Van Wyk, Frank Dellaert, Byron Boots, Nathan D. Ratliff
2021 J jnl
CoRR
Mohak Bhardwaj, Balakumar Sundaralingam, Arsalan Mousavian, Nathan D. Ratliff, Dieter Fox, Fabio Ramos, Byron Boots
2021 A* conf
ICRA
Nathan D. Ratliff, Karl Van Wyk, Mandy Xie, Anqi Li, Muhammad Asif Rana
2021 J jnl
CoRR
Karl Van Wyk, Mandy Xie, Anqi Li, Muhammad Asif Rana, Buck Babich, Bryan Peele, Qian Wan, Iretiayo Akinola, Balakumar Sundaralingam, Dieter Fox, Byron Boots, Nathan D. Ratliff
2021 conf
Robotics: Science and Systems
Anqi Li, Ching-An Cheng, Muhammad Asif Rana, Man Xie, Karl Van Wyk, Nathan D. Ratliff, Byron Boots
2021 J jnl
CoRR
Anqi Li, Ching-An Cheng, Muhammad Asif Rana, Man Xie, Karl Van Wyk, Nathan D. Ratliff, Byron Boots
2021 J jnl
IEEE Trans Autom. Sci. Eng.
Ching-An Cheng, Mustafa Mukadam, Jan Issac, Stan Birchfield, Dieter Fox, Byron Boots, Nathan D. Ratliff
2021 Misc conf
CoRL
Mohak Bhardwaj, Balakumar Sundaralingam, Arsalan Mousavian, Nathan D. Ratliff, Dieter Fox, Fabio Ramos, Byron Boots
2021 A conf
IROS
Muhammad Asif Rana, Anqi Li, Dieter Fox, Sonia Chernova, Byron Boots, Nathan D. Ratliff
2020 B conf
RO-MAN
Jim Mainprice, Nathan D. Ratliff, Marc Toussaint, Stefan Schaal
2020 J jnl
CoRR
Jim Mainprice, Nathan D. Ratliff, Marc Toussaint, Stefan Schaal
2020 A conf
IROS
Adam Fishman, Chris Paxton, Wei Yang, Dieter Fox, Byron Boots, Nathan D. Ratliff
2020 A* conf
ICRA
Ankur Handa, Karl Van Wyk, Wei Yang, Jacky Liang, Yu-Wei Chao, Qian Wan, Stan Birchfield, Nathan D. Ratliff, Dieter Fox
2020 conf
L4DC
Muhammad Asif Rana, Anqi Li, Dieter Fox, Byron Boots, Fabio Ramos, Nathan D. Ratliff
2020 J jnl
CoRR
Muhammad Asif Rana, Anqi Li, Dieter Fox, Byron Boots, Fabio Ramos, Nathan D. Ratliff
2020 J jnl
CoRR
Nathan D. Ratliff, Karl Van Wyk, Mandy Xie, Anqi Li, Muhammad Asif Rana
2020 J jnl
CoRR
Mandy Xie, Karl Van Wyk, Anqi Li, Muhammad Asif Rana, Dieter Fox, Byron Boots, Nathan D. Ratliff
2020 A* conf
ICRA
Michelle A. Lee, Carlos Florensa, Jonathan Tremblay, Nathan D. Ratliff, Animesh Garg, Fabio Ramos, Dieter Fox
2020 J jnl
CoRR
Michelle A. Lee, Carlos Florensa, Jonathan Tremblay, Nathan D. Ratliff, Animesh Garg, Fabio Ramos, Dieter Fox
2020 J jnl
CoRR
Ian Abraham, Ankur Handa, Nathan D. Ratliff, Kendall Lowrey, Todd D. Murphey, Dieter Fox
2020 J jnl
IEEE Robotics Autom. Lett.
Ian Abraham, Ankur Handa, Nathan D. Ratliff, Kendall Lowrey, Todd D. Murphey, Dieter Fox
2020 J jnl
CoRR
Nathan D. Ratliff, Karl Van Wyk, Mandy Xie, Anqi Li, Muhammad Asif Rana
2020 J jnl
CoRR
Nathan D. Ratliff, Karl Van Wyk, Mandy Xie, Anqi Li, Muhammad Asif Rana
2020 J jnl
CoRR
Ching-An Cheng, Mustafa Mukadam, Jan Issac, Stan Birchfield, Dieter Fox, Byron Boots, Nathan D. Ratliff
2020 A* conf
ICRA
Xiangyun Meng, Nathan D. Ratliff, Yu Xiang, Dieter Fox
2020 J jnl
CoRR
Muhammad Asif Rana, Anqi Li, Dieter Fox, Sonia Chernova, Byron Boots, Nathan D. Ratliff
2019 A* conf
ICRA
Yevgen Chebotar, Ankur Handa, Viktor Makoviychuk, Miles Macklin, Jan Issac, Nathan D. Ratliff, Dieter Fox
2019 J jnl
CoRR
Ankur Handa, Karl Van Wyk, Wei Yang, Jacky Liang, Yu-Wei Chao, Qian Wan, Stan Birchfield, Nathan D. Ratliff, Dieter Fox
2019 A* conf
ICRA
Alexander Sasha Lambert, Mustafa Mukadam, Balakumar Sundaralingam, Nathan D. Ratliff, Byron Boots, Dieter Fox
2019 J jnl
CoRR
Alexander Lambert, Mustafa Mukadam, Balakumar Sundaralingam, Nathan D. Ratliff, Byron Boots, Dieter Fox
2019 A* conf
ICRA
Giovanni Sutanto, Nathan D. Ratliff, Balakumar Sundaralingam, Yevgen Chebotar, Zhe Su, Ankur Handa, Dieter Fox
2019 Misc conf
CoRL
Muhammad Asif Rana, Anqi Li, Harish Ravichandar, Mustafa Mukadam, Sonia Chernova, Dieter Fox, Byron Boots, Nathan D. Ratliff
2019 A* conf
ICRA
Xiangyun Meng, Nathan D. Ratliff, Yu Xiang, Dieter Fox
2019 J jnl
CoRR
Xiangyun Meng, Nathan D. Ratliff, Yu Xiang, Dieter Fox
2019 A* conf
ICML
Ching-An Cheng, Xinyan Yan, Nathan D. Ratliff, Byron Boots
2019 A conf
IROS
Chris Paxton, Nathan D. Ratliff, Clemens Eppner, Dieter Fox
2019 J jnl
CoRR
Chris Paxton, Nathan D. Ratliff, Clemens Eppner, Dieter Fox
2019 Misc conf
CoRL
Mustafa Mukadam, Ching-An Cheng, Dieter Fox, Byron Boots, Nathan D. Ratliff
2019 J jnl
CoRR
Mustafa Mukadam, Ching-An Cheng, Dieter Fox, Byron Boots, Nathan D. Ratliff
2019 A* conf
ICRA
Balakumar Sundaralingam, Alexander Sasha Lambert, Ankur Handa, Byron Boots, Tucker Hermans, Stan Birchfield, Nathan D. Ratliff, Dieter Fox
2019 J jnl
CoRR
Xiangyun Meng, Nathan D. Ratliff, Yu Xiang, Dieter Fox
2019 J jnl
CoRR
Adam Fishman, Chris Paxton, Wei Yang, Nathan D. Ratliff, Dieter Fox
2018 J jnl
CoRR
Yevgen Chebotar, Ankur Handa, Viktor Makoviychuk, Miles Macklin, Jan Issac, Nathan D. Ratliff, Dieter Fox
2018 J jnl
CoRR
Giovanni Sutanto, Nathan D. Ratliff, Balakumar Sundaralingam, Yevgen Chebotar, Zhe Su, Ankur Handa, Dieter Fox
2018 J jnl
CoRR
Ching-An Cheng, Xinyan Yan, Nathan D. Ratliff, Byron Boots
2018 C conf
WAFR
Ching-An Cheng, Mustafa Mukadam, Jan Issac, Stan Birchfield, Dieter Fox, Byron Boots, Nathan D. Ratliff
2018 J jnl
CoRR
Ching-An Cheng, Mustafa Mukadam, Jan Issac, Stan Birchfield, Dieter Fox, Byron Boots, Nathan D. Ratliff
2018 J jnl
IEEE Robotics Autom. Lett.
Daniel Kappler, Franziska Meier, Jan Issac, Jim Mainprice, Cristina Garcia Cifuentes, Manuel Wuthrich, Vincent Berenz, Stefan Schaal, Nathan D. Ratliff, Jeannette Bohg
2018 J jnl
CoRR
Nathan D. Ratliff, Jan Issac, Daniel Kappler
2018 J jnl
CoRR
Balakumar Sundaralingam, Alexander Sasha Lambert, Ankur Handa, Byron Boots, Tucker Hermans, Stan Birchfield, Nathan D. Ratliff, Dieter Fox
2017 J jnl
CoRR
Daniel Kappler, Franziska Meier, Nathan D. Ratliff, Stefan Schaal
2017 A conf
IROS
Daniel Kappler, Franziska Meier, Nathan D. Ratliff, Stefan Schaal
2017 J jnl
CoRR
Daniel Kappler, Franziska Meier, Jan Issac, Jim Mainprice, Cristina Garcia Cifuentes, Manuel Wüthrich, Vincent Berenz, Stefan Schaal, Nathan D. Ratliff, Jeannette Bohg
2017 J jnl
Int. J. Robotics Res.
Alexander Broad, Jacob Arkin, Nathan D. Ratliff, Thomas M. Howard, Brenna D. Argall
2016 J jnl
Big Data
Nathan D. Ratliff, Franziska Meier, Daniel Kappler, Stefan Schaal
2016 J jnl
CoRR
Nathan D. Ratliff, Franziska Meier, Daniel Kappler, Stefan Schaal
2016 J jnl
CoRR
Nathan D. Ratliff, Marc Toussaint, Jeannette Bohg, Stefan Schaal
2016 A conf
IROS
Franziska Meier, Daniel Kappler, Nathan D. Ratliff, Stefan Schaal
2016 A conf
IROS
Jim Mainprice, Nathan D. Ratliff, Stefan Schaal
2015 conf
Robotics: Science and Systems
Andreas Doerr, Nathan D. Ratliff, Jeannette Bohg, Marc Toussaint, Stefan Schaal
2015 J jnl
CoRR
Bharath Sankaran, Jeannette Bohg, Nathan D. Ratliff, Stefan Schaal
2015 A* conf
ICRA
Nathan D. Ratliff, Marc Toussaint, Stefan Schaal
2014 A conf
IROS
Marc Toussaint, Nathan D. Ratliff, Jeannette Bohg, Ludovic Righetti, Peter Englert, Stefan Schaal
2013 J jnl
Int. J. Robotics Res.
Matthew Zucker, Nathan D. Ratliff, Anca D. Dragan, Mihail Pivtoraiko, Matthew Klingensmith, Christopher M. Dellin, J. Andrew Bagnell, Siddhartha S. Srinivasa
2012 J jnl
CoRR
Avleen Singh Bijral, Nathan D. Ratliff, Nathan Srebro
2011 A* conf
ICRA
Anca D. Dragan, Nathan D. Ratliff, Siddhartha S. Srinivasa
2011 J jnl
Int. J. Robotics Res.
Matthew Zucker, Nathan D. Ratliff, Martin Stolle, Joel E. Chestnutt, J. Andrew Bagnell, Christopher G. Atkeson, James Kuffner
2011 A conf
UAI
Avleen Singh Bijral, Nathan D. Ratliff, Nathan Srebro
2009 A* conf
ICRA
Nathan D. Ratliff, Matthew Zucker, J. Andrew Bagnell, Siddhartha S. Srinivasa
2009 A conf
AISTATS
Nathan D. Ratliff, Brian D. Ziebart, Kevin M. Peterson, J. Andrew Bagnell, Martial Hebert, Anind K. Dey, Siddhartha S. Srinivasa
2009 J jnl
Auton. Robots
Nathan D. Ratliff, David Silver, J. Andrew Bagnell
2009 A conf
IROS
Brian D. Ziebart, Nathan D. Ratliff, Garratt Gallagher, Christoph Mertz, Kevin M. Peterson, James A. Bagnell, Martial Hebert, Anind K. Dey, Siddhartha S. Srinivasa
2009 A* conf
IJCAI
Young-Woo Seo, Nathan D. Ratliff, Chris Urmson
2008 conf
Robotics: Science and Systems
Rosen Diankov, Nathan D. Ratliff, Dave Ferguson, Siddhartha S. Srinivasa, James Kuffner
2007 A conf
AISTATS
Nathan D. Ratliff, J. Andrew Bagnell, Martin Zinkevich
2007 conf
Humanoids
Nathan D. Ratliff, James A. Bagnell, Siddhartha S. Srinivasa
2007 A* conf
IJCAI
Nathan D. Ratliff, J. Andrew Bagnell
2006 conf
NIPS
Nathan D. Ratliff, David M. Bradley, J. Andrew Bagnell, Joel E. Chestnutt
2006 A* conf
ICML
Nathan D. Ratliff, J. Andrew Bagnell, Martin Zinkevich
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)