diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..a95243c --- /dev/null +++ b/test/Makefile @@ -0,0 +1,197 @@ +############################################################################## +# Build global options +# NOTE: Can be overridden externally. +# + +PROJECT_DIR = . + +FIRMWARE_DIR = ./../firmware + +# Imported source files and paths +RUSEFI_LIB = $(FIRMWARE_DIR)/libfirmware +include $(RUSEFI_LIB)/util/util.mk + +# C sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CSRC += \ + $(RUSEFI_LIB_C) \ + +# C++ sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CPPSRC += \ + $(RUSEFI_LIB_CPP) \ + $(RUSEFI_LIB_CPP_TEST) \ + gtest-all.cpp \ + gmock-all.cpp \ + gtest_main.cpp \ + +INCDIR += \ + $(PROJECT_DIR)/googletest/googlemock/ \ + $(PROJECT_DIR)/googletest/googlemock/include \ + $(PROJECT_DIR)/googletest/googletest \ + $(PROJECT_DIR)/googletest/googletest/include \ + $(RUSEFI_LIB_INC) \ + $(FIRMWARE_DIR) \ + +# User may want to pass in a forced value for SANITIZE +ifeq ($(SANITIZE),) + ifneq ($(OS),Windows_NT) + SANITIZE = yes + else + SANITIZE = no + endif +endif + +IS_MAC = no +ifneq ($(OS),Windows_NT) + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Darwin) + IS_MAC = yes + endif +endif + +# Compiler options here. +ifeq ($(USE_OPT),) +# -O2 is needed for mingw, without it there is a linking issue to isnanf?!?! + #USE_OPT = $(RFLAGS) -O2 -fgnu89-inline -ggdb -fomit-frame-pointer -falign-functions=16 -std=gnu99 -Werror-implicit-function-declaration -Werror -Wno-error=pointer-sign -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=sign-compare -Wno-error=unused-parameter -Wno-error=missing-field-initializers + USE_OPT = -c -Wall -O0 -ggdb -g + USE_OPT += -Werror=missing-field-initializers +endif + +# C specific options here (added to USE_OPT). +ifeq ($(USE_COPT),) + USE_COPT = -std=gnu99 -fgnu89-inline +endif + +# C++ specific options here (added to USE_OPT). +ifeq ($(USE_CPPOPT),) + USE_CPPOPT = -std=gnu++2a -fno-rtti -fno-use-cxa-atexit +endif + +# Enable address sanitizer for C++ files, but not on Windows since x86_64-w64-mingw32-g++ doesn't support it. +# only c++ because lua does some things asan doesn't like, but don't actually cause overruns. +ifeq ($(SANITIZE),yes) + ifeq ($(IS_MAC),yes) + USE_CPPOPT += -fsanitize=address + else + USE_CPPOPT += -fsanitize=address -fsanitize=bounds-strict -fno-sanitize-recover=all + endif +endif + +# Enable this if you want the linker to remove unused code and data +ifeq ($(USE_LINK_GC),) + USE_LINK_GC = yes +endif + +# Enable this if you want to see the full log while compiling. +ifeq ($(USE_VERBOSE_COMPILE),) + USE_VERBOSE_COMPILE = no +endif + +# C sources to be compiled in ARM mode regardless of the global setting. +ACSRC = + +# C++ sources to be compiled in ARM mode regardless of the global setting. +ACPPSRC = + +# List ASM source files here +ASMSRC = + +############################################################################## +# Compiler settings +# + +# It looks like cygwin build of mingwg-w64 has issues with gcov runtime :( +# mingw-w64 is a project which forked from mingw in 2007 - be careful not to confuse these two. +# In order to have coverage generated please download from https://mingw-w64.org/doku.php/download/mingw-builds +# Install using mingw-w64-install.exe instead of similar thing packaged with cygwin +# Both 32 bit and 64 bit versions of mingw-w64 are generating coverage data. + +ifeq ($(OS),Windows_NT) +ifeq ($(USE_MINGW32_I686),) +#this one is 64 bit + TRGT = x86_64-w64-mingw32- +else +#this one was 32 bit + TRGT = i686-w64-mingw32- +endif +else + TRGT = +endif + +CC = $(TRGT)gcc +CPPC = $(TRGT)g++ +LD = $(TRGT)g++ +CP = $(TRGT)objcopy +AS = $(TRGT)gcc -x assembler-with-cpp +OD = $(TRGT)objdump +HEX = $(CP) -O ihex +BIN = $(CP) -O binary + +# Define C warning options here +CWARN = -Wall -Wextra -Wstrict-prototypes -pedantic -Wmissing-prototypes -Wold-style-definition + +# Define C++ warning options here +CPPWARN = -Wall -Wextra -Werror -pedantic -Wno-error=sign-compare + +# +# Compiler settings +############################################################################## + +############################################################################## +# Start of default section +# + +# List all default ASM defines here, like -D_DEBUG=1 +DADEFS = + +# List all default directories to look for include files here +DINCDIR = + +# List the default directory to look for the libraries here +DLIBDIR = + +# List all default libraries here +ifeq ($(OS),Windows_NT) + # Windows + DLIBS = -static-libgcc -static -static-libstdc++ +else + # Linux + DLIBS = -pthread +endif + +# +# End of default section +############################################################################## + +############################################################################## +# Start of user section +# + +# List all user C define here, like -D_DEBUG=1 +UDEFS = + +# Define ASM defines here +UADEFS = + +# List all user directories here +UINCDIR = + +# List the user directory to look for the libraries here +ULIBDIR = + +# List all user libraries here +ULIBS = -lm + +ifeq ($(SANITIZE),yes) + ULIBS += -fsanitize=address -fsanitize=undefined +endif + +# +# End of user defines +############################################################################## + +# Define project name here +PROJECT = wideband_test + +include rules.mk diff --git a/test/gmock-all.cpp b/test/gmock-all.cpp new file mode 100644 index 0000000..0bf8d4a --- /dev/null +++ b/test/gmock-all.cpp @@ -0,0 +1,13 @@ +// this is a work-around since our Makefile does not recognice .cc format +// todo: adjust the makefile so that we can remove this + +// This line ensures that gmock.h can be compiled on its own, even +// when it's fused. +#include "gmock/gmock.h" + +// The following lines pull in the real gmock *.cc files. +#include "src/gmock-cardinalities.cc" +#include "src/gmock-internal-utils.cc" +#include "src/gmock-matchers.cc" +#include "src/gmock-spec-builders.cc" +#include "src/gmock.cc" diff --git a/test/gtest-all.cpp b/test/gtest-all.cpp new file mode 100644 index 0000000..df1a60d --- /dev/null +++ b/test/gtest-all.cpp @@ -0,0 +1,17 @@ +// this is a work-around since our Makefile does not recognice .cc format +// todo: adjust the makefile so that we can remove this + +// This line ensures that gtest.h can be compiled on its own, even +// when it's fused. +#include "gtest/gtest.h" + +// The following lines pull in the real gtest *.cc files. +#include "src/gtest-assertion-result.cc" +#include "src/gtest-death-test.cc" +#include "src/gtest-filepath.cc" +#include "src/gtest-matchers.cc" +#include "src/gtest-port.cc" +#include "src/gtest-printers.cc" +#include "src/gtest-test-part.cc" +#include "src/gtest-typed-test.cc" +#include "src/gtest.cc" diff --git a/test/gtest_main.cpp b/test/gtest_main.cpp new file mode 100644 index 0000000..c2e3b3c --- /dev/null +++ b/test/gtest_main.cpp @@ -0,0 +1,65 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include "gtest/gtest.h" + +#if defined(GTEST_OS_ESP8266) || defined(GTEST_OS_ESP32) +// Arduino-like platforms: program entry points are setup/loop instead of main. + +#ifdef GTEST_OS_ESP8266 +extern "C" { +#endif + +void setup() { testing::InitGoogleTest(); } + +void loop() { RUN_ALL_TESTS(); } + +#ifdef GTEST_OS_ESP8266 +} +#endif + +#elif defined(GTEST_OS_QURT) +// QuRT: program entry point is main, but argc/argv are unusable. + +GTEST_API_ int main() { + printf("Running main() from %s\n", __FILE__); + testing::InitGoogleTest(); + return RUN_ALL_TESTS(); +} +#else +// Normal platforms: program entry point is main, argc/argv are initialized. + +GTEST_API_ int main(int argc, char **argv) { + printf("Running main() from %s\n", __FILE__); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +#endif diff --git a/test/rules.mk b/test/rules.mk new file mode 100644 index 0000000..050989f --- /dev/null +++ b/test/rules.mk @@ -0,0 +1,155 @@ +# ARM Cortex-Mx common makefile scripts and rules. + +ifeq ($(BUILDDIR),) + # Define if not specified + BUILDDIR = build +endif +ifeq ($(BUILDDIR),.) + # Redefine if pointing at current folder + BUILDDIR = build +endif +BINARY_OUTPUT = $(BUILDDIR)/$(PROJECT) + +# Automatic compiler options +OPT = $(USE_OPT) +COPT = $(USE_COPT) +CPPOPT = $(USE_CPPOPT) +ifeq ($(USE_LINK_GC),yes) + OPT += -ffunction-sections -fdata-sections -fno-common +endif + +ACSRC += $(CSRC) +ACPPSRC += $(CPPSRC) + +ASRC = $(ACSRC)$(ACPPSRC) +SRCPATHS = $(sort $(dir $(ASMXSRC)) $(dir $(ASMSRC)) $(dir $(ASRC))) + +# Various directories +OBJDIR = $(BUILDDIR)/obj +LSTDIR = $(BUILDDIR)/lst + +# Object files groups +ACOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ACSRC:.c=.o))) +ACPPOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ACPPSRC:.cpp=.o))) +ASMOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ASMSRC:.s=.o))) +ASMXOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ASMXSRC:.S=.o))) +OBJS = $(ASMXOBJS) $(ASMOBJS) $(ACOBJS) $(ACPPOBJS) + +# Paths +IINCDIR = $(patsubst %,-I%,$(INCDIR) $(DINCDIR) $(UINCDIR)) +LLIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) + +# Macros +DEFS = $(DDEFS) $(UDEFS) +ADEFS = $(DADEFS) $(UADEFS) + +# Libs +LIBS = $(DLIBS) $(ULIBS) + +# Various settings +ifeq ($(IS_MAC),yes) + ODFLAGS = -x --syms + ASFLAGS = $(MCFLAGS) -Wa $(ADEFS) + ASXFLAGS = $(MCFLAGS) -Wa $(ADEFS) + CFLAGS = $(MCFLAGS) $(OPT) $(COPT) $(CWARN) $(DEFS) + CPPFLAGS = $(MCFLAGS) $(OPT) $(CPPOPT) $(CPPWARN) $(DEFS) + LDFLAGS = $(MCFLAGS) $(LLIBDIR) +else + # not mac + ODFLAGS = -x --syms + ASFLAGS = $(MCFLAGS) $(ADEFS) + ASXFLAGS = $(MCFLAGS) $(ADEFS) + CFLAGS = $(MCFLAGS) $(OPT) $(COPT) $(CWARN) $(DEFS) + CPPFLAGS = $(MCFLAGS) $(OPT) $(CPPOPT) $(CPPWARN) $(DEFS) + ifeq ($(USE_LINK_GC),yes) + LDFLAGS = $(MCFLAGS) -Wl,-Map=$(BINARY_OUTPUT).map,--cref,--no-warn-mismatch,--gc-sections $(LLIBDIR) + else + LDFLAGS = $(MCFLAGS) -Wl,-Map=$(BINARY_OUTPUT).map,--cref,--no-warn-mismatch $(LLIBDIR) + endif +endif + +# Generate dependency information +CFLAGS += -MD -MP -MF .dep/$(@F).d +CPPFLAGS += -MD -MP -MF .dep/$(@F).d + +# Paths where to search for sources +VPATH = $(SRCPATHS) + +# +# Makefile rules +# + +all: $(OBJS) $(BINARY_OUTPUT) MAKE_ALL_RULE_HOOK + +MAKE_ALL_RULE_HOOK: + +$(OBJS): | $(BUILDDIR) + +$(BUILDDIR) $(OBJDIR) $(LSTDIR): +ifneq ($(USE_VERBOSE_COMPILE),yes) + @echo Compiler Options + @echo $(CPPC) -c $(CPPFLAGS) -I. $(IINCDIR) main.cpp -o main.o + @echo +endif + mkdir -p $(OBJDIR) + mkdir -p $(LSTDIR) + +$(ACPPOBJS) : $(OBJDIR)/%.o : %.cpp Makefile +ifeq ($(USE_VERBOSE_COMPILE),yes) + @echo + $(CPPC) -c $(CPPFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ +else + @echo Compiling $(/dev/null) $(wildcard .dep/*) + +# *** EOF ***