[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v16 3/4] tools/tests: introduce unit tests for domain ID allocator
On Tue, Aug 12, 2025 at 10:30:50PM +0000, dmkhn@xxxxxxxxx wrote: > diff --git a/tools/tests/domid/.gitignore b/tools/tests/domid/.gitignore > new file mode 100644 > index 000000000000..0e02715159c2 > --- /dev/null > +++ b/tools/tests/domid/.gitignore > @@ -0,0 +1,3 @@ > +*.o "*.o" is already in the .gitignore at the root of the project. I don't think it's useful here. > +generated > +test-domid > diff --git a/tools/tests/domid/Makefile b/tools/tests/domid/Makefile > new file mode 100644 > index 000000000000..0a124a8bfc76 > --- /dev/null > +++ b/tools/tests/domid/Makefile > @@ -0,0 +1,84 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +# > +# Unit tests for domain ID allocator. > +# > +# Copyright 2025 Ford Motor Company > + > +XEN_ROOT=$(CURDIR)/../../.. > +include $(XEN_ROOT)/tools/Rules.mk > + > +TESTS := test-domid > + > +strip-list = $(sort $(strip $(foreach x,$(1),$(strip $(x))))) What's that macro for? Also, what's a "list"? > +define list-c-headers > +$(shell sed -n -r \ Could you use "-E" instead of "-r"? (-r might not work on FreeBSD) > + 's/^[ \t]*# *include[ \t]*[<"]([^">]+)[">].*/\1/p' $(1) 2>/dev/null) > +endef > + > +define emit-harness-nested-rule > +$(1): $(CURDIR)/harness.h > + mkdir -p $$(dir $$@) You can use $(@D) instead of $(dir $@). The only difference is a / not present at the end. > + ln -sf $$^ $$@ This should use $<, I don't think the command is going to work if there's multiple prerequisite. > +endef > + > +define emit-harness-rules > +ifneq ($(strip $(3)),) How many time do you need to call $(strip) ? Also, I think I would prefer to have $(if $(strip $(3)), [the rest]) rather than actually evaluating code and generating code that we already know is isn't going to be executed. > +$(foreach h,$(3),$(call emit-harness-nested-rule,$(CURDIR)/generated/$(h))) > +vpath $(1) $(2) > +$(1:.c=.o): $(addprefix $(CURDIR)/generated/,$(3)) > +endif > +endef This macro fails if there's more than one "#include" in "domid.c". And if there's no "#include" in "domid.c", then Make doesn't know how to make "domid.o" for "test-domid". > + > +define vpath-with-harness-deps > +$(call emit-harness-rules,$(1),$(2),\ > + $(call strip-list,$(call list-c-headers,$(2)$(1)))) > +endef > + > +.PHONY: all > +all: $(TESTS) > + > +.PHONY: run > +run: $(TESTS) > + $(foreach t,$(TESTS),./$(t);) This recipe doesn't work as expected. You need `set -e` or only the last tests count. > + > +.PHONY: clean > +clean: > + $(RM) -rf $(CURDIR)/generated $(RM) already contain the '-f' option, no need to add it a second time. Also, we expected Make to run all commands in recipe from $(CURDIR), so adding $(CURDIR) is unnecessary, could potentially be an issue. > + $(RM) -- *.o $(TESTS) $(DEPS_RM) > + > +.PHONY: distclean > +distclean: clean > + $(RM) -- *~ > + > +.PHONY: install > +install: all > + $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests > + $(INSTALL_PROG) test-domid $(DESTDIR)$(LIBEXEC)/tests > + > +.PHONY: uninstall > +uninstall: > + $(RM) -- $(DESTDIR)$(LIBEXEC)/tests/test-domid > + > +CFLAGS += -D__XEN_TOOLS__ > +# find-next-bit.c > +CFLAGS += '-DEXPORT_SYMBOL(x)=' \ > + -Dfind_first_bit \ > + -Dfind_first_zero_bit \ > + -Dfind_next_bit \ > + -Dfind_next_bit_le \ > + -Dfind_next_zero_bit_le > +CFLAGS += $(APPEND_CFLAGS) > +CFLAGS += $(CFLAGS_xeninclude) > +CFLAGS += -I./generated/ > + > +LDFLAGS += $(APPEND_LDFLAGS) > + > +vpath find-next-bit.c $(XEN_ROOT)/xen/lib/ > +# Ubuntu {16,18}.04 need single eval at the call site. I'd rather see a comment about what's the macro is about rather that a comment some Linux distribution. Our target is GNU Make 3.80, without regards to a particular distribution. (Also I don't think it's useful to point out that `eval` is needed for older version of Make, at least in our project.) > +$(eval $(call vpath-with-harness-deps,domid.c,$(XEN_ROOT)/xen/common/)) > + > +test-domid: domid.o find-next-bit.o test-domid.o > + $(CC) $^ -o $@ $(LDFLAGS) > + > +-include $(DEPS_INCLUDE) > diff --git a/tools/tests/domid/test-domid.c b/tools/tests/domid/test-domid.c > new file mode 100644 > index 000000000000..51a88a6a9550 > --- /dev/null > +++ b/tools/tests/domid/test-domid.c > @@ -0,0 +1,93 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Unit tests for domain ID allocator. > + * > + * Copyright 2025 Ford Motor Company > + */ > + > +#include "harness.h" > + > +#define verify(exp, fmt, args...) do { \ > + if ( !(exp) ) \ > + printf(fmt, ## args); \ > + assert(exp); \ Relying on assert() for the test isn't wise. It's useful for developing and debugging because it calls abort(), but they can easily be get rid of, by simply building with -DNDEBUG. Could you maybe replace it with exit() since you already check the condition? Thanks, -- Anthony PERARD
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |