Files
capa/tests/test_smda_features.py
Willi Ballenthin bd63ded1dd file scope API features (#568)
* smda: minor unrelated fixes

* file features: extract API features at file scope for library functions

closes #567

* changelog

* ida: add file-scope API feature

Co-authored-by: mike-hunhoff <mike.hunhoff@gmail.com>

* fix lints from pylance

* features: use "function-name" for recognized linked functions

* pep8

* pep8

* rules: remove incorrect feature scope

* tests: xfail SMDA tests relying on function id

* tests: fixtures: order tests by sample, ideally improving memory usage

* pep8

* pep8

* smda: xfail two more tests

Co-authored-by: mike-hunhoff <mike.hunhoff@gmail.com>
2021-05-27 12:59:00 -06:00

56 lines
2.3 KiB
Python

# Copyright (C) 2020 FireEye, Inc. All Rights Reserved.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at: [package root]/LICENSE.txt
# Unless required by applicable law or agreed to in writing, software distributed under the License
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License.
import sys
import pytest
from fixtures import *
from fixtures import parametrize
import capa.features.file
def smda_parametrize(params, valuess, **kwargs):
"""
fixup pytest parametrization to mark a subset of tests as xfail.
xfail SMDA tests that rely on function id.
"""
ret = []
for values in valuess:
(sample, scope, feature, expected) = values
if scope == "file" and isinstance(feature, capa.features.file.FunctionName) and expected is True:
# pytest.param behaves like a list, but carries along associated marks, like xfail.
#
# https://stackoverflow.com/a/30575822/87207
ret.append(pytest.param(*values, marks=pytest.mark.xfail(reason="SMDA has no function ID", strict=True)))
elif sample == "a1982..." and sys.platform == "win32":
ret.append(pytest.param(*values, marks=pytest.mark.xfail(reason="SMDA bug tracked #585", strict=True)))
elif sample == "al-khaser x64" and sys.platform == "win32":
ret.append(pytest.param(*values, marks=pytest.mark.xfail(reason="SMDA bug tracked #585", strict=True)))
else:
ret.append(values)
return parametrize(params, ret, **kwargs)
@smda_parametrize(
"sample,scope,feature,expected",
FEATURE_PRESENCE_TESTS,
indirect=["sample", "scope"],
)
def test_smda_features(sample, scope, feature, expected):
do_test_feature_presence(get_smda_extractor, sample, scope, feature, expected)
@smda_parametrize(
"sample,scope,feature,expected",
FEATURE_COUNT_TESTS,
indirect=["sample", "scope"],
)
def test_smda_feature_counts(sample, scope, feature, expected):
do_test_feature_count(get_smda_extractor, sample, scope, feature, expected)