Chang-Hwan Im

78 papers Journal 56Unranked 22
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Hyunsub Kim, Hyeseong Jeon, Chaeyoon Kim, Chunghwan Kim, HwyKuen Kwak, Tae-Nam Kim, Chang-Hwan Im
2025 conf
BCI
Minsu Kim, Chang-Hwan Im
2025 J jnl
NeuroImage
Ye-Sung Kim, Cheong-Un Kim, Hyojeong Han, Min-Young Kim, Soo-In Choi, Chang-Hwan Im
2024 J jnl
IEEE Trans. Learn. Technol.
Suhye Kim, Jung-Hwan Kim, Wooseok Hyung, Suhkyung Shin, Myoung Jin Choi, Dong Hwan Kim, Chang-Hwan Im
2024 J jnl
Comput. Methods Programs Biomed.
Sangjun Lee, Jimin Park, Chany Lee, Jeongyeol Ahn, Juhyoung Ryu, Sang-Hun Lee, Chang-Hwan Im
2024 J jnl
Comput. Biol. Medicine
Minsu Kim, Chang-Hwan Im
2024 J jnl
Sensors
Seonghun Park, Minsu Kim, Hyerin Nam, Jinuk Kwon, Chang-Hwan Im
2024 J jnl
Comput. Biol. Medicine
Jinuk Kwon, Jihun Hwang, Jee Eun Sung, Chang-Hwan Im
2023 J jnl
IEEE Trans. Learn. Technol.
Hodam Kim, Younsoo Chae, Suhye Kim, Chang-Hwan Im
2023 J jnl
Sensors
Chunghwan Kim, Ho-Seung Cha, Junghwan Kim, HwyKuen Kwak, Woojin Lee, Chang-Hwan Im
2023 J jnl
Virtual Real.
Ho-Seung Cha, Chang-Hwan Im
2023 J jnl
Eng. Appl. Artif. Intell.
Jinuk Kwon, Hyerin Nam, Younsoo Chae, Seungjae Lee, In Young Kim, Chang-Hwan Im
2023 conf
BCI
Jinuk Kwon, Jihun Hwang, Chang-Hwan Im
2022 J jnl
Expert Syst. Appl.
Hodam Kim, Dan Zhang, Laehyun Kim, Chang-Hwan Im
2022 J jnl
Virtual Real.
Ho-Seung Cha, Won-Du Chang, Chang-Hwan Im
2022 conf
BCI
Seonghun Park, Min-Su Kim, Hyerin Nam, Chang-Hwan Im
2022 J jnl
Frontiers Neuroinformatics
Miseon Shim, Chang-Hwan Im, Seung-Hwan Lee, Han-Jeong Hwang
2022 J jnl
IEEE Trans. Instrum. Meas.
Jisoo Ha, Kang-min Choi, Chang-Hwan Im
2022 J jnl
IEEE Trans. Affect. Comput.
Hodam Kim, Suhye Kim, Hongmin Kim, Youngsoo Ji, Chang-Hwan Im
2022 J jnl
Comput. Biol. Medicine
Sangjun Lee, Jimin Park, Da Som Choi, Chany Lee, Chang-Hwan Im
2022 J jnl
Frontiers Neuroinformatics
Jisoo Ha, Seonghun Park, Chang-Hwan Im
2022 J jnl
Expert Syst. Appl.
Jinuk Kwon, Chang-Hwan Im
2022 J jnl
Frontiers Neuroinformatics
Jinuk Kwon, Jihun Hwang, Hyerin Nam, Chang-Hwan Im
2022 J jnl
Virtual Real.
Ho-Seung Cha, Chang-Hwan Im
2021 J jnl
Sensors
Jihyeon Ha, Sangin Park, Chang-Hwan Im, Laehyun Kim
2021 conf
BCI
Seonghun Park, Jisoo Ha, Ho-Seung Cha, Kyeong-Gu Lee, Chang-Hwan Im
2021 J jnl
Frontiers Neuroinformatics
Seonghun Park, Do-Won Kim, Changhee Han, Chang-Hwan Im
2021 J jnl
Frontiers Neuroinformatics
Hodam Kim, Chang-Hwan Im
2020 J jnl
Sensors
Seonghun Park, Changhee Han, Chang-Hwan Im
2020 J jnl
Sensors
Changhee Han, Euijin Kim, Chang-Hwan Im
2020 conf
BCI
Seonghun Park, Ho-Seung Cha, Jinuk Kwon, Hodam Kim, Chang-Hwan Im
2020 J jnl
Sensors
Ho-Seung Cha, Changhee Han, Chang-Hwan Im
2020 J jnl
IEEE Access
Ho-Seung Cha, Seong-Jun Choi, Chang-Hwan Im
2019 conf
BCI
Changhee Han, Jinuk Kwon, Han-Jeong Hwang, Chang-Hwan Im
2019 J jnl
Comput. Intell. Neurosci.
Kang-min Choi, Seonghun Park, Chang-Hwan Im
2019 J jnl
Comput. Biol. Medicine
Jimin Park, Chany Lee, Sangjun Lee, Chang-Hwan Im
2019 J jnl
IEEE Access
Seonghun Park, Ho-Seung Cha, Chang-Hwan Im
2019 J jnl
NeuroImage
Elisabeth Parés-Pujolràs, Yong-Wook Kim, Chang-Hwan Im, Patrick Haggard
2019 J jnl
Sensors
Hodam Kim, Laehyun Kim, Chang-Hwan Im
2018 J jnl
Frontiers Neuroinformatics
Jaeyoung Shin, Jin Uk Kwon, Chang-Hwan Im
2018 conf
SCIS&ISIS
Joo-Hee Kwon, Euijin Kim, Chang-Hwan Im, Do-Won Kim
2018 J jnl
Sensors
Hodam Kim, Jihyeon Ha, Won-Du Chang, Wanjoo Park, Laehyun Kim, Chang-Hwan Im
2018 conf
BCI
Chang-Hee Han, Chang-Hwan Im
2018 J jnl
Sensors
Do Yeon Kim, Jinuk Kwon, Joo-Young Kim, Ho-Seung Cha, Yong-Wook Kim, In Young Kim, Chang-Hwan Im
2018 J jnl
Sensors
Soo-In Choi, Changhee Han, Ga-Young Choi, Jaeyoung Shin, Kwang Soup Song, Chang-Hwan Im, Han-Jeong Hwang
2018 J jnl
Int. J. Neural Syst.
Jaeyoung Shin, Chang-Hwan Im
2018 conf
EMBC
Taejin Choi, Chang-Hwan Im, Seung-Jong Kim, Hyungmin Kim, Jong Min Lee
2018 J jnl
IEEE Access
Jaeyoung Shin, Jin Uk Kwon, Jongkwan Choi, Chang-Hwan Im
2016 J jnl
Comput. Math. Methods Medicine
Won-Du Chang, Ho-Seung Cha, Chany Lee, Hoon-Chul Kang, Chang-Hwan Im
2016 J jnl
Comput. Methods Programs Biomed.
Won-Du Chang, Ho-Seung Cha, Kiwoong Kim, Chang-Hwan Im
2016 J jnl
Sensors
Hodam Kim, Jeong-Youn Kim, Chang-Hwan Im
2016 J jnl
Sensors
Won-Du Chang, Ho-Seung Cha, Chang-Hwan Im
2015 J jnl
Biomed. Signal Process. Control.
Jeong-Hwan Lim, Jun-Hak Lee, Han-Jeong Hwang, Dong Hwan Kim, Chang-Hwan Im
2015 conf
ASCC
Chang-Hwan Im, Jun-Hak Lee, Jeong-Hwan Lim
2014 J jnl
J. Appl. Math.
Chang-Hwan Im, Kiwoon Kwon, Hang Joon Jo, Pedro Serranho
2014 J jnl
J. Appl. Math.
Won-Du Chang, Chang-Hwan Im
2013 conf
BCI
Jeong-Hwan Lim, Han-Jeong Hwang, Chang-Hwan Im
2013 J jnl
Comput. Math. Methods Medicine
Chang-Hwan Im, Lei Ding, Yiwen Wang, Sung-Phil Kim
2013 conf
EMBC
Jun-Hak Lee, Jeong-Hwan Lim, Han-Jeong Hwang, Chang-Hwan Im
2013 conf
EMBC
Changhee Han, Han-Jeong Hwang, Jeong-Hwan Lim, Chang-Hwan Im
2013 J jnl
Int. J. Hum. Comput. Interact.
Han-Jeong Hwang, Soyoun Kim, Soobeom Choi, Chang-Hwan Im
2013 J jnl
Medical Biol. Eng. Comput.
Sun-Ae Park, Han-Jeong Hwang, Jeong-Hwan Lim, Jong-Ho Choi, Hyun-Kyo Jung, Chang-Hwan Im
2013 conf
BCI
Han-Jeong Hwang, Chang-Hwan Im, Sun-Ae Park
2013 conf
BCI
Han-Jeong Hwang, Jeong-Hwan Lim, Jun-Hak Lee, Chang-Hwan Im
2013 conf
EMBC
Jung-Hoon Kim, Do-Won Kim, Won Hyuk Chang, Yun-Hee Kim, Chang-Hwan Im
2013 conf
BCI
Chang-Hee Han, Han-Jeong Hwang, Chang-Hwan Im
2013 conf
ISBI
Jaejun Yoo, Jongmin Kim, Chang-Hwan Im, Jong Chul Ye
2013 conf
EMBC
Do-Won Kim, Seung-Hwan Lee, Chang-Hwan Im
2013 J jnl
Comput. Educ.
Pyoung Won Kim, Seo Young Kim, Miseon Shim, Chang-Hwan Im, Young-Min Shon
2012 conf
EMBC
Dong-Hyun Baek, Ha-Chul Jung, Seon Min Kim, Chang-Hwan Im, James Jungho Pak, Sang-Hoon Lee
2012 J jnl
J. Appl. Math.
Chang-Hwan Im, Kiwoon Kwon, Venky Krishnan, Pedro Serranho
2012 J jnl
J. Appl. Math.
Young-Jin Jung, Kyung-Hwan Kim, Chang-Hwan Im
2011 conf
EMBC
Do-Won Kim, Jae-Hyun Cho, Han-Jeong Hwang, Jeong-Hwan Lim, Chang-Hwan Im
2011 J jnl
Medical Biol. Eng. Comput.
Han-Jeong Hwang, Kyung-Hwan Kim, Young-Jin Jung, Do-Won Kim, Yong-Ho Lee, Chang-Hwan Im
2011 conf
EMBC
Jae-Hyun Cho, Young-Jin Jung, Hoon-Chul Kang, Heung Dong Kim, Chang-Hwan Im
2010 J jnl
NeuroImage
June Sic Kim, Chang-Hwan Im, Young-Jin Jung, Eun Young Kim, Sang Kun Lee, Chun Kee Chung
2007 J jnl
Medical Biol. Eng. Comput.
Chang-Hwan Im
2005 J jnl
IEEE Trans. Instrum. Meas.
Chang-Hwan Im, Hyun-Kyo Jung
tests/integration/test_elf_extractor.py
← Index tests/integration/test_elf_extractor.py python
"""
Integration tests for the ELFExtractor base class.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

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


class TestELFExtractorInitialization:
    """Tests for ELFExtractor initialization."""

    def test_elf_extractor_with_valid_elf(self, elf_binary_path, mock_logger):
        """Test ELFExtractor initialization with valid ELF file."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            assert extractor.filepath == elf_binary_path
            assert extractor._is_elf_file() is True

    def test_elf_extractor_with_invalid_file(self, pe_binary_path, mock_logger):
        """Test ELFExtractor initialization with non-ELF file."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            # Should not be a valid ELF
            assert extractor._is_elf_file() is False

    def test_elf_extractor_with_text_file(self, temp_text_file, mock_logger):
        """Test ELFExtractor initialization with text file."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            # Should not be a valid ELF
            assert extractor._is_elf_file() is False


