Ichi Takumi

127 papers B 3C 18Misc 5Journal 16Unranked 84
YearRankTypeTitle / Venue / Authors
2024 conf
GCCE
Yasuki Hotta, Takahiro Uchiya, Ichi Takumi
2024 conf
BWCCA
Takahiro Uchiya, Haruto Domoto, Daisuke Doi, Masafumi Hombe, Ichi Takumi
2024 conf
GCCE
Naoki Sasa, Takahiro Uchiya, Ichi Takumi
2024 C conf
PKAW
Haruto Domoto, Takahiro Uchiya, Ichi Takumi
2024 conf
ICA
Takahiro Uchiya, Ichi Takumi
2024 conf
GCCE
Shunto Yamamoto, Takahiro Uchiya, Ichi Takumi
2024 conf
BWCCA
Haruto Domoto, Taiki Naito, Takahiro Uchiya, Ichi Takumi
2024 conf
GCCE
Haruto Domoto, Ryusei Okuda, Takahiro Uchiya, Ichi Takumi
2024 conf
GCCE
Ryusei Okuda, Haruto Domoto, Takahiro Uchiya, Ichi Takumi
2023 conf
GCCE
Hiromu Mawatari, Takahiro Uchiya, Ichi Takumi
2023 conf
GCCE
Tetsuya Nishibe, Takahiro Uchiya, Ichi Takumi, Arao Funase
2023 conf
GCCE
Haruto Domoto, Takahiro Uchiya, Ichi Takumi
2022 conf
GCCE
Yuga Oba, Shinsuke Kajioka, Takahiro Uchiya, Hiroshi Matsuo, Ichi Takumi
2022 conf
GCCE
Yafei Zhou, Takahiro Uchiya, Ichi Takumi
2021 conf
GCCE
Shuhong Shi, Takahiro Uchiya, Ichi Takumi
2021 conf
GCCE
Yafei Zhou, Takahiro Uchiya, Ichi Takumi
2021 conf
BWCCA
Takahiro Uchiya, Yudai Furuta, Ichi Takumi
2021 conf
GCCE
Zongming Zhang, Takahiro Uchiya, Ichi Takumi
2020 conf
BWCCA
Takahiro Uchiya, Kodai Shimano, Ichi Takumi
2020 conf
NBiS
Takahiro Uchiya, Ichi Takumi
2020 conf
GCCE
Yafei Zhou, Takahiro Uchiya, Ichi Takumi
2020 conf
GCCE
Takahiro Uchiya, Ryota Shimizu, Ichi Takumi
2020 conf
NBiS
Yafei Zhou, Takahiro Uchiya, Ichi Takumi
2019 C conf
IGARSS
Motoaki Mouri, Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi
2019 conf
GCCE
Takahiro Uchiya, Ryuta Sugie, Ichi Takumi
2019 J jnl
ICT Express
Ryota Nishimura, Daisuke Yamamoto, Takahiro Uchiya, Ichi Takumi
2019 Misc conf
CISIS
Takahiro Uchiya, Shotaro Sugiura, Ichi Takumi
2019 conf
NBiS
Takahiro Uchiya, Ryoa Sugisaki, Ichi Takumi
2019 conf
BWCCA
Takahiro Uchiya, Kodai Shimano, Ichi Takumi
2018 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Motoaki Mouri, Ichi Takumi, Hiroshi Yasukawa
2018 conf
GCCE
Takahiro Uchiya, Kota Hayashi, Ryuta Sugie, Ichi Takumi, Tetsuo Kinoshita
2018 conf
GCCE
Ryuta Sugie, Takahiro Uchiya, Ichi Takumi
2018 J jnl
EURASIP J. Audio Speech Music. Process.
Ryota Nishimura, Daisuke Yamamoto, Takahiro Uchiya, Ichi Takumi
2017 J jnl
Int. J. Web Inf. Syst.
Yuto Ishida, Takahiro Uchiya, Ichi Takumi
2017 Misc conf
CISIS
Kento Watanabe, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2017 conf
NBiS
Yuto Ishida, Takahiro Uchiya, Ichi Takumi
2017 conf
GCCE
Takahiro Uchiya, Satoshi Otake, Ryota Nishimura, Daisuke Yamamoto, Ichi Takumi
2017 conf
GCCE
Ryoa Sugisaki, Takahiro Uchiya, Ichi Takumi
2017 C conf
IGARSS
Motoaki Mouri, Ichi Takumi, Hiroshi Yasukawa
2017 conf
NBiS
Takahiro Uchiya, Kiyotaka Sato, Shinsuke Kajioka, Daisuke Yamamoto, Ichi Takumi
2017 conf
BWCCA
Ryuta Sugie, Takahiro Uchiya, Ichi Takumi
2017 conf
GCCE
Shotaro Sugiura, Takahiro Uchiya, Ichi Takumi
2017 ch.
Human-Harmonized Information Technology (2)
Keiichi Tokuda, Akinobu Lee, Yoshihiko Nankaku, Keiichiro Oura, Kei Hashimoto, Daisuke Yamamoto, Ichi Takumi, Takahiro Uchiya, Shuhei Tsutsumi, Steve Renals, Junichi Yamagishi
2017 Misc conf
CISIS
Ryuta Sugie, Takahiro Uchiya, Ichi Takumi
2016 Misc conf
CISIS
Hiroaki Ishida, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2016 Misc conf
CISIS
Yoshitaka Kato, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2016 conf
ISIE
Motoaki Mouri, Hiroshi Yasukawa, Ichi Takumi
2016 conf
GCCE
Takahiro Uchiya, Yuto Ishida, Yusuke Kume, Ichi Takumi
2016 conf
GCCE
Ryuhei Kani, Takahiro Uchiya, Daisuke Yamamoto, Ichi Takumi, Ryota Nishimura
2016 conf
GCCE
Yusuke Miyahara, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2016 conf
NBiS
Yuto Ishida, Takahiro Uchiya, Ichi Takumi
2016 conf
NBiS
Yuto Ishida, Takahiro Uchiya, Kouhei Yamamoto, Daisuke Yamamoto, Ryota Nishimura, Ichi Takumi
2016 conf
GCCE
Kota Hayashi, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2016 conf
GCCE
Ken Ohno, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2015 conf
NBiS
Yuichi Matsushita, Takahiro Uchiya, Ryota Nishimura, Daisuke Yamamoto, Ichi Takumi
2015 J jnl
J. Mobile Multimedia
Takahiro Uchiya, Masaki Yoshida, Daisuke Yamamoto, Ryota Nishimura, Ichi Takumi
2015 conf
NBiS
Masato Hibino, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2015 conf
NBiS
Takahiro Uchiya, Masaki Yoshida, Daisuke Yamamoto, Ichi Takumi
2015 conf
GCCE
Masato Hibino, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2015 conf
GCCE
Yuichi Matsushita, Takahiro Uchiya, Ryota Nishimura, Daisuke Yamamoto, Ichi Takumi
2015 conf
GCCE
Tomoya Mori, Shinsuke Kajioka, Takahiro Uchiya, Ichi Takumi, Hiroshi Matsuo
2015 conf
GCCE
Takahiro Uchiya, Ryosuke Nakano, Daisuke Yamamoto, Ryota Nishimura, Ichi Takumi
2015 C conf
ICICS
Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2015 C conf
ICIS
Takahiro Uchiya, Motohiro Shibakawa, Ichi Takumi, Tetsuo Kinoshita
2015 conf
APSIPA
Arao Funase, Kenya Wakita, Akitoshi Itai, Ichi Takumi
2014 conf
GCCE
Ryota Nishimura, Koji Sugiokay, Daisuke Yamamoto, Takahiro Uchiya, Ichi Takumi
2014 conf
ISIE
Motoaki Mouri, Yoichi Kato, Hiroshi Yasukawa, Ichi Takumi
2014 conf
GCCE
Yuichi Matsushita, Takahiro Uchiya, Ryota Nishimura, Daisuke Yamamoto, Ichi Takumi
2014 B conf
HAI
Ryota Nishimura, Daisuke Yamamoto, Takahiro Uchiya, Ichi Takumi
2014 conf
GCCE
Shinsuke Kajioka, Tomoya Mori, Takahiro Uchiya, Ichi Takumi, Hiroshi Matsuo
2014 conf
SCIS&ISIS
Hirotaka Itoh, Yuma Itoh, Kenji Funahashi, Daisuke Yamamoto, Shoichi Saito, Hiroshi Matsuo, Ichi Takumi
2014 conf
ICCI*CC
Yuuki Kishigami, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2014 conf
ICCI*CC
Takahiro Uchiya, Daisuke Yamamoto, Ryota Nishimura, Ichi Takumi, Tetsuo Kinoshita
2014 conf
APCCAS
Motoaki Mouri, Ichi Takumi, Hiroshi Yasukawa, Andrzej Cichocki
2014 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2014 B conf
HAI
Daisuke Yamamoto, Keiichiro Oura, Ryota Nishimura, Takahiro Uchiya, Akinobu Lee, Ichi Takumi, Keiichi Tokuda
2013 C conf
ICIS
Motohiro Shibakawa, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2013 C conf
ICIS
Takahiro Uchiya, Syo Itazuro, Ichi Takumi, Tetsuo Kinoshita
2013 conf
ICCI*CC
Motohiro Shibakawa, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2013 B conf
KES
Hirotaka Itoh, Yuma Itoh, Kenji Funahashi, Daisuke Yamamoto, Shoichi Saito, Ichi Takumi, Hiroshi Matsuo
2013 conf
ICCI*CC
Takahiro Uchiya, Syo Itazuro, Ichi Takumi, Tetsuo Kinoshita
2012 C conf
IGARSS
Satoshi Urata, Hiroshi Yasukawa, Akitoshi Itai, Ichi Takumi
2012 conf
BWCCA
Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2012 conf
BWCCA
Sho Itazuro, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2012 conf
ICCI*CC
Sho Itazuro, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2012 J jnl
Int. J. Softw. Sci. Comput. Intell.
Sho Itazuro, Takahiro Uchiya, Tetsuo Kinoshita, Ichi Takumi
2012 conf
BWCCA
Naoya Tatematsu, Takahiro Uchiya, Ichi Takumi, Tetsuo Kinoshita
2012 C conf
ISITA
Shigeyori Nagahashi, Tsuyoshi Sasaki Usuda, Ichi Takumi
2011 C conf
IGARSS
Motoaki Mouri, Arao Funase, Andrzej Cichocki, Ichi Takumi, Hiroshi Yasukawa
2011 C conf
IGARSS
Yoshinao Ito, Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2011 conf
ICONIP (1)
Arao Funase, Andrzej Cichocki, Ichi Takumi
2010 C conf
IGARSS
Yoshinao Ito, Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2010 J jnl
IEEE Trans. Commun.
Tadashi Wadayama, Keisuke Nakamura, Masayuki Yagita, Yuuki Funahashi, Shogo Usami, Ichi Takumi
2010 conf
EUSIPCO
Yoshinao Ito, Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2010 conf
ICONIP (2)
Arao Funase, Motoaki Mouri, Andrzej Cichocki, Ichi Takumi
2009 J jnl
IEEE J. Sel. Areas Commun.
Makoto Miwa, Tadashi Wadayama, Ichi Takumi
2009 conf
IGARSS (4)
Tokiyasu Sato, Ichi Takumi, Masayasu Hata, Hiroshi Yasukawa
2009 conf
EUSIPCO
Motoaki Mouri, Arao Funase, Andrzej Cichocki, Ichi Takumi, Hiroshi Yasukawa, Masayasu Hata
2009 conf
ICONIP (1)
Arao Funase, Motoaki Mouri, Andrzej Cichocki, Ichi Takumi
2008 J jnl
CoRR
Makoto Miwa, Tadashi Wadayama, Ichi Takumi
2008 conf
ICONIP (2)
Arao Funase, Motoaki Mouri, Tohru Yagi, Andrzej Cichocki, Ichi Takumi
2008 conf
IGARSS (3)
Tokiyasu Sato, Ichi Takumi, Masayasu Hata, Hiroshi Yasukawa
2008 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Motoaki Mouri, Arao Funase, Andrzej Cichocki, Ichi Takumi, Hiroshi Yasukawa, Masayasu Hata
2008 conf
IGARSS (5)
Motoaki Mouri, Arao Funase, Ichi Takumi, Andrzej Cichocki, Hiroshi Yasukawa, Masayasu Hata
2007 conf
EUSIPCO
Motoaki Mouri, Arao Funase, Andrzej Cichocki, Ichi Takumi, Hiroshi Yasukawa, Masayasu Hata
2007 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2007 J jnl
CoRR
Tadashi Wadayama, Masayuki Yagita, Yuuki Funahashi, Shogo Usami, Ichi Takumi
2006 conf
EUSIPCO
Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2006 conf
ICA
Arao Funase, Tohru Yagi, Motoaki Mouri, Allan Kardec Barros, Andrzej Cichocki, Ichi Takumi
2006 conf
ICA
Motoaki Mouri, Arao Funase, Andrzej Cichocki, Ichi Takumi, Hiroshi Yasukawa, Masayasu Hata
2006 conf
EUSIPCO
Motoaki Mouri, Arao Funase, Andrzej Cichocki, Ichi Takumi, Hiroshi Yasukawa, Masayasu Hata
2006 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Yuuki Funahashi, Shogo Usami, Ichi Takumi, Masayasu Hata
2006 conf
EMBC
Arao Funase, Tohru Yagi, Allan Kardec Barros, Andrzej Cichocki, Ichi Takumi
2004 conf
EUSIPCO
Shinji Niwa, Akitoshi Itai, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2003 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Shinji Niwa, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2003 C conf
IGARSS
Nobukazu Kodera, Ichi Takumi, Masayasu Hata, Hiroshi Yasukawa
2003 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Toshio Fukuta, Yuuichi Hamasuna, Ichi Takumi, Masayasu Hata, Takahiro Nakanishi
2003 conf
ITCC
Masayasu Hata, Makoto Kawasima, Yuuichi Hamasuna, Shogo Usami, Ichi Takumi
2003 C conf
IGARSS
Shuhei Murakami, Ichi Takumi, Masayasu Hata, Hiroshi Yasukawa
2003 C conf
IGARSS
Susumu Saito, Ichi Takumi, Masayasu Hata, Hiroshi Yasukawa
2003 C conf
IGARSS
Shinji Niwa, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
2002 conf
EUSIPCO
Hiroshi Yasukawa, Shinji Niwa, Masayasu Hata, Ichi Takumi
2002 C conf
IGARSS
Ichi Takumi, Shuhei Murakami, Akio Shimura, Masayasu Hata, Hiroshi Yasukawa
2002 C conf
IGARSS
Ichi Takumi, Shoichi Saito, Akio Shimura, Masayasu Hata, Hiroshi Yasukawa
2001 conf
ITCC
Masayasu Hata, Eisaku Yamaguchi, Yuuichi Hamasuna, Toshio Ishizaka, Ichi Takumi
2001 conf
ICECS
Hiroshi Yasukawa, Seiji Adachi, Masayasu Hata, Ichi Takumi
2000 conf
EUSIPCO
Seiji Adachi, Hiroshi Yasukawa, Ichi Takumi, Masayasu Hata
tests/integration/test_pe_extractors.py
← Index tests/integration/test_pe_extractors.py python
"""
Integration tests for PE-specific extractors.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

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


# ============================================================================
# PEFeaturesExtractor Tests
# ============================================================================

class TestPEFeaturesExtractor:
    """Tests for PEFeaturesExtractor class."""

    def test_extract_valid_pe(self, pe_binary_path, mock_logger):
        """Test extracting features from valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.models.dataclasses import PE

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

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

    def test_extract_pe_type(self, pe_binary_path, mock_logger):
        """Test PE type detection (DLL, EXE, DRIVER)."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.type in ["DLL", "EXE", "DRIVER"]

    def test_extract_architecture(self, pe_binary_path, mock_logger):
        """Test architecture detection."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Architecture should be detected
            assert result.architecture is not None

    def test_extract_entry_point(self, pe_binary_path, mock_logger):
        """Test entry point extraction."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Entry point should be a hex string
            assert result.entry_point.startswith("0x")

    def test_extract_compilation_time(self, pe_binary_path, mock_logger):
        """Test compilation time extraction."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Compilation time should be an integer timestamp
            assert isinstance(result.compilation_time, int)
            assert result.compilation_time_utc is not None

    def test_extract_dotnet_detection(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Should be True for the test .NET binary
            assert isinstance(result.is_dotnet, bool)
            assert result.is_dotnet is True  # Test file is .NET

    def test_extract_headers(self, pe_binary_path, mock_logger):
        """Test header extraction."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.dos_header is not None
            assert result.nt_header is not None
            assert result.file_header is not None
            assert result.optional_header is not None

    def test_extract_counts(self, pe_binary_path, mock_logger):
        """Test section/import/export counts."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert isinstance(result.number_of_sections, int)
            assert isinstance(result.number_of_imports, int)
            assert isinstance(result.number_of_exports, int)
            assert isinstance(result.number_of_resources, int)

    def test_extract_rich_header(self, pe_binary_path, mock_logger):
        """Test Rich header extraction."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Rich header may or may not be present
            # If present, should be JSON string
            if result.rich_header_dump is not None:
                assert isinstance(result.rich_header_dump, str)

    def test_extract_version_info(self, pe_binary_path, mock_logger):
        """Test version info extraction."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Version info may or may not be present
            if result.version_info is not None:
                assert isinstance(result.version_info, list)


# ============================================================================
# PEImportExtractor Tests
# ============================================================================

class TestPEImportExtractor:
    """Tests for PEImportExtractor class."""

    def test_extract_imports(self, pe_binary_path, mock_logger):
        """Test import extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.models.dataclasses import PEImport

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, PEImport)
                assert isinstance(result.pe_imports_total, int)

    def test_extract_import_libraries(self, pe_binary_path, mock_logger):
        """Test import library extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_libraryName is not None:
                assert isinstance(result.pe_import_libraryName, list)

    def test_extract_import_functions(self, pe_binary_path, mock_logger):
        """Test import function extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_functions is not None:
                assert isinstance(result.pe_import_functions, list)

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

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


# ============================================================================
# PESectionExtractor Tests
# ============================================================================

class TestPESectionExtractor:
    """Tests for PESectionExtractor class."""

    def test_extract_sections(self, pe_binary_path, mock_logger):
        """Test section extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor
        from redb.models.dataclasses import PESection

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

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

    def test_section_properties(self, pe_binary_path, mock_logger):
        """Test section property extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                section = result[0]
                assert section.section_name is not None
                assert section.section_entropy >= 0
                assert section.section_sha256 is not None
                assert section.section_md5 is not None
                assert section.section_size >= 0

    def test_section_entropy_range(self, pe_binary_path, mock_logger):
        """Test that section entropy is in valid range."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                for section in result:
                    assert 0 <= section.section_entropy <= 8

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            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
                assert 'section_sha256' in column_names


# ============================================================================
# PEResourceExtractor Tests
# ============================================================================

class TestPEResourceExtractor:
    """Tests for PEResourceExtractor class."""

    def test_extract_resources(self, pe_binary_path, mock_logger):
        """Test resource extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

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

    def test_resource_properties(self, pe_binary_path, mock_logger):
        """Test resource property extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor
        from redb.models.dataclasses import PEResource

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                resource = result[0]
                assert isinstance(resource, PEResource)
                assert resource.resource_type is not None


# ============================================================================
# PEOverlayExtractor Tests
# ============================================================================

class TestPEOverlayExtractor:
    """Tests for PEOverlayExtractor class."""

    def test_extract_overlay(self, pe_binary_path, mock_logger):
        """Test overlay extraction."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no overlay
            # If present, should have overlay properties
            if result is not None:
                assert hasattr(result, 'overlay_size')

    def test_has_overlay_check(self, pe_binary_path, mock_logger):
        """Test overlay detection."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            has_overlay = extractor._has_overlay()
            assert isinstance(has_overlay, bool)


# ============================================================================
# PESignatureExtractor Tests
# ============================================================================

class TestPESignatureExtractor:
    """Tests for PESignatureExtractor class."""

    def test_extract_signature(self, pe_binary_path, mock_logger):
        """Test signature extraction."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if not signed
            # Result type depends on implementation

    def test_is_signed_check(self, pe_binary_path, mock_logger):
        """Test signature detection."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_signed = extractor._is_signed()
            assert isinstance(is_signed, bool)


# ============================================================================
# PEDotNetExtractor Tests
# ============================================================================

class TestPEDotNetExtractor:
    """Tests for PEDotNetExtractor class."""

    def test_extract_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET metadata extraction."""
        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 None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # The test file is a .NET binary
            if extractor._check_dotnet():
                assert result is not None

    def test_check_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        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 None:
                pytest.skip("PE parsing failed")

            is_dotnet = extractor._check_dotnet()
            assert isinstance(is_dotnet, bool)
            # Test file should be .NET
            assert is_dotnet is True


# ============================================================================
# PEInconsistencyTestsExtractor Tests
# ============================================================================

class TestPEInconsistencyTestsExtractor:
    """Tests for PEInconsistencyTestsExtractor class."""

    def test_extract_inconsistency_tests(self, pe_binary_path, mock_logger):
        """Test inconsistency tests extraction."""
        from redb.extractors.pe_extractors.pe_inconsistency_tests import PEInconstistencyTestsExtractor as PEInconsistencyTestsExtractor

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # extract() returns True if tests were performed, False otherwise
            # The actual test results are stored in extractor.pe_inconsistency_tests
            # and extractor.dotnet_inconsistency_tests
            assert result in (True, False)

            if result:
                # Check that test results were stored
                assert extractor.pe_inconsistency_tests is not None or extractor.dotnet_inconsistency_tests is not None


# ============================================================================
# PEExtraFindings Tests
# ============================================================================

class TestPEExtraFindings:
    """Tests for PEExtraFindings class."""

    def test_extract_extra_findings(self, pe_binary_path, mock_logger):
        """Test extra findings extraction."""
        from redb.extractors.pe_extractors.pe_extra_findings import PEExtraFindings

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

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May return None or list of findings
            if result is not None:
                assert isinstance(result, list)


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

class TestPEExtractorIntegration:
    """Integration tests for PE extractors."""

    def test_all_extractors_same_pe_object(self, pe_binary_path, mock_logger, pe_object):
        """Test that extractors can share the same PE object."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            # Create extractors sharing the same PE object
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger, pe=pe_object)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger, pe=pe_object)
            sections_ext = PESectionExtractor(pe_binary_path, mock_logger, pe=pe_object)

            # All should use the same PE object
            assert features_ext.pe is pe_object
            assert imports_ext.pe is pe_object
            assert sections_ext.pe is pe_object

            # All should extract successfully
            features_result = features_ext.extract()
            imports_result = imports_ext.extract()
            sections_result = sections_ext.extract()

            assert features_result is not None
            # imports and sections may be None if not present

    def test_hash_consistency_across_extractors(self, pe_binary_path, mock_logger):
        """Test that hashes are consistent across all extractors."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

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

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