Jaesik Choi

164 papers A* 42A 13B 3Journal 79Unranked 26
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
SuBeen Lee, Siyeong Lee, Namil Kim, Jaesik Choi
2026 J jnl
ACM Comput. Surv.
Youngjin Park, Anh Tong, Sehyun Lee, Jihyeon Seong, Qin Xie, Jaesik Choi
2025 A conf
CIKM
Chanwoo Lee, Youngjin Park, Hyeongeun Lee, Yeeun Yoo, Daehee Han, Junho Choi, Geonhyeong Kim, Nari Kim, Jaesik Choi
2025 J jnl
CoRR
Boseon Yoo, Jiwoo Lee, Janghoon Ju, Seijun Chung, Soyeon Kim, Jaesik Choi
2025 J jnl
IEEE Access
Jinseok Seol, Jaesik Choi
2025 A conf
INTERSPEECH
Kyowoon Lee, Artyom Stitsyuk, Gunu Jho, Inchul Hwang, Jaesik Choi
2025 J jnl
CoRR
Kyowoon Lee, Artyom Stitsyuk, Gunu Jho, Inchul Hwang, Jaesik Choi
2025 J jnl
Neurocomputing
Jisu Yeo, Artyom Stitsyuk, Jaesik Choi
2025 conf
ACL (1)
Bumjin Park, Leejinsil Leejinsil, Jaesik Choi
2025 J jnl
CoRR
Bumjin Park, Jinsil Lee, Jaesik Choi
2025 A* conf
AAAI
SuBeen Lee, Jiyeon Han, Soyeon Kim, Jaesik Choi
2025 A* conf
CVPR
Jiyeon Han, Dahee Kwon, Gayoung Lee, Junho Kim, Jaesik Choi
2025 J jnl
CoRR
Jiyeon Han, Dahee Kwon, Gayoung Lee, Junho Kim, Jaesik Choi
2025 J jnl
CoRR
Soyeon Kim, Junho Choi, SuBeen Lee, Jaesik Choi
2025 J jnl
CoRR
Soyeon Kim, Junho Choi, Yeji Choi, SuBeen Lee, Artyom Stitsyuk, Minkyoung Park, Seongyeop Jeong, Youhyun Baek, Jaesik Choi
2025 J jnl
CoRR
Dahee Kwon, Sehyun Lee, Jaesik Choi
2025 A conf
CIKM
Jaesik Choi, Bohyung Han, Myoung-Wan Koo, Kyungman Bae, Chang D. Yoo, Simon S. Woo, Wojciech Samek
2025 A* conf
ICML
Kyowoon Lee, Jaesik Choi
2025 J jnl
CoRR
Kyowoon Lee, Jaesik Choi
2025 J jnl
Multim. Tools Appl.
Nesma Talaat Abbas Mahmoud, Hanna Antson, Wai Tik Chan, Modar Sulaiman, Jaesik Choi, Osamu Shimmi, Kallol Roy
2025 A* conf
ICLR
Anh Tong, Thanh Nguyen-Tang, Dongeun Lee, Duc Nguyen, Toan M. Tran, David Leo Wright Hall, Cheongwoong Kang, Jaesik Choi
2025 J jnl
CoRR
Anh Tong, Thanh Nguyen-Tang, Dongeun Lee, Duc Nguyen, Toan M. Tran, David Hall, Cheongwoong Kang, Jaesik Choi
2025 A* conf
ICDM
Seongjin Park, Haedong Jeong, Tair Djanibekov, Giyoung Jeon, Jinseok Seol, Jaesik Choi
2025 J jnl
CoRR
Seongwoo Lim, Won Jo, Joohyung Lee, Jaesik Choi
2025 J jnl
CoRR
Seongun Kim, Sol A Kim, Geonhyeong Kim, Enver Menadjiev, Chanwoo Lee, Seongwook Chung, Nari Kim, Jaesik Choi
2025 J jnl
CoRR
Youngju Joung, Sehyun Lee, Jaesik Choi
2025 A* conf
ICLR
Wonjoon Chang, Myeongjin Lee, Jaesik Choi
2025 J jnl
CoRR
Kyowoon Lee, Jaesik Choi
2025 conf
EMNLP (Findings)
Cheongwoong Kang, Jongeun Baek, Yeonjea Kim, Jaesik Choi
2025 A* conf
AAAI
Artyom Stitsyuk, Jaesik Choi
2024 J jnl
CoRR
Soyeon Kim, Jihyeon Seong, Hyunkyung Han, Jaesik Choi
2024 conf
BigComp
Hyunkyung Han, Jihyeon Seong, Jaesik Choi
2024 J jnl
CoRR
Hyunkyung Han, Jihyeon Seong, Jaesik Choi
2024 J jnl
CoRR
SuBeen Lee, Jiyeon Han, Soyeon Kim, Jaesik Choi
2024 J jnl
Inf. Fusion
Luca Longo, Mario Brcic, Federico Cabitza, Jaesik Choi, Roberto Confalonieri, Javier Del Ser, Riccardo Guidotti, Yoichi Hayashi, Francisco Herrera, Andreas Holzinger, Richard Jiang, Hassan Khosravi, Freddy Lécué, Gianclaudio Malgieri, Andrés Páez, Wojciech Samek, Johannes Schneider, Timo Speith, Simone Stumpf
2024 conf
ICPRAI (2)
Bumjin Park, Jaesik Choi
2024 J jnl
CoRR
Bumjin Park, Jaesik Choi
2024 A* conf
IJCAI
Bumjin Park, Jaesik Choi
2024 J jnl
CoRR
Bumjin Park, Jaesik Choi
2024 J jnl
CoRR
Hyunkyung Han, Jaesik Choi
2024 A conf
AISTATS
Seongwoo Lim, Won Jo, Joohyung Lee, Jaesik Choi
2024 conf
ICPRAI (1)
Youngju Joung, Sehyun Lee, Jaesik Choi
2024 A* conf
AAAI
Jihyeon Seong, Jungmin Kim, Jaesik Choi
2024 J jnl
CoRR
Jihyeon Seong, Jungmin Kim, Jaesik Choi
2024 A* conf
IJCAI
Jihyeon Seong, Sekwang Oh, Jaesik Choi
2024 J jnl
CoRR
Jihyeon Seong, Sekwang Oh, Jaesik Choi
2024 A* conf
AAAI
Wonjoon Chang, Dahee Kwon, Jaesik Choi
2024 J jnl
CoRR
Artyom Stitsyuk, Jaesik Choi
2023 A* conf
ICRA
Kyowoon Lee, Seongun Kim, Jaesik Choi
2023 J jnl
CoRR
Kyowoon Lee, Seongun Kim, Jaesik Choi
2023 A conf
ITC
Daehyun Chang, Youngdae Kim, Suksoo Pyo, Shin Hun, Daesop Lee, Sohee Hwang, Jaesik Choi, Siwoong Kim
2023 A* conf
ICCV
Giyoung Jeon, Haedong Jeong, Jaesik Choi
2023 J jnl
CoRR
Ye Eun Chun, Sunjae Kwon, Kyunghwan Sohn, Nakwon Sung, Junyoup Lee, Byungki Seo, Kevin Compher, Seung-won Hwang, Jaesik Choi
2023 conf
EMNLP (Findings)
Ye Eun Chun, Sunjae Kwon, Kyunghwan Sohn, Nakwon Sung, Junyoup Lee, Byoung Seo, Kevin Compher, Seung-won Hwang, Jaesik Choi
2023 conf
HCI (53)
Soyeon Kim, Junho Choi, Yeji Choi, SuBeen Lee, Artyom Stitsyuk, Minkyoung Park, Seongyeop Jeong, You-Hyun Baek, Jaesik Choi
2023 J jnl
CoRR
Luca Longo, Mario Brcic, Federico Cabitza, Jaesik Choi, Roberto Confalonieri, Javier Del Ser, Riccardo Guidotti, Yoichi Hayashi, Francisco Herrera, Andreas Holzinger, Richard Jiang, Hassan Khosravi, Freddy Lécué, Gianclaudio Malgieri, Andrés Páez, Wojciech Samek, Johannes Schneider, Timo Speith, Simone Stumpf
2023 J jnl
CoRR
Seongun Kim, Jaesik Choi
2023 conf
EMNLP (Findings)
Cheongwoong Kang, Jaesik Choi
2023 J jnl
CoRR
Cheongwoong Kang, Jaesik Choi
2023 A* conf
ICLR
Jiyeon Han, Hwanil Choi, Yunjey Choi, Junho Kim, Jung-Woo Ha, Jaesik Choi
2023 A* conf
NeurIPS
Kyowoon Lee, Seongun Kim, Jaesik Choi
2023 J jnl
CoRR
Kyowoon Lee, Seongun Kim, Jaesik Choi
2023 conf
ICAIF
Anh Tong, Thanh Nguyen-Tang, Dongeun Lee, Toan M. Tran, Jaesik Choi
2023 J jnl
CoRR
Anh Tong, Thanh Nguyen-Tang, Dongeun Lee, Toan M. Tran, Jaesik Choi
2023 J jnl
CoRR
Nesma Mahmoud, Hanna Antson, Jaesik Choi, Osamu Shimmi, Kallol Roy
2023 J jnl
CoRR
Inyoung Paik, Jaesik Choi
2023 J jnl
CoRR
Wonjoon Chang, Dahee Kwon, Jaesik Choi
2023 A* conf
ICML
Seongun Kim, Kyowoon Lee, Jaesik Choi
2023 J jnl
CoRR
Seongun Kim, Kyowoon Lee, Jaesik Choi
2022 A* conf
AAAI
Haedong Jeong, Jiyeon Han, Jaesik Choi
2022 A* conf
IJCAI
Hwanil Choi, Wonjoon Chang, Jaesik Choi
2022 J jnl
CoRR
Hwanil Choi, Wonjoon Chang, Jaesik Choi
2022 A* conf
NeurIPS
Giyoung Jeon, Haedong Jeong, Jaesik Choi
2022 J jnl
CoRR
Bumjin Park, Jaesik Choi
2022 A* conf
NeurIPS
Anh Tong, Thanh Nguyen-Tang, Toan M. Tran, Jaesik Choi
2022 J jnl
CoRR
Seongjin Park, Haedong Jeong, Giyoung Jeon, Jaesik Choi
2022 J jnl
CoRR
Jiyeon Han, Hwanil Choi, Yunjey Choi, Junho Kim, Jung-Woo Ha, Jaesik Choi
2022 J jnl
Sensors
Cheongwoong Kang, Bumjin Park, Jaesik Choi
2022 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Qin Xie, Peng Zhang, Boseon Yu, Jaesik Choi
2022 J jnl
CoRR
Deokjun Eom, Sehyun Lee, Jaesik Choi
2022 J jnl
CoRR
Sunjae Kwon, Cheongwoong Kang, Jiyeon Han, Jaesik Choi
2021 J jnl
CoRR
Haedong Jeong, Jiyeon Han, Jaesik Choi
2021 A* conf
CVPR
Ali Tousi, Haedong Jeong, Jiyeon Han, Hwanil Choi, Jaesik Choi
2021 J jnl
CoRR
Ali Tousi, Haedong Jeong, Jiyeon Han, Hwanil Choi, Jaesik Choi
2021 A* conf
AAAI
Anh Tong, Jaesik Choi
2021 A* conf
ICML
Boseon Yoo, Jiwoo Lee, Janghoon Ju, Seijun Chung, Soyeon Kim, Jaesik Choi
2021 A conf
IROS
Seongun Kim, Jaesik Choi
2021 A* conf
AAAI
Woo-Jeoung Nam, Jaesik Choi, Seong-Whan Lee
2021 A* conf
KDD
Sohee Cho, Wonjoon Chang, Ginkyeng Lee, Jaesik Choi
2021 A* conf
AAAI
Anh Tong, Toan M. Tran, Hung Bui, Jaesik Choi
2020 A* conf
ICRA
Dongwon Park, Yonghyeok Seo, Dongju Shin, Jaesik Choi, Se Young Chun
2020 A* conf
AAAI
Giyoung Jeon, Haedong Jeong, Jaesik Choi
2020 J jnl
CoRR
Anh Tong, Jaesik Choi
2020 conf
USENIX ATC
Jay H. Park, Gyeongchan Yun, Chang M. Yi, Nguyen T. Nguyen, Seungmin Lee, Jaesik Choi, Sam H. Noh, Young-ri Choi
2020 J jnl
CoRR
Jay H. Park, Gyeongchan Yun, Chang M. Yi, Nguyen T. Nguyen, Seungmin Lee, Jaesik Choi, Sam H. Noh, Young-ri Choi
2020 J jnl
CoRR
Youngjin Park, Deokjun Eom, Byoungki Seo, Jaesik Choi
2020 conf
ICAIF
Youngjin Park, Deokjun Eom, Byoungki Seo, Jaesik Choi
2020 J jnl
CoRR
Sohee Cho, Ginkyeng Lee, Jaesik Choi
2020 J jnl
CoRR
Woo-Jeoung Nam, Jaesik Choi, Seong-Whan Lee
2020 A* conf
KDD
Jaesik Choi
2020 J jnl
CoRR
Anh Tong, Toan M. Tran, Hung Bui, Jaesik Choi
2020 A* conf
AAAI
Woo-Jeoung Nam, Shir Gur, Jaesik Choi, Lior Wolf, Seong-Whan Lee
2019 J jnl
CoRR
Dongwon Park, Yonghyeok Seo, Dongju Shin, Jaesik Choi, Se Young Chun
2019 J jnl
CoRR
Giyoung Jeon, Haedong Jeong, Jaesik Choi
2019 A* conf
IJCAI
Jiyeon Han, Kyowoon Lee, Anh Tong, Jaesik Choi
2019 J jnl
CoRR
Jiyeon Han, Kyowoon Lee, Anh Tong, Jaesik Choi
2019 A* conf
ICML
Anh Tong, Jaesik Choi
2019 J jnl
CoRR
Dongeun Lee, Alex Sim, Jaesik Choi, Kesheng Wu
2019 J jnl
Entropy
Thanh T. Nguyen, Jaesik Choi
2019 J jnl
CoRR
Woo-Jeoung Nam, Jaesik Choi, Seong-Whan Lee
2019 J jnl
CoRR
Sunjae Kwon, Cheongwoong Kang, Jiyeon Han, Jaesik Choi
2019 J jnl
Sci. Robotics
David Gunning, Mark Stefik, Jaesik Choi, Timothy Miller, Simone Stumpf, Guang-Zhong Yang
2018 A* conf
ICML
Kyowoon Lee, Sol-A. Kim, Jaesik Choi, Seong-Whan Lee
2018 conf
IEEE BigData
J. Kade Gibson, Dongeun Lee, Jaesik Choi, Alex Sim
2018 conf
ICDM Workshops
Subin Yi, Jaesik Choi
2018 J jnl
Int. J. Big Data Intell.
Taehoon Kim, Jaesik Choi, Dongeun Lee, Alex Sim, C. Anna Spurlock, Annika Todd, Kesheng Wu
2017 J jnl
CoRR
Rafael Lima, Jaesik Choi
2017 B conf
DCC
Dongeun Lee, Alex Sim, Jaesik Choi, Kesheng Wu
2017 J jnl
CoRR
Subin Yi, Janghoon Ju, Man-Ki Yoon, Jaesik Choi
2017 B conf
SSDBM
Dongeun Lee, Alex Sim, Jaesik Choi, Kesheng Wu
2017 J jnl
CoRR
Thanh T. Nguyen, Jaesik Choi
2017 conf
IoTDI
Man-Ki Yoon, Sibin Mohan, Jaesik Choi, Mihai Christodorescu, Lui Sha
2017 conf
TAC
Seongwoo Lim, Soonjae Kwon, Sehyun Lee, Jaesik Choi
2016 J jnl
CoRR
Wonjun Yoon, Sol-A. Kim, Jaesik Choi
2016 A* conf
ICML
Yunseong Hwang, Anh Tong, Jaesik Choi
2016 A conf
BMVC
Vladimir Nekrasov, Janghoon Ju, Jaesik Choi
2016 J jnl
CoRR
Vladimir Nekrasov, Janghoon Ju, Jaesik Choi
2016 A conf
UAI
Dongeun Lee, Rafael Lima, Jaesik Choi
2016 B conf
SSDBM
Dongeun Lee, Alex Sim, Jaesik Choi, Kesheng Wu
2016 conf
TAC
Seongwoo Lim, Jiyeon Han, Kyowoon Lee, Jaesik Choi
2016 J jnl
CoRR
Kallol Roy, Anh Tong, Jaesik Choi
2015 A* conf
IJCAI
Wen Pu, Jaesik Choi, Yunseong Hwang, Eyal Amir
2015 conf
SmartCity
Taehoon Kim, Dongeun Lee, Jaesik Choi, Anna Spurlock, Alex Sim, Annika Todd, Kesheng Wu
2015 J jnl
CoRR
Man-Ki Yoon, Sibin Mohan, Jaesik Choi, Mihai Christodorescu, Lui Sha
2015 A conf
SDM
Dongeun Lee, Jaesik Choi
2015 J jnl
CoRR
Dongeun Lee, Jaesik Choi
2015 A* conf
AAAI
Jaesik Choi, Eyal Amir, Tianfang Xu, Albert J. Valocchi
2015 A* conf
DAC
Man-Ki Yoon, Lui Sha, Sibin Mohan, Jaesik Choi
2015 A* conf
EMNLP
Taehoon Kim, Jaesik Choi
2015 J jnl
IEEE Signal Process. Lett.
Kyungjoong Jeong, Jaesik Choi, Gil-Jin Jang
2015 J jnl
CoRR
Yunseong Hwang, Jaesik Choi
2014 conf
IEEE BigData
Dongeun Lee, Jaesik Choi
2014 J jnl
IEICE Electron. Express
Dongeun Lee, Jaesik Choi, Heonshik Shin
2014 conf
StarAI@AAAI
Jaesik Choi, Eyal Amir, Tianfang Xu, Albert J. Valocchi
2013 J jnl
Comput. Vis. Image Underst.
Jaesik Choi, Ziyu Wang, Sang-Chul Lee, Won J. Jeon
2013 conf
IEEE BigData
William Gu, Jaesik Choi, Ming Gu, Horst D. Simon, Kesheng Wu
2013 conf
StarAI@AAAI
Wen Pu, Jaesik Choi, Eyal Amir
2013 A conf
IEEE Real-Time and Embedded Technology and Applications Symposium
Man-Ki Yoon, Sibin Mohan, Jaesik Choi, Jung-Eun Kim, Lui Sha
2012 J jnl
CoRR
Jaesik Choi, Eyal Amir, David J. Hill
2012
Jaesik Choi
2012 J jnl
CoRR
Jaesik Choi, Eyal Amir
2012 A conf
UAI
Jaesik Choi, Eyal Amir
2012 conf
StarAI@UAI
Jaesik Choi, Eyal Amir
2011 A* conf
AAAI
Jaesik Choi, Rodrigo de Salvo Braz, Hung Hai Bui
2011 A* conf
IJCAI
Jaesik Choi, Abner Guzmán-Rivera, Eyal Amir
2010 conf
Cognitive Robotics
Jaesik Choi, Eyal Amir
2010 conf
StarAI@AAAI
Jaesik Choi, David J. Hill, Eyal Amir
2010 A conf
UAI
Jaesik Choi, Eyal Amir, David J. Hill
2009 A* conf
ICRA
Jaesik Choi, Eyal Amir
2009 A* conf
IJCAI
Hannaneh Hajishirzi, Afsaneh Shirazi, Jaesik Choi, Eyal Amir
2009 J jnl
IEEE Trans. Ind. Electron.
Woojin Chung, Seokgyu Kim, Minki Choi, Jaesik Choi, Hoyeon Kim, Chang-Bae Moon, Jae-Bok Song
2008 conf
Multimedia Information Retrieval
Jaesik Choi, Won J. Jeon, Sang-Chul Lee
2007 A conf
IROS
Jaesik Choi, Eyal Amir
2006 conf
AAAI Fall Symposium: Integrating Reasoning into Everyday Applications
Jaesik Choi, Eyal Amir
tests/integration/test_elf_extractors.py
← Index tests/integration/test_elf_extractors.py python
"""
Integration tests for ELF-specific extractors.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

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


# ============================================================================
# ELFFeaturesExtractor Tests
# ============================================================================

class TestELFFeaturesExtractor:
    """Tests for ELFFeaturesExtractor class."""

    def test_extract_valid_elf(self, elf_binary_path, mock_logger):
        """Test extracting features from valid ELF file."""
        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)

    def test_extract_header_data(self, elf_binary_path, mock_logger):
        """Test ELF header data extraction."""
        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.extract()

            assert result is not None
            # Check header fields
            assert isinstance(result.ei_class, int)
            assert isinstance(result.ei_data, int)
            assert isinstance(result.e_type, int)
            assert isinstance(result.e_machine, int)
            assert isinstance(result.e_entry, int)

    def test_extract_human_readable_strings(self, elf_binary_path, mock_logger):
        """Test human-readable string fields."""
        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.extract()

            assert result is not None
            assert result.ei_class_str in ['32-bit', '64-bit', 'unknown']
            assert result.ei_data_str in ['Little-endian', 'Big-endian', 'unknown']
            assert result.e_type_str is not None
            assert result.e_machine_str is not None

    def test_extract_security_properties(self, elf_binary_path, mock_logger):
        """Test security property extraction."""
        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.extract()

            assert result is not None
            # Security flags should be 0 or 1
            assert result.is_pie in [0, 1]
            assert result.has_canary in [0, 1]
            assert result.has_nx in [0, 1]
            assert result.has_relro in [0, 1]
            assert result.has_fortify in [0, 1]

    def test_extract_counts(self, elf_binary_path, mock_logger):
        """Test section/segment/symbol counts."""
        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.extract()

            assert result is not None
            assert result.number_of_segments >= 0
            assert result.number_of_sections >= 0
            assert result.number_of_symbols >= 0
            assert result.number_of_dynamic_symbols >= 0
            assert result.number_of_relocations >= 0
            assert result.number_of_dependencies >= 0

    def test_extract_build_info(self, elf_binary_path, mock_logger):
        """Test build information extraction."""
        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.extract()

            assert result is not None
            # Build ID may or may not be present
            if result.build_id is not None:
                assert isinstance(result.build_id, str)
            assert result.gnu_hash_present in [0, 1]
            assert result.has_debug_info in [0, 1]

    def test_extract_invalid_elf(self, pe_binary_path, mock_logger):
        """Test extraction 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)

            result = extractor.extract()

            # Should return None for invalid ELF
            assert result is None


# ============================================================================
# ELFSectionExtractor Tests
# ============================================================================

class TestELFSectionExtractor:
    """Tests for ELFSectionExtractor class."""

    def test_extract_sections(self, elf_binary_path, mock_logger):
        """Test section extraction."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, list)
            assert len(result) > 0

    def test_section_properties(self, elf_binary_path, mock_logger):
        """Test section property extraction."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor
        from redb.models.dataclasses import ELFSection

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                section = result[0]
                assert isinstance(section, ELFSection)
                assert section.section_name is not None
                assert isinstance(section.section_type, int)
                assert isinstance(section.section_flags, int)
                assert section.section_entropy >= 0

    def test_section_hashes(self, elf_binary_path, mock_logger):
        """Test section hash computation."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                for section in result:
                    if section.section_sha256:
                        assert len(section.section_sha256) == 64
                    if section.section_md5:
                        assert len(section.section_md5) == 32


# ============================================================================
# ELFSegmentExtractor Tests
# ============================================================================

class TestELFSegmentExtractor:
    """Tests for ELFSegmentExtractor class."""

    def test_extract_segments(self, elf_binary_path, mock_logger):
        """Test segment extraction."""
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

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

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, list)

    def test_segment_properties(self, elf_binary_path, mock_logger):
        """Test segment property extraction."""
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor
        from redb.models.dataclasses import ELFSegment

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                segment = result[0]
                assert isinstance(segment, ELFSegment)
                assert isinstance(segment.segment_type, int)
                assert isinstance(segment.segment_flags, int)


# ============================================================================
# ELFSymbolExtractor Tests
# ============================================================================

class TestELFSymbolExtractor:
    """Tests for ELFSymbolExtractor class."""

    def test_extract_symbols(self, elf_binary_path, mock_logger):
        """Test symbol extraction."""
        from redb.extractors.elf_extractors.elf_symbols import ELFSymbolExtractor

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

            result = extractor.extract()

            # May be None if stripped
            if result is not None:
                assert isinstance(result, list)

    def test_symbol_properties(self, elf_binary_path, mock_logger):
        """Test symbol property extraction."""
        from redb.extractors.elf_extractors.elf_symbols import ELFSymbolExtractor
        from redb.models.dataclasses import ELFSymbol

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                symbol = result[0]
                assert isinstance(symbol, ELFSymbol)
                assert symbol.symbol_name is not None
                assert isinstance(symbol.symbol_type, int)
                assert isinstance(symbol.symbol_bind, int)


# ============================================================================
# ELFImportExtractor Tests
# ============================================================================

class TestELFImportExtractor:
    """Tests for ELFImportExtractor class."""

    def test_extract_imports(self, elf_binary_path, mock_logger):
        """Test import extraction."""
        from redb.extractors.elf_extractors.elf_imports import ELFImportExtractor

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

            result = extractor.extract()

            # May be None if no imports
            if result is not None:
                assert hasattr(result, 'elf_imports_total')

    def test_import_functions(self, elf_binary_path, mock_logger):
        """Test import function extraction."""
        from redb.extractors.elf_extractors.elf_imports import ELFImportExtractor
        from redb.models.dataclasses import ELFImport

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

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, ELFImport)
                assert isinstance(result.elf_imports_total, int)


# ============================================================================
# ELFExportExtractor Tests
# ============================================================================

class TestELFExportExtractor:
    """Tests for ELFExportExtractor class."""

    def test_extract_exports(self, elf_binary_path, mock_logger):
        """Test export extraction."""
        from redb.extractors.elf_extractors.elf_exports import ELFExportExtractor

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

            result = extractor.extract()

            # May be None if no exports
            if result is not None:
                assert hasattr(result, 'elf_exports_total')

    def test_export_functions(self, elf_binary_path, mock_logger):
        """Test export function extraction."""
        from redb.extractors.elf_extractors.elf_exports import ELFExportExtractor
        from redb.models.dataclasses import ELFExport

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

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, ELFExport)


# ============================================================================
# ELFDependencyExtractor Tests
# ============================================================================

class TestELFDependencyExtractor:
    """Tests for ELFDependencyExtractor class."""

    def test_extract_dependencies(self, elf_binary_path, mock_logger):
        """Test dependency extraction."""
        from redb.extractors.elf_extractors.elf_dependencies import ELFDependencyExtractor

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

            result = extractor.extract()

            # May be None if no dependencies
            if result is not None:
                assert isinstance(result, list)

    def test_dependency_properties(self, elf_binary_path, mock_logger):
        """Test dependency property extraction."""
        from redb.extractors.elf_extractors.elf_dependencies import ELFDependencyExtractor
        from redb.models.dataclasses import ELFDependency

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                dep = result[0]
                assert isinstance(dep, ELFDependency)
                assert dep.dependency_name is not None


# ============================================================================
# ELFRelocationExtractor Tests
# ============================================================================

class TestELFRelocationExtractor:
    """Tests for ELFRelocationExtractor class."""

    def test_extract_relocations(self, elf_binary_path, mock_logger):
        """Test relocation extraction."""
        from redb.extractors.elf_extractors.elf_relocations import ELFRelocationExtractor

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

            result = extractor.extract()

            # May be None if no relocations
            if result is not None:
                assert isinstance(result, list)

    def test_relocation_properties(self, elf_binary_path, mock_logger):
        """Test relocation property extraction."""
        from redb.extractors.elf_extractors.elf_relocations import ELFRelocationExtractor
        from redb.models.dataclasses import ELFRelocation

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                reloc = result[0]
                assert isinstance(reloc, ELFRelocation)
                assert isinstance(reloc.relocation_offset, int)
                assert isinstance(reloc.relocation_type, int)


# ============================================================================
# ELFNotesExtractor Tests
# ============================================================================

class TestELFNotesExtractor:
    """Tests for ELFNotesExtractor class."""

    def test_extract_notes(self, elf_binary_path, mock_logger):
        """Test notes extraction."""
        from redb.extractors.elf_extractors.elf_notes import ELFNotesExtractor

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

            result = extractor.extract()

            # May be None if no notes
            if result is not None:
                assert isinstance(result, list)

    def test_note_properties(self, elf_binary_path, mock_logger):
        """Test note property extraction."""
        from redb.extractors.elf_extractors.elf_notes import ELFNotesExtractor
        from redb.models.dataclasses import ELFNote

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

            result = extractor.extract()

            if result is not None and len(result) > 0:
                note = result[0]
                assert isinstance(note, ELFNote)
                assert note.note_name is not None
                assert isinstance(note.note_type, int)


# ============================================================================
# Integration Tests
# ============================================================================

class TestELFExtractorIntegration:
    """Integration tests for ELF extractors."""

    def test_all_extractors_valid_elf(self, elf_binary_path, mock_logger):
        """Test all ELF extractors with valid ELF file."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            features_ext = ELFFeaturesExtractor(elf_binary_path, mock_logger)
            sections_ext = ELFSectionExtractor(elf_binary_path, mock_logger)
            segments_ext = ELFSegmentExtractor(elf_binary_path, mock_logger)

            features_result = features_ext.extract()
            sections_result = sections_ext.extract()
            segments_result = segments_ext.extract()

            # All should extract something
            assert features_result is not None
            assert sections_result is not None
            assert segments_result is not None

    def test_hash_consistency_across_extractors(self, elf_binary_path, mock_logger):
        """Test that hashes are consistent across all extractors."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            # Hashes should be the same
            assert features_ext.sha256 == sections_ext.sha256
            assert features_ext.md5 == sections_ext.md5
            assert features_ext.sha1 == sections_ext.sha1

    def test_clickhouse_tables_unique(self, elf_binary_path, mock_logger):
        """Test that each extractor has a unique ClickHouse table."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            features_ext = ELFFeaturesExtractor(elf_binary_path, mock_logger)
            sections_ext = ELFSectionExtractor(elf_binary_path, mock_logger)
            segments_ext = ELFSegmentExtractor(elf_binary_path, mock_logger)

            tables = {
                features_ext.get_clickhouse_table(),
                sections_ext.get_clickhouse_table(),
                segments_ext.get_clickhouse_table(),
            }

            # All tables should be unique
            assert len(tables) == 3


# ============================================================================
# Advanced Binary Tests
# ============================================================================

class TestELFAdvancedBinary:
    """Tests using the hello_advanced binary."""

    def test_advanced_features_extraction(self, elf_advanced_binary_path, mock_logger):
        """Test feature extraction from 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)

            result = extractor.extract()

            assert result is not None
            assert result.number_of_sections > 0

    def test_advanced_sections_extraction(self, elf_advanced_binary_path, mock_logger):
        """Test section extraction from advanced ELF binary."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            result = extractor.extract()

            assert result is not None
            assert len(result) > 0

            # Check for common ELF sections
            section_names = [s.section_name for s in result]
            # Most ELF files have .text section
            assert any('.text' in name for name in section_names)

    def test_advanced_segments_extraction(self, elf_advanced_binary_path, mock_logger):
        """Test segment extraction from advanced ELF binary."""
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

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

            result = extractor.extract()

            assert result is not None
            assert len(result) > 0


# ============================================================================
# Export Data Tests
# ============================================================================

class TestELFExtractorExportData:
    """Tests for export data preparation."""

    def test_features_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test ClickHouse export preparation for features."""
        from redb.extractors.elf_extractors.elf_features import ELFFeaturesExtractor

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

            result = extractor.prepare_export_data("ClickHouseExporter")

            assert result is not None
            data, column_names, column_type_names = result

            assert 'sha256' in column_names
            assert 'ei_class' in column_names
            assert 'e_machine' in column_names
            assert 'is_pie' in column_names

    def test_sections_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test ClickHouse export preparation for sections."""
        from redb.extractors.elf_extractors.elf_sections import ELFSectionExtractor

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

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'section_name' in column_names
                assert 'section_entropy' in column_names

    def test_segments_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test ClickHouse export preparation for segments."""
        from redb.extractors.elf_extractors.elf_segments import ELFSegmentExtractor

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

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'segment_type' in column_names