Xiangqian Wu

42 papers C 15Journal 15Unranked 12
YearRankTypeTitle / Venue / Authors
2023 J jnl
Remote. Sens.
Fangfang Yu, Xiangqian Wu, Xi Shao, Haifeng Qian
2020 C conf
IGARSS
Jon Fulbright, David R. Pogorzala, Elizabeth Kline, Zhipeng Wang, Fangfang Yu, Hyelim Yoo, Xiangqian Wu
2018 conf
Earth Observing Systems
Haifeng Qian, Xiangqian Wu, Fangfang Yu, Xi Shao, Robert Iacovazzi, Zhipeng Wang, Hyelim Yoo
2018 J jnl
Remote. Sens.
Satya Kalluri, Christian Alcala, James Carr, Paul Griffith, William Lebair, Dan Lindsey, Randall Race, Xiangqian Wu, Spencer Zierk
2018 conf
Earth Observing Systems
Fangfang Yu, Xi Shao, Xiangqian Wu, Haifeng Qian
2018 conf
Earth Observing Systems
Zhipeng Wang, Xiangqian Wu, Haifeng Qian, Fangfang Yu, Robert Iacovazzi, Xi Shao, Vladimir Kondratovich, Hyelim Yoo
2018 C conf
IGARSS
Satya Kalluri, Jaime Daniels, Mathew M. Gunshor, Dan Lindsey, Timothy J. Schmit, Xiangqian Wu
2018 conf
Earth Observing Systems
Fangfang Yu, Xiangqian Wu, Haifeng Qian, John Van Naarden, Michael Ramirez, Dan Lindsey, Chad Gravelle, Mathew M. Gunshor, Timothy J. Schmit, Xi Shao, Zhipeng Wang, Hyelim Yoo, Bob Iacovazzi, Vladimir Kondratovich
2018 conf
Earth Observing Systems
Xi Shao, Xiangqian Wu, Changyong Cao, Sirish Uprety, Fangfang Yu, Haifeng Qian, Frank Padula, Aaron Pearlman, Taeyoung Choi, Brent Bartlett, Jason Casey
2017 conf
Earth Observing Systems
Fangfang Yu, Xiangqian Wu, Xi Shao, Boryana Efremova, Hyelim Yoo, Haifeng Qian, Bob Iacovazzi
2017 C conf
IGARSS
Xiangqian Wu, Fangfang Yu, Vladimir Kondratovich, Boryana Efremova, Xi Shao, Robert Iacovazzi, Changyong Cao
2017 conf
Earth Observing Systems
Tiejun Chang, Xiaoxiong (Jack) Xiong, Graziela R. Keller, Xiangqian Wu
2017 conf
Earth Observing Systems
Hyelim Yoo, Fangfang Yu, Xiangqian Wu
2017 C conf
IGARSS
Xi Shao, Xiangqian Wu, Fangfang Yu
2017 conf
Earth Observing Systems
Fangfang Yu, Xi Shao, Xiangqian Wu, Vladimir Kondratovich, Zhengping Li
2016 conf
Earth Observing Systems
Xi Shao, Xiangqian Wu, Fangfang Yu
2016 C conf
IGARSS
Xi Shao, Changyong Cao, Bin Zhang, Yan Bai, Xiangqian Wu, Fangfang Yu
2016 J jnl
Remote. Sens.
Raju Datla, Xi Shao, Changyong Cao, Xiangqian Wu
2016 conf
Earth Observing Systems
Boryana Efremova, Aaron J. Pearlman, Frank Padula, Xiangqian Wu
2016 C conf
IGARSS
Fangfang Yu, Xiangqian Wu, Xi Shao, Vladimir Kondratovich
2016 J jnl
Remote. Sens.
Fangfang Yu, Xiangqian Wu
2015 J jnl
IEEE Trans. Geosci. Remote. Sens.
Tiejun Chang, Xiangqian Wu, Fuzhong Weng
2014 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Chunhui Pan, Larry Flynn, Richard Buss, Xiangqian Wu, Wei Yu, Michael G. Grotenhuis
2014 conf
Earth Observing Systems
Michael G. Grotenhuis, Xiangqian Wu, Larry Flynn, Eric Beach, Jianguo Niu, Wei Yu
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xiangqian Wu, Fangfang Yu
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Fangfang Yu, Xiangqian Wu
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Fangfang Yu, Xiangqian Wu, M. K. Rama Varma Raja, Yaping Li, Likun Wang, Mitchell D. Goldberg
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Likun Wang, Xiangqian Wu, Fuzhong Weng, Mitchell D. Goldberg
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gyanesh Chander, Tim J. Hewison, Nigel P. Fox, Xiangqian Wu, Xiaoxiong Xiong, William J. Blackwell
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Tim J. Hewison, Xiangqian Wu, Fangfang Yu, Yoshihiko Tahara, Xiuqing Hu, Dohyeong Kim, Marianne Koenig
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Gyanesh Chander, Tim J. Hewison, Nigel P. Fox, Xiangqian Wu, Xiaoxiong Xiong, William J. Blackwell
2013 C conf
IGARSS
Chunhui Pan, Xiangqian Wu, Lawrence E. Flynn, Michael G. Grotenhuis
2013 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Chunhui Pan, Matthew Kowalewski, Richard Buss, Lawrence E. Flynn, Xiangqian Wu, Maria Caponi, Fuzhong Weng
2013 J jnl
IEEE Trans. Geosci. Remote. Sens.
Fangfang Yu, Xiangqian Wu
2013 C conf
IGARSS
Chunhui Pan, Xiangqian Wu, Lawrence E. Flynn, Michael G. Grotenhuis, Fuzhong Weng
2012 C conf
IGARSS
Glen Jaross, Richard Buss, Maria Caponi, Lawrence E. Flynn, Scott J. Janz, Megan Novicki, Chunhui Pan, Didier Rault, Colin J. Seftor, Bhaswar Sen, Xiangqian Wu
2012 C conf
IGARSS
Chunhui Pan, Fuzhong Weng, Glen Jaross, Xiangqian Wu, Michael Haken, Larry Flynn, Scott J. Janz, Maria Caponi, Matthew Kowalewski, Richard Buss
2012 C conf
IGARSS
Lawrence E. Flynn, Didier Rault, Glen Jaross, Irina Petropavlovskikh, Craig Long, Eric Beach, Wei Yu, Jianguo Niu, Dustin Swales, Chunhui Pan, Xiangqian Wu
2011 C conf
IGARSS
Fangfang Yu, Xiangqian Wu, Mitchell D. Goldberg
2011 C conf
IGARSS
Xiangqian Wu, Haifeng Qian, Fangfang Yu, Trevor Beck
2007 C conf
IGARSS
Changyong Cao, Aisheng Wu, Xiaoxiong Xiong, Xiangqian Wu
2005 C conf
IGARSS
Changyong Cao, Fuzhong Weng, Mitchell D. Goldberg, Xiangqian Wu, Hui Xu, Pubu Ciren
tests/integration/test_pe_extractor.py
← Index tests/integration/test_pe_extractor.py python
"""
Integration tests for the PEExtractor base class.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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