Xiangchu Feng

113 papers A* 12B 1C 2Misc 1Journal 86Unranked 11
YearRankTypeTitle / Venue / Authors
2026 J jnl
Inf. Sci.
Wenyang Wei, Xiangchu Feng, Wenhang Song, Tiantian Liu, Weiwei Wang
2026 J jnl
Inf. Fusion
Bian Gao, Xiangchu Feng, Kun Wang, Hui Zhu
2025 J jnl
Signal Image Video Process.
Hui Zhu, Xiangchu Feng
2025 J jnl
Signal Process.
Bian Gao, Xiangchu Feng, Weiwei Wang, Kun Wang
2025 J jnl
CoRR
Wenyang Wei, Yang Yang, Xixi Jia, Xiangchu Feng, Weiwei Wang, Renzhen Wang
2025 J jnl
Comput. Vis. Image Underst.
Chuan Chen, Weiwei Wang, Xixi Jia, Xiangchu Feng, Hanjia Wei
2025 J jnl
Digit. Signal Process.
Shengjiang Kong, Weiwei Wang, Xiangchu Feng, Xixi Jia
2025 J jnl
J. Vis. Commun. Image Represent.
Shengjiang Kong, Weiwei Wang, Yu Han, Xiangchu Feng
2025 J jnl
Signal Process.
Hanjia Wei, Weiwei Wang, Xixi Jia, Xiangchu Feng, Chuan Chen
2025 J jnl
Eng. Appl. Artif. Intell.
Xiaofang Li, Weiwei Wang, Yu Han, Xiangchu Feng
2024 J jnl
Signal Process.
Tingting Qi, Xiangchu Feng, Weiwei Wang
2024 J jnl
Signal Process.
Kun Wang, Xiangchu Feng, Xixi Jia, Tingting Qi
2024 conf
ICCEIC
Xiaojing Jia, Xiangchu Feng, Hua Wu
2024 J jnl
Knowl. Based Syst.
Tingting Qi, Xiangchu Feng, Bian Gao, Kun Wang
2024 J jnl
Comput. Vis. Image Underst.
Xiaofang Li, Weiwei Wang, Xiangchu Feng, Min Li
2024 J jnl
Vis. Comput.
Ruolan Tang, Weiwei Wang, Yu Han, Xiangchu Feng
2024 J jnl
J. Vis. Commun. Image Represent.
Yixing Ji, Shengjiang Kong, Weiwei Wang, Xixi Jia, Xiangchu Feng
2024 J jnl
Eng. Appl. Artif. Intell.
Wenhao Wu, Weiwei Wang, Xixi Jia, Xiangchu Feng
2024 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Xixi Jia, Xiangchu Feng, Hongwei Yong, Deyu Meng
2023 J jnl
J. Vis. Commun. Image Represent.
Xiaofang Li, Weiwei Wang, Xiangchu Feng, Tingting Qi
2023 conf
ICCPR
Xiaoxiao Tan, Xiangchu Feng
2023 A* conf
NeurIPS
Xixi Jia, Hailin Wang, Jiangjun Peng, Xiangchu Feng, Deyu Meng
2022 J jnl
Signal Process.
Wenxiu Zhao, Weiwei Wang, Xiangchu Feng, Yu Han
2022 J jnl
Wirel. Pers. Commun.
Xiaoyan Li, Lixia Cao, Tonghui Wang, Xiangchu Feng
2022 J jnl
IEEE Trans. Image Process.
Shengjiang Kong, Weiwei Wang, Xiangchu Feng, Xixi Jia
2022 J jnl
Inf. Sci.
Tingting Qi, Xiangchu Feng, Weiwei Wang, Xiaofang Li
2022 J jnl
Signal Process.
Chunyu Yang, Weiwei Wang, Xiangchu Feng
2022 J jnl
Inf. Sci.
Xixi Jia, Deyu Meng, Xuande Zhang, Xiangchu Feng
2022 J jnl
CoRR
Lida Li, Shuai Li, Kun Wang, Xiangchu Feng, Lei Zhang
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Rui Zhang, Lixia Yang, Guojun Liu, Xiangchu Feng
2021 J jnl
IEEE Access
Bingzhe Wei, Xiangchu Feng, Weiwei Wang
2021 J jnl
Knowl. Based Syst.
Wenjuan Zhang, Xiangchu Feng, Feng Xiao, Xudong Wang
2021 J jnl
Inf. Sci.
Xixi Jia, Xiangchu Feng, Sanyang Liu
2021 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Xixi Jia, Xiangchu Feng, Weiwei Wang, Lei Zhang
2021 J jnl
Entropy
Bingzhe Wei, Xiangchu Feng, Kun Wang, Bian Gao
2020 J jnl
IEEE Access
Wenjuan Zhang, Xiangchu Feng, Yunmei Chen
2020 J jnl
IEEE Access
Chunyu Yang, Weiwei Wang, Xiangchu Feng, Shuisheng Zhou
2020 J jnl
Neurocomputing
Chunyu Yang, Weiwei Wang, Xiangchu Feng, Ruiqiang He
2020 conf
ECCV (10)
Lida Li, Kun Wang, Shuai Li, Xiangchu Feng, Lei Zhang
2020 J jnl
IEEE Access
Mei Gao, Baosheng Kang, Xiangchu Feng, Lixia Cao, Wenjuan Zhang
2020 conf
ACAI
Bingzhe Wei, Xiangchu Feng, Kun Wang, Bing Gao
2020 J jnl
Neurocomputing
Ruiqiang He, Xiangchu Feng, Weiwei Wang, Xiaolong Zhu, Chunyu Yang
2019 J jnl
Inf. Sci.
Xiaolong Zhu, Xiangchu Feng, Weiwei Wang, Xixi Jia, Ruiqiang He
2019 J jnl
Comput. Math. Appl.
Rui Zhang, Xiangchu Feng, Lixia Yang, Lihong Chang, Xiaolong Zhu
2019 J jnl
Signal Process. Image Commun.
Yafeng Li, Qijun Zhao, Xiangchu Feng, Weiwei Wang, Renrui Zhang, An Yan
2019 J jnl
Sensors
Mei Gao, Baosheng Kang, Xiangchu Feng, Wei Zhang, Wenjuan Zhang
2019 J jnl
IET Image Process.
Lihong Chang, Xiangchu Feng, Xiaolong Zhu, Rui Zhang, Ruiqiang He, Chen Xu
2019 conf
ICCPR
Bingzhe Wei, Xiangchu Feng, Weiwei Wang, Ruiqiang He
2019 A* conf
CVPR
Xixi Jia, Sanyang Liu, Xiangchu Feng, Lei Zhang
2019 conf
ISICDM
Chunyu Yang, Weiwei Wang, Xiangchu Feng
2019 J jnl
Inf. Sci.
Xixi Jia, Xiangchu Feng, Weiwei Wang, Hua Huang, Chen Xu
2019 conf
ISICDM
Qian Wang, Weiwei Wang, Xiangchu Feng
2019 J jnl
Signal Process.
Chunyu Yang, Weiwei Wang, Xiangchu Feng, Xin Liu
2018 J jnl
Neurocomputing
Xixi Jia, Xiangchu Feng, Weiwei Wang, Lei Zhang
2018 J jnl
Neurocomputing
Xixi Jia, Xiangchu Feng, Weiwei Wang, Chen Xu, Lei Zhang
2018 J jnl
Neurocomputing
Huazhu Chen, Weiwei Wang, Xiangchu Feng, Ruiqiang He
2018 J jnl
J. Vis. Commun. Image Represent.
Xiaolong Zhu, Xiangchu Feng, Weiwei Wang, Xixi Jia, Rui Zhang, Ruiqiang He, Chen Xu
2018 J jnl
IEEE Trans. Geosci. Remote. Sens.
Lixia Yang, Min Wang, Shuyuan Yang, Hui Zhao, Licheng Jiao, Xiangchu Feng
2018 J jnl
Neurocomputing
Chen-ping Zhao, Xiangchu Feng, Xixi Jia, Ruiqiang He, Chen Xu
2018 conf
CSAE
Xiangchu Feng, Shuai Ma, Bingzhe Wei
2018 J jnl
Pattern Recognit.
Huazhu Chen, Weiwei Wang, Xiangchu Feng
2018 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Weiwei Wang, Binbin Zhang, Xiangchu Feng
2018 J jnl
IEEE Trans. Image Process.
Weiwei Wang, Chunyu Yang, Huazhu Chen, Xiangchu Feng
2017 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Liang Lin, Guangrun Wang, Wangmeng Zuo, Xiangchu Feng, Lei Zhang
2017 J jnl
Signal Process. Image Commun.
Rui Zhang, Xiangchu Feng, Lixia Yang, Lihong Chang, Chen Xu
2017 A* conf
ICCV
Jun Xu, Lei Zhang, David Zhang, Xiangchu Feng
2017 J jnl
CoRR
Jun Xu, Lei Zhang, David Zhang, Xiangchu Feng
2017 J jnl
Int. J. Comput. Vis.
Shuhang Gu, Qi Xie, Deyu Meng, Wangmeng Zuo, Xiangchu Feng, Lei Zhang
2016 A* conf
CVPR
Sijia Cai, Lei Zhang, Wangmeng Zuo, Xiangchu Feng
2016 A* conf
IJCAI
Pengfei Zhu, Lei Zhang, Wangmeng Zuo, Xiangchu Feng, Qinghua Hu
2016 J jnl
Digit. Signal Process.
Lihong Chang, Xiangchu Feng, Xiaoping Li, Rui Zhang
2016 J jnl
Pattern Recognit.
Yafeng Li, Xiangchu Feng
2016 B conf
ICIP
Xixi Jia, Xiangchu Feng, Weiwei Wang
2016 J jnl
CoRR
Liang Lin, Guangrun Wang, Wangmeng Zuo, Xiangchu Feng, Lei Zhang
2016 J jnl
IET Image Process.
Xiaoping Li, Weiwei Wang, Xiangchu Feng, Xiaoyan Liu, Liang Luo
2016 J jnl
Signal Process.
Xixi Jia, Xiangchu Feng, Weiwei Wang
2015 J jnl
Signal Process.
Xiangchu Feng, Liang Luo, Xixi Jia, Weiwei Wang
2015 A* conf
ICCV
Shuhang Gu, Wangmeng Zuo, Qi Xie, Deyu Meng, Xiangchu Feng, Lei Zhang
2015 J jnl
Multim. Tools Appl.
Xiaobo Zhang, Xiangchu Feng
2015 J jnl
IEICE Trans. Inf. Syst.
Leigang Huo, Xiangchu Feng, Chunlei Huo, Chunhong Pan
2015 A* conf
ICCV
Jun Xu, Lei Zhang, Wangmeng Zuo, David Zhang, Xiangchu Feng
2014 J jnl
Multidimens. Syst. Signal Process.
Jianlou Xu, Xiangchu Feng, Yan Hao
2014 J jnl
Signal Image Video Process.
Wen-Juan Zhang, Xiangchu Feng, Yu Han
2014 J jnl
Sci. China Inf. Sci.
Jianlou Xu, Xiangchu Feng, Yan Hao, Yu Han
2014 J jnl
IEEE Trans. Image Process.
Wufeng Xue, Xuanqin Mou, Lei Zhang, Alan C. Bovik, Xiangchu Feng
2014 J jnl
IEEE Geosci. Remote. Sens. Lett.
Leigang Huo, Xiangchu Feng, Chunlei Huo, Zhixin Zhou, Chunhong Pan
2014 C conf
CIS
Tao Li, Weiwei Wang, Long Xu, Xiangchu Feng
2014 J jnl
Int. J. Comput. Math.
Yu Han, Chen Xu, George Baciu, Xiangchu Feng
2014 J jnl
CoRR
Qi Xie, Deyu Meng, Shuhang Gu, Lei Zhang, Wangmeng Zuo, Xiangchu Feng, Zongben Xu
2014 conf
NIPS
Shuhang Gu, Lei Zhang, Wangmeng Zuo, Xiangchu Feng
2014 J jnl
Signal Process. Image Commun.
Weiwei Wang, Dong Zhai, Tao Li, Xiangchu Feng
2014 J jnl
Int. J. Comput. Vis.
Meng Yang, Lei Zhang, Xiangchu Feng, David Zhang
2014 conf
ECCV (4)
Sijia Cai, Wangmeng Zuo, Lei Zhang, Xiangchu Feng, Ping Wang
2014 A* conf
CVPR
Shuhang Gu, Lei Zhang, Wangmeng Zuo, Xiangchu Feng
2013 A* conf
ICCV
Wangmeng Zuo, Deyu Meng, Lei Zhang, Xiangchu Feng, David Zhang
2013 J jnl
Sci. China Inf. Sci.
Yafeng Li, Xiangchu Feng
2013 J jnl
Appl. Math. Comput.
Xu-Dong Wang, Xiangchu Feng, Weiwei Wang, Wen-Juan Zhang
2013 Misc conf
ICNC
Leigang Huo, Xiangchu Feng, Chunhong Pan, Shiming Xiang, Chunlei Huo
2013 A* conf
ICCV
Wufeng Xue, Xuanqin Mou, Lei Zhang, Xiangchu Feng
2013 J jnl
IEEE Trans. Image Process.
Xuande Zhang, Xiangchu Feng, Weiwei Wang
2012 J jnl
CoRR
Lei Zhang, Meng Yang, Xiangchu Feng, Yi Ma, David Zhang
2012 J jnl
Pattern Recognit. Lett.
Yafeng Li, Xiangchu Feng
2011 A* conf
ICCV
Meng Yang, Lei Zhang, Xiangchu Feng, David Zhang
2011 A* conf
ICCV
Lei Zhang, Meng Yang, Xiangchu Feng
2008 J jnl
Int. J. Wavelets Multiresolution Inf. Process.
Min Li, Binbin Hao, Xiangchu Feng
2008 J jnl
Int. J. Wavelets Multiresolution Inf. Process.
Lingling Jiang, Xiangchu Feng, Haiqing Yin
2008 J jnl
J. Math. Imaging Vis.
Lingling Jiang, Xiangchu Feng, Haiqing Yin
2008 J jnl
Signal Process. Image Commun.
Binbin Hao, Min Li, Xiangchu Feng
2007 J jnl
IEEE Trans. Image Process.
Jian Bai, Xiangchu Feng
2007 J jnl
Signal Image Video Process.
Lingling Jiang, Xiangchu Feng, Haiqing Yin
2006 C conf
CIS
Min Li, Xiangchu Feng
2005 J jnl
Sci. China Ser. F Inf. Sci.
Jian Bai, Xiangchu Feng
2004 conf
ICIAR (1)
Tan Shan, Licheng Jiao, Xiangchu Feng
tests/conftest.py
← Index tests/conftest.py python
"""
Pytest configuration and shared fixtures for REDB unit tests.
"""
import os
import sys
import pytest
import logging
import tempfile
import hashlib
from unittest.mock import Mock, MagicMock, patch
from pathlib import Path

# Add the project root to the path
sys.path.insert(0, str(Path(__file__).parent.parent))

# Test files directory
TEST_FILES_DIR = Path(__file__).parent.parent / "test_files"


# ============================================================================
# Logger Fixtures
# ============================================================================

@pytest.fixture
def mock_logger():
    """Create a mock logger for testing."""
    logger = Mock()
    logger.debug = Mock()
    logger.info = Mock()
    logger.warning = Mock()
    logger.error = Mock()
    return logger


@pytest.fixture
def real_logger():
    """Create a real logger for testing with debug output."""
    logger = logging.getLogger("test_logger")
    logger.setLevel(logging.DEBUG)
    if not logger.handlers:
        handler = logging.StreamHandler()
        handler.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    return logger


# ============================================================================
# Test Binary Files Fixtures
# ============================================================================

@pytest.fixture
def elf_binary_path():
    """Path to the ELF test binary."""
    path = TEST_FILES_DIR / "hello"
    if not path.exists():
        pytest.skip(f"Test file not found: {path}")
    return str(path)


@pytest.fixture
def elf_advanced_binary_path():
    """Path to the advanced ELF test binary."""
    path = TEST_FILES_DIR / "hello_advanced"
    if not path.exists():
        pytest.skip(f"Test file not found: {path}")
    return str(path)


