From 29ec0a5859922031f1697895687b3f9355715f7a Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Sat, 30 Oct 2021 17:31:09 -0700 Subject: [PATCH] better pch usage and gmock constructors (#3426) * break out mock constructors * comment and spacing * unnecessary compiler options * happy stepper Co-authored-by: Matthew Kennedy --- firmware/hw_layer/stepper.cpp | 6 +++- firmware/hw_layer/stepper.h | 4 +-- firmware/hw_layer/stepper_dual_hbridge.cpp | 2 +- firmware/pch/pch.h | 1 + unit_tests/Makefile | 1 + unit_tests/mocks.cpp | 34 +++++++++++++++++++ unit_tests/mocks.h | 27 ++++++++++++++- .../test_injector_model.cpp | 1 - unit_tests/tests/lua/test_lua_basic.cpp | 1 - unit_tests/tests/sensor/basic_sensor.cpp | 1 - unit_tests/tests/sensor/func_chain.cpp | 4 +-- .../tests/sensor/function_pointer_sensor.cpp | 4 +-- unit_tests/tests/sensor/mock/mock_sensor.h | 1 - unit_tests/tests/sensor/mock_sensor.cpp | 2 -- unit_tests/tests/sensor/redundant.cpp | 6 ++-- unit_tests/tests/sensor/sensor_reader.cpp | 6 ++-- unit_tests/tests/test_deadband.cpp | 2 +- .../tests/util/test_buffered_writer.cpp | 4 +-- .../tests/util/test_error_accumulator.cpp | 3 +- unit_tests/unit_test_rules.mk | 2 +- 20 files changed, 84 insertions(+), 28 deletions(-) create mode 100644 unit_tests/mocks.cpp diff --git a/firmware/hw_layer/stepper.cpp b/firmware/hw_layer/stepper.cpp index ae470ac414..96a56d2745 100644 --- a/firmware/hw_layer/stepper.cpp +++ b/firmware/hw_layer/stepper.cpp @@ -188,7 +188,7 @@ bool StepDirectionStepper::pulse() { return true; } -void StepperHw::sleep(void) { +void StepperHw::sleep() { pause(); } @@ -236,3 +236,7 @@ void StepDirectionStepper::initialize(brain_pin_e stepPin, brain_pin_e direction } #endif + +#if EFI_UNIT_TEST +void StepperHw::sleep() { } +#endif // EFI_UNIT_TEST diff --git a/firmware/hw_layer/stepper.h b/firmware/hw_layer/stepper.h index 419e0ef1ec..43e5d70892 100644 --- a/firmware/hw_layer/stepper.h +++ b/firmware/hw_layer/stepper.h @@ -18,7 +18,7 @@ public: // pause between steps void pause(int divisor = 1) const; // pause and enter the idle mode (less current consumption) - virtual void sleep(void); + virtual void sleep(); protected: void setReactionTime(float ms); @@ -51,7 +51,7 @@ public: bool step(bool positive) override; - void sleep(void) override; + void sleep() override; protected: bool update(float dutyMult); diff --git a/firmware/hw_layer/stepper_dual_hbridge.cpp b/firmware/hw_layer/stepper_dual_hbridge.cpp index 70aafe935d..df9140ca2b 100644 --- a/firmware/hw_layer/stepper_dual_hbridge.cpp +++ b/firmware/hw_layer/stepper_dual_hbridge.cpp @@ -101,7 +101,7 @@ bool DualHBridgeStepper::update(float dutyMult) { return true; } -void DualHBridgeStepper::sleep(void) { +void DualHBridgeStepper::sleep() { float sleepingCoef = minI(CONFIG(stepperMinDutyCycle), CONFIG(stepperMaxDutyCycle)) * phaseDutyCycleDivisor; update(sleepingCoef); pause(); diff --git a/firmware/pch/pch.h b/firmware/pch/pch.h index 300ad92cf7..7581e97a08 100644 --- a/firmware/pch/pch.h +++ b/firmware/pch/pch.h @@ -35,4 +35,5 @@ #include #include "mocks.h" #include "engine_test_helper.h" +#include "mock/mock_sensor.h" #endif diff --git a/unit_tests/Makefile b/unit_tests/Makefile index c15df99175..0990cd0772 100644 --- a/unit_tests/Makefile +++ b/unit_tests/Makefile @@ -61,6 +61,7 @@ CPPSRC += $(ALLCPPSRC) \ $(PROJECT_DIR)/../unit_tests/global_mocks.cpp \ $(PROJECT_DIR)/console/binary/tooth_logger.cpp \ $(PROJECT_DIR)/console/binary_log/log_field.cpp \ + $(PROJECT_DIR)/../unit_tests/mocks.cpp \ INCDIR += \ $(PCH_DIR) \ diff --git a/unit_tests/mocks.cpp b/unit_tests/mocks.cpp new file mode 100644 index 0000000000..98e56d99ea --- /dev/null +++ b/unit_tests/mocks.cpp @@ -0,0 +1,34 @@ +#include "pch.h" + +// Constructors/destructors for all mocks live here. If they only exist +// in the header (ie, implicitely defined), then that code has to be generated +// in every cpp file, instead of generating them only once, which we do here. + +// See https://github.com/google/googletest/blob/master/docs/gmock_cook_book.md#making-the-compilation-faster + +MockEtb::MockEtb() { } +MockEtb::~MockEtb() { } + +MockMotor::MockMotor() { } +MockMotor::~MockMotor() { } + +MockVp3d::MockVp3d() { } +MockVp3d::~MockVp3d() { } + +MockPwm::MockPwm() { } +MockPwm::~MockPwm() { } + +MockOutputPin::MockOutputPin() { } +MockOutputPin::~MockOutputPin() { } + +MockExecutor::MockExecutor() { } +MockExecutor::~MockExecutor() { } + +MockAirmass::MockAirmass() : AirmassVeModelBase(veTable) { } +MockAirmass::~MockAirmass() { } + +MockInjectorModel2::MockInjectorModel2() { } +MockInjectorModel2::~MockInjectorModel2() { } + +MockStepperHardware::MockStepperHardware() { } +MockStepperHardware::~MockStepperHardware() { } diff --git a/unit_tests/mocks.h b/unit_tests/mocks.h index 39bb21596e..db399b93e8 100644 --- a/unit_tests/mocks.h +++ b/unit_tests/mocks.h @@ -12,6 +12,9 @@ class MockEtb : public IEtbController { public: + MockEtb(); + virtual ~MockEtb(); + // IEtbController mocks MOCK_METHOD(void, reset, (), (override)); MOCK_METHOD(void, update, (), (override)); @@ -31,6 +34,9 @@ public: class MockMotor : public DcMotor { public: + MockMotor(); + virtual ~MockMotor(); + MOCK_METHOD(bool, set, (float duty), (override)); MOCK_METHOD(float, get, (), (const, override)); MOCK_METHOD(void, enable, (), (override)); @@ -40,21 +46,33 @@ public: class MockVp3d : public ValueProvider3D { public: + MockVp3d(); + virtual ~MockVp3d(); + MOCK_METHOD(float, getValue, (float xColumn, float yRow), (const, override)); }; class MockPwm : public IPwm { public: + MockPwm(); + virtual ~MockPwm(); + MOCK_METHOD(void, setSimplePwmDutyCycle, (float dutyCycle), (override)); }; class MockOutputPin : public OutputPin { public: + MockOutputPin(); + virtual ~MockOutputPin(); + MOCK_METHOD(void, setValue, (int value), (override)); }; class MockExecutor : public TestExecutor { public: + MockExecutor(); + virtual ~MockExecutor(); + MOCK_METHOD(void, scheduleByTimestamp, (const char *msg, scheduling_s *scheduling, efitimeus_t timeUs, action_s action), (override)); MOCK_METHOD(void, scheduleByTimestampNt, (const char *msg, scheduling_s *scheduling, efitime_t timeUs, action_s action), (override)); MOCK_METHOD(void, scheduleForLater, (scheduling_s *scheduling, int delayUs, action_s action), (override)); @@ -63,7 +81,8 @@ public: class MockAirmass : public AirmassVeModelBase { public: - MockAirmass() : AirmassVeModelBase(veTable) {} + MockAirmass(); + virtual ~MockAirmass(); MockVp3d veTable; @@ -72,6 +91,9 @@ public: class MockInjectorModel2 : public IInjectorModel { public: + MockInjectorModel2(); + virtual ~MockInjectorModel2(); + MOCK_METHOD(void, prepare, (), (override)); MOCK_METHOD(floatms_t, getInjectionDuration, (float fuelMassGram), (const, override)); MOCK_METHOD(float, getFuelMassForDuration, (floatms_t duration), (const, override)); @@ -79,5 +101,8 @@ public: class MockStepperHardware : public StepperHw { public: + MockStepperHardware(); + virtual ~MockStepperHardware(); + MOCK_METHOD(bool, step, (bool positive), (override)); }; diff --git a/unit_tests/tests/ignition_injection/test_injector_model.cpp b/unit_tests/tests/ignition_injection/test_injector_model.cpp index 2f91c45ff4..350d2d4f39 100644 --- a/unit_tests/tests/ignition_injection/test_injector_model.cpp +++ b/unit_tests/tests/ignition_injection/test_injector_model.cpp @@ -1,6 +1,5 @@ #include "pch.h" #include "injector_model.h" -#include "mock/mock_sensor.h" using ::testing::_; using ::testing::StrictMock; diff --git a/unit_tests/tests/lua/test_lua_basic.cpp b/unit_tests/tests/lua/test_lua_basic.cpp index 70caca268a..b4d012034d 100644 --- a/unit_tests/tests/lua/test_lua_basic.cpp +++ b/unit_tests/tests/lua/test_lua_basic.cpp @@ -1,6 +1,5 @@ #include "pch.h" #include "rusefi_lua.h" -#include TEST(LuaBasic, ReturnsNumber) { auto script = R"( diff --git a/unit_tests/tests/sensor/basic_sensor.cpp b/unit_tests/tests/sensor/basic_sensor.cpp index 3d09021d00..7f9d6a8e37 100644 --- a/unit_tests/tests/sensor/basic_sensor.cpp +++ b/unit_tests/tests/sensor/basic_sensor.cpp @@ -1,6 +1,5 @@ #include "pch.h" -#include "mock/mock_sensor.h" #include "stored_value_sensor.h" class SensorBasic : public ::testing::Test { diff --git a/unit_tests/tests/sensor/func_chain.cpp b/unit_tests/tests/sensor/func_chain.cpp index 875df1579d..f9f8f65668 100644 --- a/unit_tests/tests/sensor/func_chain.cpp +++ b/unit_tests/tests/sensor/func_chain.cpp @@ -1,6 +1,6 @@ -#include "func_chain.h" +#include "pch.h" -#include +#include "func_chain.h" struct AddOne final : public SensorConverter { SensorResult convert(float input) const { diff --git a/unit_tests/tests/sensor/function_pointer_sensor.cpp b/unit_tests/tests/sensor/function_pointer_sensor.cpp index 0d01c00510..ff922c5228 100644 --- a/unit_tests/tests/sensor/function_pointer_sensor.cpp +++ b/unit_tests/tests/sensor/function_pointer_sensor.cpp @@ -1,6 +1,6 @@ -#include "function_pointer_sensor.h" +#include "pch.h" -#include +#include "function_pointer_sensor.h" class SensorFunctionPointer : public ::testing::Test { protected: diff --git a/unit_tests/tests/sensor/mock/mock_sensor.h b/unit_tests/tests/sensor/mock/mock_sensor.h index 154ad65a36..07508a17e0 100644 --- a/unit_tests/tests/sensor/mock/mock_sensor.h +++ b/unit_tests/tests/sensor/mock/mock_sensor.h @@ -1,7 +1,6 @@ #pragma once #include "stored_value_sensor.h" -#include "global.h" struct MockSensor final : public StoredValueSensor { diff --git a/unit_tests/tests/sensor/mock_sensor.cpp b/unit_tests/tests/sensor/mock_sensor.cpp index 9831f09d67..3834b4a031 100644 --- a/unit_tests/tests/sensor/mock_sensor.cpp +++ b/unit_tests/tests/sensor/mock_sensor.cpp @@ -1,7 +1,5 @@ #include "pch.h" -#include "mock/mock_sensor.h" - class SensorMocking : public ::testing::Test { protected: MockSensor realSensor; diff --git a/unit_tests/tests/sensor/redundant.cpp b/unit_tests/tests/sensor/redundant.cpp index 11c84f5be4..60259fe099 100644 --- a/unit_tests/tests/sensor/redundant.cpp +++ b/unit_tests/tests/sensor/redundant.cpp @@ -1,10 +1,8 @@ +#include "pch.h" + #include "redundant_sensor.h" #include "redundant_ford_tps.h" -#include - -#include "mock/mock_sensor.h" - class SensorRedundant : public ::testing::Test { protected: diff --git a/unit_tests/tests/sensor/sensor_reader.cpp b/unit_tests/tests/sensor/sensor_reader.cpp index 454504a863..0161435e28 100644 --- a/unit_tests/tests/sensor/sensor_reader.cpp +++ b/unit_tests/tests/sensor/sensor_reader.cpp @@ -1,9 +1,7 @@ +#include "pch.h" + #include "sensor_reader.h" -#include "mock/mock_sensor.h" - -#include - class SensorBasicReader : public ::testing::Test { protected: void SetUp() override { diff --git a/unit_tests/tests/test_deadband.cpp b/unit_tests/tests/test_deadband.cpp index 37dfe2fce3..c6303b986c 100644 --- a/unit_tests/tests/test_deadband.cpp +++ b/unit_tests/tests/test_deadband.cpp @@ -1,5 +1,5 @@ +#include "pch.h" -#include #include "deadband.h" TEST(Deadband, OutsideDeadband) { diff --git a/unit_tests/tests/util/test_buffered_writer.cpp b/unit_tests/tests/util/test_buffered_writer.cpp index 66928a9ef6..a60cf6e123 100644 --- a/unit_tests/tests/util/test_buffered_writer.cpp +++ b/unit_tests/tests/util/test_buffered_writer.cpp @@ -1,6 +1,6 @@ +#include "pch.h" + #include "buffered_writer.h" -#include -#include using ::testing::_; using ::testing::Return; diff --git a/unit_tests/tests/util/test_error_accumulator.cpp b/unit_tests/tests/util/test_error_accumulator.cpp index 673ef737f6..d8ef4ba72e 100644 --- a/unit_tests/tests/util/test_error_accumulator.cpp +++ b/unit_tests/tests/util/test_error_accumulator.cpp @@ -1,4 +1,5 @@ -#include +#include "pch.h" + #include "error_accumulator.h" TEST(errorAccumulator, ignoreSmallError) { diff --git a/unit_tests/unit_test_rules.mk b/unit_tests/unit_test_rules.mk index 3e3989a33c..a41d5537b5 100644 --- a/unit_tests/unit_test_rules.mk +++ b/unit_tests/unit_test_rules.mk @@ -52,7 +52,7 @@ endif # C++ specific options here (added to USE_OPT). ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -std=gnu++17 -fno-rtti -fpermissive -fexceptions -fno-use-cxa-atexit -Winvalid-pch + USE_CPPOPT = -std=gnu++17 -fno-rtti -fno-use-cxa-atexit -Winvalid-pch endif # Enable this if you want the linker to remove unused code and data