From fcc3d7132d39ab9e03a927b72c55ebdfbfcd270d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miodrag=20Milanovi=C4=87?= Date: Tue, 23 Sep 2025 17:10:18 +0200 Subject: [PATCH] Fix building and running unit tests (#5374) * Fix building and running unit tests * Enable unit tests * Add gtest always * test-sanitizers.yml: Use makefile.conf * proper test setup * make it run on macOS * Run libyosys build only for unit tests after testing is done * Disable LTO on public CI --------- Co-authored-by: Krystine Sherwin <93062060+KrystalDelusion@users.noreply.github.com> --- .github/actions/setup-build-env/action.yml | 2 +- .github/workflows/prepare-docs.yml | 2 +- .github/workflows/test-build.yml | 2 +- .github/workflows/test-sanitizers.yml | 9 +++-- .github/workflows/test-verific.yml | 5 +++ Brewfile | 1 + tests/unit/Makefile | 42 +++++++++++++++++----- tests/unit/kernel/rtlilTest.cc | 3 ++ 8 files changed, 53 insertions(+), 13 deletions(-) diff --git a/.github/actions/setup-build-env/action.yml b/.github/actions/setup-build-env/action.yml index 1c2386b06..e4bc8ec58 100644 --- a/.github/actions/setup-build-env/action.yml +++ b/.github/actions/setup-build-env/action.yml @@ -8,7 +8,7 @@ runs: shell: bash run: | sudo apt-get update - sudo apt-get install gperf build-essential bison flex libfl-dev libreadline-dev gawk tcl-dev libffi-dev git graphviz xdot pkg-config python3 libboost-system-dev libboost-python-dev libboost-filesystem-dev zlib1g-dev libbz2-dev + sudo apt-get install gperf build-essential bison flex libfl-dev libreadline-dev gawk tcl-dev libffi-dev git graphviz xdot pkg-config python3 libboost-system-dev libboost-python-dev libboost-filesystem-dev zlib1g-dev libbz2-dev libgtest-dev - name: Install macOS Dependencies if: runner.os == 'macOS' diff --git a/.github/workflows/prepare-docs.yml b/.github/workflows/prepare-docs.yml index 17d37d08c..f19b1c7af 100644 --- a/.github/workflows/prepare-docs.yml +++ b/.github/workflows/prepare-docs.yml @@ -48,7 +48,7 @@ jobs: echo "ENABLE_VERIFIC_YOSYSHQ_EXTENSIONS := 1" >> Makefile.conf echo "ENABLE_CCACHE := 1" >> Makefile.conf echo "ENABLE_HELP_SOURCE := 1" >> Makefile.conf - make -j$procs ENABLE_LTO=1 + make -j$procs - name: Prepare docs shell: bash diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index d7f2073fe..2d4a7a6c8 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -67,7 +67,7 @@ jobs: mkdir build cd build make -f ../Makefile config-$CC - make -f ../Makefile -j$procs ENABLE_LTO=1 + make -f ../Makefile -j$procs - name: Log yosys-config output run: | diff --git a/.github/workflows/test-sanitizers.yml b/.github/workflows/test-sanitizers.yml index 2ffd2db15..9c0f6d746 100644 --- a/.github/workflows/test-sanitizers.yml +++ b/.github/workflows/test-sanitizers.yml @@ -97,7 +97,7 @@ jobs: run: | make config-$CC echo 'SANITIZER = ${{ matrix.sanitizer }}' >> Makefile.conf - make -j$procs ENABLE_LTO=1 + make -j$procs - name: Log yosys-config output run: | @@ -106,10 +106,15 @@ jobs: - name: Run tests shell: bash run: | - make -j$procs test TARGETS= EXTRA_TARGETS= CONFIG=$CC + make -j$procs test TARGETS= EXTRA_TARGETS= - name: Report errors if: ${{ failure() }} shell: bash run: | find tests/**/*.err -print -exec cat {} \; + + - name: Run unit tests + shell: bash + run: | + make -j$procs unit-test ENABLE_LIBYOSYS=1 diff --git a/.github/workflows/test-verific.yml b/.github/workflows/test-verific.yml index c2e4228c4..503d6c31b 100644 --- a/.github/workflows/test-verific.yml +++ b/.github/workflows/test-verific.yml @@ -78,3 +78,8 @@ jobs: if: ${{ github.ref == 'refs/heads/main' }} run: | make -C sby run_ci + + - name: Run unit tests + shell: bash + run: | + make -j$procs unit-test ENABLE_LTO=1 ENABLE_LIBYOSYS=1 diff --git a/Brewfile b/Brewfile index 7ed3fb906..c90434e62 100644 --- a/Brewfile +++ b/Brewfile @@ -11,3 +11,4 @@ brew "bash" brew "boost-python3" brew "llvm@20" brew "lld" +brew "googletest" diff --git a/tests/unit/Makefile b/tests/unit/Makefile index 48635eb0d..eee60ef9f 100644 --- a/tests/unit/Makefile +++ b/tests/unit/Makefile @@ -1,11 +1,27 @@ -GTESTFLAG := -lgtest -lgtest_main -RPATH := -Wl,-rpath -EXTRAFLAGS := -lyosys -pthreads +UNAME_S := $(shell uname -s) + +# GoogleTest flags +GTEST_PREFIX := $(shell brew --prefix googletest 2>/dev/null) +ifeq ($(GTEST_PREFIX),) + GTEST_CXXFLAGS := + GTEST_LDFLAGS := -lgtest -lgtest_main +else + GTEST_CXXFLAGS := -I$(GTEST_PREFIX)/include + GTEST_LDFLAGS := -L$(GTEST_PREFIX)/lib -lgtest -lgtest_main +endif + +ifeq ($(UNAME_S),Darwin) + RPATH = -Wl,-rpath,$(ROOTPATH) +else + RPATH = -Wl,-rpath=$(ROOTPATH) +endif + +EXTRAFLAGS := -lyosys -pthread OBJTEST := objtest BINTEST := bintest -ALLTESTFILE := $(shell find -name '*Test.cc' -printf '%P ') +ALLTESTFILE := $(shell find . -name '*Test.cc' | sed 's|^\./||' | tr '\n' ' ') TESTDIRS := $(sort $(dir $(ALLTESTFILE))) TESTS := $(addprefix $(BINTEST)/, $(basename $(ALLTESTFILE:%Test.cc=%Test.o))) @@ -15,16 +31,26 @@ TESTS := $(addprefix $(BINTEST)/, $(basename $(ALLTESTFILE:%Test.cc=%Test.o))) all: prepare $(TESTS) run-tests $(BINTEST)/%: $(OBJTEST)/%.o - $(CXX) -L$(ROOTPATH) $(RPATH)=$(ROOTPATH) $(LINKFLAGS) -o $@ $^ $(LIBS) \ - $(GTESTFLAG) $(EXTRAFLAGS) + $(CXX) -L$(ROOTPATH) $(RPATH) $(LINKFLAGS) -o $@ $^ $(LIBS) \ + $(GTEST_LDFLAGS) $(EXTRAFLAGS) $(OBJTEST)/%.o: $(basename $(subst $(OBJTEST),.,%)).cc - $(CXX) -o $@ -c -I$(ROOTPATH) $(CPPFLAGS) $(CXXFLAGS) $^ + $(CXX) -o $@ -c -I$(ROOTPATH) $(CPPFLAGS) $(CXXFLAGS) $(GTEST_CXXFLAGS) $^ .PHONY: prepare run-tests clean run-tests: $(TESTS) - $(subst Test ,Test&& ,$^) +ifeq ($(UNAME_S),Darwin) + @for t in $^; do \ + echo "Running $$t"; \ + DYLD_LIBRARY_PATH=$(ROOTPATH) $$t || exit 1; \ + done +else + @for t in $^; do \ + echo "Running $$t"; \ + $$t || exit 1; \ + done +endif prepare: mkdir -p $(addprefix $(BINTEST)/,$(TESTDIRS)) diff --git a/tests/unit/kernel/rtlilTest.cc b/tests/unit/kernel/rtlilTest.cc index 97cc936de..557355ed9 100644 --- a/tests/unit/kernel/rtlilTest.cc +++ b/tests/unit/kernel/rtlilTest.cc @@ -20,6 +20,9 @@ namespace RTLIL { KernelRtlilTest() { if (log_files.empty()) log_files.emplace_back(stdout); } + virtual void SetUp() override { + IdString::ensure_prepopulated(); + } }; TEST_F(KernelRtlilTest, ConstAssignCompare)