@pytest.fixture
def pe_binary_path():
    """Path to the PE test binary (.NET PE)."""
    path = TEST_FILES_DIR / "d8637bdbcfc9112fcb1f0167b398e771"
    if not path.exists():
        pytest.skip(f"Test file not found: {path}")
    return str(path)


@pytest.fixture
def elf_binary_content(elf_binary_path):
    """Read the ELF test binary content."""
    with open(elf_binary_path, "rb") as f:
        return f.read()


@pytest.fixture
def pe_binary_content(pe_binary_path):
    """Read the PE test binary content."""
    with open(pe_binary_path, "rb") as f:
        return f.read()


# ============================================================================
# Temporary Files Fixtures
# ============================================================================

@pytest.fixture
def temp_binary_file():
    """Create a temporary binary file for testing."""
    with tempfile.NamedTemporaryFile(delete=False, suffix=".bin") as f:
        # Write some test data
        f.write(b"\x7fELF" + b"\x00" * 100 + b"test data")
        temp_path = f.name

    yield temp_path

    # Cleanup
    if os.path.exists(temp_path):
        os.unlink(temp_path)


@pytest.fixture
def temp_text_file():
    """Create a temporary text file for testing."""
    with tempfile.NamedTemporaryFile(delete=False, suffix=".txt", mode="w") as f:
        f.write("This is a test file with some text content.")
        temp_path = f.name

    yield temp_path

    # Cleanup
    if os.path.exists(temp_path):
        os.unlink(temp_path)


@pytest.fixture
def temp_pe_like_file():
    """Create a temporary file with PE-like header for testing."""
    with tempfile.NamedTemporaryFile(delete=False, suffix=".exe") as f:
        # MZ header
        f.write(b"MZ" + b"\x00" * 58)
        # e_lfanew pointing to PE header at offset 64
        f.write(b"\x40\x00\x00\x00")
        # PE signature at offset 64
        f.write(b"PE\x00\x00")
        # Minimal COFF header (20 bytes)
        f.write(b"\x4c\x01")  # Machine (i386)
        f.write(b"\x01\x00")  # NumberOfSections
        f.write(b"\x00" * 16)  # Rest of COFF header
        temp_path = f.name

    yield temp_path

    # Cleanup
    if os.path.exists(temp_path):
        os.unlink(temp_path)


# ============================================================================
# Mock Exporter Fixtures
# ============================================================================

@pytest.fixture
def mock_print_exporter(mock_logger):
    """Create a mock PrintExporter."""
    from redb.extractors.database_exporters import PrintExporter
    exporter = PrintExporter(mock_logger, "test_index")
    return exporter


@pytest.fixture
def mock_elasticsearch_exporter(mock_logger):
    """Create a mock ElasticsearchExporter with mocked client."""
    with patch('redb.settings.get_elasticsearch_client') as mock_client:
        mock_client.return_value = Mock()
        from redb.extractors.database_exporters import ElasticsearchExporter
        exporter = ElasticsearchExporter(mock_logger, "test_index")
        return exporter


@pytest.fixture
def mock_clickhouse_exporter(mock_logger):
    """Create a mock ClickHouseExporter with mocked client."""
    with patch('redb.settings.create_clickhouse_client') as mock_client:
        mock_client.return_value = Mock()
        from redb.extractors.database_exporters import ClickHouseExporter
        exporter = ClickHouseExporter(mock_logger, "test_index", client=Mock())
        return exporter


# ============================================================================
# Mock Settings Fixtures
# ============================================================================

@pytest.fixture
def mock_settings():
    """Mock the redb.settings module."""
    with patch.multiple(
        'redb.settings',
        ELASTIC_BINARIES_COLLECTION="test_collection",
        get_elasticsearch_client=Mock(return_value=Mock()),
        create_clickhouse_client=Mock(return_value=Mock()),
    ):
        yield


# ============================================================================
# Hash Fixtures
# ============================================================================

@pytest.fixture
def known_hashes(elf_binary_content):
    """Compute known hashes for the ELF test binary."""
    return {
        'md5': hashlib.md5(elf_binary_content).hexdigest(),
        'sha1': hashlib.sha1(elf_binary_content).hexdigest(),
        'sha256': hashlib.sha256(elf_binary_content).hexdigest(),
    }


@pytest.fixture
def pe_known_hashes(pe_binary_content):
    """Compute known hashes for the PE test binary."""
    return {
        'md5': hashlib.md5(pe_binary_content).hexdigest(),
        'sha1': hashlib.sha1(pe_binary_content).hexdigest(),
        'sha256': hashlib.sha256(pe_binary_content).hexdigest(),
    }


# ============================================================================
# Sample Data Fixtures
# ============================================================================

@pytest.fixture
def sample_binary_data():
    """Sample binary data for entropy and hash testing."""
    return b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" * 16


@pytest.fixture
def high_entropy_data():
    """High entropy random-like data for testing."""
    import random
    random.seed(42)  # Reproducible
    return bytes(random.randint(0, 255) for _ in range(256))


@pytest.fixture
def low_entropy_data():
    """Low entropy repetitive data for testing."""
    return b"\x00" * 256


# ============================================================================
# PE Object Fixtures
# ============================================================================

@pytest.fixture
def pe_object(pe_binary_path):
    """Create a pefile PE object for testing."""
    import pefile
    try:
        pe = pefile.PE(pe_binary_path)
        yield pe
        pe.close()
    except Exception as e:
        pytest.skip(f"Failed to parse PE file: {e}")


# ============================================================================
# ELF Object Fixtures
# ============================================================================

@pytest.fixture
def elf_object(elf_binary_path):
    """Create an ELFFile object for testing."""
    from elftools.elf.elffile import ELFFile
    try:
        with open(elf_binary_path, 'rb') as f:
            elf = ELFFile(f)
            # We need to keep the file open for ELFFile to work
            yield elf
    except Exception as e:
        pytest.skip(f"Failed to parse ELF file: {e}")


# ============================================================================
# Dataclass Fixtures
# ============================================================================

@pytest.fixture
def sample_hash_dataclass():
    """Create a sample Hash dataclass."""
    from redb.models.dataclasses import Hash
    return Hash(
        md5="d41d8cd98f00b204e9800998ecf8427e",
        sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709",
        sha256="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    )


@pytest.fixture
def sample_hashes_dataclass():
    """Create a sample Hashes dataclass."""
    from redb.models.dataclasses import Hashes
    return Hashes(
        md5="d41d8cd98f00b204e9800998ecf8427e",
        sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709",
        sha256="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        ssdeep_hash="3::",
        tlsh_hash=""
    )


@pytest.fixture
def sample_basic_properties():
    """Create a sample BasicProperties dataclass."""
    from redb.models.dataclasses import BasicProperties
    return BasicProperties(
        filename="test.exe",
        sample_name="test.exe",
        filesize=1024,
        filetype="PE32 executable",
        filetype_mime="application/x-dosexec",
        filetype_magika="pebin",
        file_entropy=6.5
    )


# ============================================================================
# Utility Functions for Tests
# ============================================================================

def compute_entropy(data):
    """Compute entropy of data for verification in tests."""
    import math
    from collections import Counter

    if not data:
        return 0.0

    if isinstance(data, str):
        counts = Counter(data)
        frequencies = (i / len(data) for i in counts.values())
        return -sum(f * math.log(f, 2) for f in frequencies)
    else:
        occurrences = Counter(bytearray(data))
        entropy = 0
        for x in occurrences.values():
            p_x = float(x) / len(data)
            entropy -= p_x * math.log(p_x, 2)
        return entropy


# Make the function available as a fixture
@pytest.fixture
def entropy_calculator():
    """Return the entropy calculation function."""
    return compute_entropy


# ============================================================================
# Skip Markers
# ============================================================================

# Mark tests that require external tools
requires_die = pytest.mark.skipif(
    not os.path.exists("/usr/bin/diec") and not os.path.exists("/usr/local/bin/diec"),
    reason="Detect It Easy (diec) not installed"
)

requires_capa = pytest.mark.skipif(
    not os.path.exists("/usr/bin/capa") and not os.path.exists("/usr/local/bin/capa"),
    reason="capa not installed"
)

requires_floss = pytest.mark.skipif(
    not os.path.exists("/usr/bin/floss") and not os.path.exists("/usr/local/bin/floss"),
    reason="floss not installed"
)