class TestELFExtractorMethods:
    """Tests for ELFExtractor helper methods."""

    def test_is_elf_file_true(self, elf_binary_path, mock_logger):
        """Test _is_elf_file returns True for valid ELF."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            assert extractor._is_elf_file() is True

    def test_is_elf_file_cached(self, elf_binary_path, mock_logger):
        """Test _is_elf_file result is cached."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            # First call
            result1 = extractor._is_elf_file()
            # Second call should use cached value
            result2 = extractor._is_elf_file()

            assert result1 == result2
            # Cache should be set
            assert extractor._elf_file_valid is not None

    def test_is_64bit(self, elf_binary_path, mock_logger):
        """Test _is_64bit method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._is_64bit()
            # Result depends on the test binary
            assert isinstance(result, bool)

    def test_is_stripped(self, elf_binary_path, mock_logger):
        """Test _is_stripped method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._is_stripped()
            assert isinstance(result, bool)

    def test_has_debug_info(self, elf_binary_path, mock_logger):
        """Test _has_debug_info method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._has_debug_info()
            assert isinstance(result, bool)

    def test_get_architecture(self, elf_binary_path, mock_logger):
        """Test _get_architecture method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._get_architecture()
            # Should return a string (architecture name)
            assert isinstance(result, str)
            assert result != ""

    def test_get_endianness(self, elf_binary_path, mock_logger):
        """Test _get_endianness method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._get_endianness()
            # Should be one of: "little", "big", or "unknown"
            assert result in ["little", "big", "unknown"]

    def test_get_file_type(self, elf_binary_path, mock_logger):
        """Test _get_file_type method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._get_file_type()
            # Should return a file type string
            assert isinstance(result, str)
            # Common values: "executable", "shared_object", "relocatable", etc.
            expected_types = ["none", "relocatable", "executable", "shared_object", "core_dump", "unknown"]
            assert result in expected_types or result.startswith("ET_")

    def test_is_pie(self, elf_binary_path, mock_logger):
        """Test _is_pie method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._is_pie()
            assert isinstance(result, bool)

    def test_has_stack_protection(self, elf_binary_path, mock_logger):
        """Test _has_stack_protection method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._has_stack_protection()
            assert isinstance(result, bool)

    def test_has_nx_bit(self, elf_binary_path, mock_logger):
        """Test _has_nx_bit method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._has_nx_bit()
            assert isinstance(result, bool)

    def test_has_relro(self, elf_binary_path, mock_logger):
        """Test _has_relro method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._has_relro()
            assert isinstance(result, bool)

    def test_get_build_id(self, elf_binary_path, mock_logger):
        """Test _get_build_id method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._get_build_id()
            # Could be None if no build ID, or a hex string
            assert result is None or isinstance(result, str)

    def test_count_sections(self, elf_binary_path, mock_logger):
        """Test _count_sections method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._count_sections()
            assert isinstance(result, int)
            assert result >= 0

    def test_count_segments(self, elf_binary_path, mock_logger):
        """Test _count_segments method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._count_segments()
            assert isinstance(result, int)
            assert result >= 0

    def test_count_symbols(self, elf_binary_path, mock_logger):
        """Test _count_symbols method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._count_symbols()
            assert isinstance(result, int)
            assert result >= 0

    def test_get_dependencies(self, elf_binary_path, mock_logger):
        """Test _get_dependencies method."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor._get_dependencies()
            assert isinstance(result, list)


class TestWithELFFile:
    """Tests for the _with_elf_file context manager method."""

    def test_with_elf_file_success(self, elf_binary_path, mock_logger):
        """Test _with_elf_file executes operation successfully."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            # Define a simple operation
            def get_header(elf):
                return elf.header is not None

            result = extractor._with_elf_file(get_header)
            assert result is True

    def test_with_elf_file_error_handling(self, temp_text_file, mock_logger):
        """Test _with_elf_file handles errors gracefully."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            # Define an operation that would fail
            def get_header(elf):
                return elf.header

            result = extractor._with_elf_file(get_header)
            # Should return None on error
            assert result is None


class TestELFExtractorTag:
    """Tests for tag method in ELF extractors."""

    def test_elf_features_tag(self, elf_binary_path, mock_logger):
        """Test that ELFFeaturesExtractor returns correct tag."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)
            tag = extractor.tag()
            # Should return the tag string
            assert isinstance(tag, str)
            assert "elf" in tag.lower() or "features" in tag.lower()


class TestELFExtractorClickHouseTable:
    """Tests for get_clickhouse_table method in ELF extractors."""

    def test_elf_features_clickhouse_table(self, elf_binary_path, mock_logger):
        """Test that ELFFeaturesExtractor returns correct ClickHouse table name."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_binary_path, mock_logger)
            assert extractor.get_clickhouse_table() == "redb_elf_features"


class TestELFExtractorExtract:
    """Tests for extract method in ELF extractors."""

    def test_elf_features_extract(self, elf_binary_path, mock_logger):
        """Test ELFFeaturesExtractor.extract() returns valid data."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor
        from redb.models.dataclasses import ELFFeatures

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

            result = extractor.extract()
            assert result is not None
            assert isinstance(result, ELFFeatures)

            # Check some expected fields
            assert isinstance(result.ei_class, int)
            assert isinstance(result.ei_data, int)
            assert isinstance(result.e_entry, int)
            assert isinstance(result.number_of_sections, int)
            assert isinstance(result.number_of_segments, int)

    def test_elf_features_extract_invalid_file(self, pe_binary_path, mock_logger):
        """Test ELFFeaturesExtractor.extract() handles invalid ELF."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor.extract()
            # Should return None for invalid ELF
            assert result is None


class TestELFExtractorPrepareExportData:
    """Tests for prepare_export_data method in ELF extractors."""

    def test_elf_features_prepare_export_elasticsearch(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            # First extract
            extractor.extract()
            result = extractor.prepare_export_data("ElasticsearchExporter")
            # Should return the elf_features dataclass
            assert result is extractor.elf_features

    def test_elf_features_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            # 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)


class TestELFExtractorAdvanced:
    """Advanced tests for ELF extraction using hello_advanced binary."""

    def test_elf_advanced_features(self, elf_advanced_binary_path, mock_logger):
        """Test ELFFeaturesExtractor with more complex ELF binary."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_advanced_binary_path, mock_logger)

            result = extractor.extract()
            assert result is not None

            # Check that we can extract meaningful data
            assert result.number_of_sections > 0
            assert result.number_of_segments > 0

    def test_elf_advanced_architecture(self, elf_advanced_binary_path, mock_logger):
        """Test architecture detection for advanced ELF binary."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = ELFFeaturesExtractor(elf_advanced_binary_path, mock_logger)

            arch = extractor._get_architecture()
            # Should detect a valid architecture
            assert arch != "unknown"
            assert arch != ""