Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dist/tools/ci/static_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ run ./dist/tools/coccinelle/check.sh
run ./dist/tools/flake8/check.sh
run ./dist/tools/headerguards/check.sh
run ./dist/tools/buildsystem_sanity_check/check.sh
run ./dist/tools/feature_resolution/check.sh
run ./dist/tools/codespell/check.sh
if [ -z "${GITHUB_RUN_ID}" ]; then
run ./dist/tools/uncrustify/uncrustify.sh --check
Expand Down
2 changes: 2 additions & 0 deletions dist/tools/feature_resolution/check.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/sh
make --silent -C "$(dirname "$0")"/../../../makefiles/tests/feature_resolution
26 changes: 15 additions & 11 deletions makefiles/features_check.inc.mk
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
# Check if all required FEATURES are provided

# Features that are provided and not blacklisted
FEATURES_USABLE := $(filter-out $(FEATURES_BLACKLIST),$(FEATURES_PROVIDED))

# Features that may be used, if provided.
FEATURES_OPTIONAL_ONLY := $(sort $(filter-out $(FEATURES_REQUIRED),$(FEATURES_OPTIONAL)))
FEATURES_OPTIONAL_USED := $(sort $(filter $(FEATURES_PROVIDED),$(FEATURES_OPTIONAL_ONLY)))
# Optional features that will not be used because they are not provided
FEATURES_OPTIONAL_MISSING := $(sort $(filter-out $(FEATURES_PROVIDED),$(FEATURES_OPTIONAL_ONLY)))

# Optional features that end up being used
FEATURES_OPTIONAL_USED := $(sort $(filter $(FEATURES_USABLE),$(FEATURES_OPTIONAL_ONLY)))

# Optional features that will not be used because they are not provided or blacklisted
FEATURES_OPTIONAL_MISSING := $(sort $(filter-out $(FEATURES_USABLE),$(FEATURES_OPTIONAL_ONLY)))

# Features that are used without taking "one out of" dependencies into account
FEATURES_USED_SO_FAR := $(sort $(FEATURES_REQUIRED) $(FEATURES_OPTIONAL_USED))

# Features that are provided and not blacklisted
FEATURES_USABLE := $(filter-out $(FEATURES_BLACKLIST),$(FEATURES_PROVIDED))

# Additionally required features due to the "one out of" dependencies
# Algorithm:
# - For each list in FEATURES_REQUIRED_ANY as "item":
Expand Down Expand Up @@ -47,11 +51,6 @@ FEATURES_USED := $(sort $(FEATURES_REQUIRED) \
$(FEATURES_REQUIRED_ONE_OUT_OF) \
$(FEATURES_OPTIONAL_USED))

# Used features that conflict when used together
FEATURES_CONFLICTING := $(sort $(foreach conflict,\
$(FEATURES_CONFLICT),\
$(call _features_conflicting,$(conflict))))

# Return conflicting features from the conflict string feature1:feature2
# $1: feature1:feature2
# Return the list of conflicting features
Expand All @@ -61,6 +60,11 @@ _features_conflicting = $(if $(call _features_used_conflicting,$(subst :, ,$1)),
# Return non empty on error
_features_used_conflicting = $(filter $(words $1),$(words $(filter $(FEATURES_USED),$1)))

# Used features that conflict when used together
FEATURES_CONFLICTING := $(sort $(foreach conflict,\
$(FEATURES_CONFLICT),\
$(call _features_conflicting,$(conflict))))

# Features that are used by the application but blacklisted by the BSP.
# Having blacklisted features may cause the build to fail.
FEATURES_USED_BLACKLISTED := $(sort $(filter $(FEATURES_USED), $(FEATURES_BLACKLIST)))
12 changes: 12 additions & 0 deletions makefiles/tests/feature_resolution/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.PHONY: all info-boards-supported

TESTS := $(patsubst test-%.mk,run-%,$(wildcard test-*.mk))

all: $(TESTS)

info-boards-supported:
@echo none

run-%: test-%.mk
@echo "Running test $(patsubst run-%,%,$@)"
@$(MAKE) --silent -f $<
23 changes: 23 additions & 0 deletions makefiles/tests/feature_resolution/Makefile.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
include ../../features_check.inc.mk

FEATURES_VARS := \
FEATURES_CONFLICTING \
FEATURES_USED \
FEATURES_USED_BLACKLISTED \
FEATURES_MISSING \
#

define _expected =
ifneq ($$(EXPECTED_$1),$$($1))
$$(info EXPECTED_$1 = $$(EXPECTED_$1))
$$(info $1 = $$($1))
$$(error $1 incorrectly resolved)
endif
endef

$(foreach var,$(FEATURES_VARS),$(eval $(call _expected,$(var))))


.PHONY: all
all:
@echo Success
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
Simple Unit Tests for Feature Resolution
========================================

This folder contains a Makefile that runs a set of unit tests for the feature resolution logic.
Each unit test is defined in a file named `tests-<NAME_OF_TEST>.mk` in which the inputs and the
expected outputs are defined. Finally, the include `Makefile.test`, which will perform the tests.

The tests can be run simply by typing `make`. Also, `make static-test` at the root of the repo will
run these tests and, hence, these tests are also executed on each CI run.

Adding new Test Cases
---------------------

Just create a new `tests-<NAME_OF_NEW_TEST>.mk` file and start with the contests of an existing
test case and change the inputs and expected outputs accordingly.
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-blacklist-failure.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED := a b
FEATURES_REQUIRED_ANY :=
FEATURES_PROVIDED := a b c
FEATURES_BLACKLIST := b
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := a b
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED := b
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-blacklist-optional.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL := c
FEATURES_REQUIRED := a b
FEATURES_REQUIRED_ANY :=
FEATURES_PROVIDED := a b c
FEATURES_BLACKLIST := c
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := a b
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-blacklist-success.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED := a b
FEATURES_REQUIRED_ANY :=
FEATURES_PROVIDED := a b c
FEATURES_BLACKLIST := c
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := a b
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-complex-failure.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL := a b
FEATURES_REQUIRED := c d
FEATURES_REQUIRED_ANY := e|f|d a|h|i
FEATURES_PROVIDED := a b c d e f g
FEATURES_BLACKLIST := a
FEATURES_CONFLICT := f:e c:d

# expected results
EXPECTED_FEATURES_USED := a|h|i b c d
EXPECTED_FEATURES_MISSING := a|h|i
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING := c d

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-complex-success.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL := a b
FEATURES_REQUIRED := c d
FEATURES_REQUIRED_ANY := e|f|d
FEATURES_PROVIDED := a b c d e f g
FEATURES_BLACKLIST := a
FEATURES_CONFLICT := f:e

# expected results
EXPECTED_FEATURES_USED := b c d
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-conflict-failure.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED := a b
FEATURES_REQUIRED_ANY :=
FEATURES_PROVIDED := a b c d
FEATURES_BLACKLIST :=
FEATURES_CONFLICT := a:b c:d

# expected results
EXPECTED_FEATURES_USED := a b
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING := a b

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-conflict-success.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED := a c
FEATURES_REQUIRED_ANY :=
FEATURES_PROVIDED := a b c d
FEATURES_BLACKLIST :=
FEATURES_CONFLICT := a:b c:d

# expected results
EXPECTED_FEATURES_USED := a c
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-empty.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED :=
FEATURES_REQUIRED_ANY :=
FEATURES_PROVIDED :=
FEATURES_BLACKLIST :=
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED :=
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED := a
FEATURES_REQUIRED_ANY := b
FEATURES_PROVIDED := a b c
FEATURES_BLACKLIST :=
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := a b
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-required-any-fail.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED :=
FEATURES_REQUIRED_ANY := d|b|a
FEATURES_PROVIDED := c
FEATURES_BLACKLIST :=
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := d|b|a
EXPECTED_FEATURES_MISSING := d|b|a
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-required-any-order.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED :=
FEATURES_REQUIRED_ANY := d|b|a
FEATURES_PROVIDED := a b c
FEATURES_BLACKLIST :=
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := b
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL := a
FEATURES_REQUIRED :=
FEATURES_REQUIRED_ANY := d|b|a
FEATURES_PROVIDED := a b c
FEATURES_BLACKLIST :=
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := a
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED := a b
FEATURES_REQUIRED_ANY := c|b
FEATURES_PROVIDED := a b c
FEATURES_BLACKLIST :=
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := a b
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-trivial-failure.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED := a b
FEATURES_REQUIRED_ANY :=
FEATURES_PROVIDED := a c
FEATURES_BLACKLIST :=
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := a b
EXPECTED_FEATURES_MISSING := b
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test
15 changes: 15 additions & 0 deletions makefiles/tests/feature_resolution/test-trivial-success.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# inputs
FEATURES_OPTIONAL :=
FEATURES_REQUIRED := a b
FEATURES_REQUIRED_ANY :=
FEATURES_PROVIDED := a b c
FEATURES_BLACKLIST :=
FEATURES_CONFLICT :=

# expected results
EXPECTED_FEATURES_USED := a b
EXPECTED_FEATURES_MISSING :=
EXPECTED_FEATURES_USED_BLACKLISTED :=
EXPECTED_FEATURES_CONFLICTING :=

include Makefile.test