From e951fac2b2fd0f9a2e89aa199d7817aa03103199 Mon Sep 17 00:00:00 2001 From: swateeshrivastava Date: Wed, 30 Jan 2019 11:32:22 +0530 Subject: [PATCH] UT for ocmp_rfwatchdog --- firmware/ec/inc/subsystem/rffe/rffe_ctrl.h | 4 + .../ec/src/devices/ocmp_wrappers/ocmp_fe.c | 4 - .../devices/ocmp_wrappers/ocmp_rfwatchdog.c | 5 +- firmware/ec/src/subsystem/rffe/rffe_ctrl.c | 5 - firmware/ec/test/Makefile | 3 + firmware/ec/test/fake/fake_PCA9557.c | 1 + firmware/ec/test/fake/fake_rfwatchdog.c | 99 ++++++++++++++ firmware/ec/test/include/test_PCA9557.h | 3 +- firmware/ec/test/include/test_rfwatchdog.h | 29 ++++ firmware/ec/test/suites/Doc/TestCaseList.xlsx | Bin 43481 -> 44878 bytes .../ec/test/suites/Test_ocmp_rfwatchdog.c | 124 ++++++++++++++++++ 11 files changed, 265 insertions(+), 12 deletions(-) create mode 100644 firmware/ec/test/fake/fake_rfwatchdog.c create mode 100644 firmware/ec/test/include/test_rfwatchdog.h create mode 100644 firmware/ec/test/suites/Test_ocmp_rfwatchdog.c diff --git a/firmware/ec/inc/subsystem/rffe/rffe_ctrl.h b/firmware/ec/inc/subsystem/rffe/rffe_ctrl.h index ad90642b32..10da6130af 100644 --- a/firmware/ec/inc/subsystem/rffe/rffe_ctrl.h +++ b/firmware/ec/inc/subsystem/rffe/rffe_ctrl.h @@ -68,6 +68,10 @@ typedef struct Fe_Ch_Pwr_Cfg { rffeChannel channel; Fe_Cfg *fe_Rffecfg; } Fe_Ch_Pwr_Cfg; + +typedef enum FE_ParamCfg { + FE_CFG_BAND = 0, +} FE_ParamCfg; /***************************************************************************** * FUNCTION DECLARATIONS *****************************************************************************/ diff --git a/firmware/ec/src/devices/ocmp_wrappers/ocmp_fe.c b/firmware/ec/src/devices/ocmp_wrappers/ocmp_fe.c index 71edebfb61..3f96814808 100644 --- a/firmware/ec/src/devices/ocmp_wrappers/ocmp_fe.c +++ b/firmware/ec/src/devices/ocmp_wrappers/ocmp_fe.c @@ -11,10 +11,6 @@ #include "inc/subsystem/rffe/rffe_ctrl.h" static FE_Band_Cfg FE_BandCfg[RFFE_MAX_CHANNEL]; -typedef enum FE_ParamCfg { - FE_CFG_BAND = 0, -} FE_ParamCfg; - /***************************************************************************** ** FUNCTION NAME : rffe_ctrl_set_band ** diff --git a/firmware/ec/src/devices/ocmp_wrappers/ocmp_rfwatchdog.c b/firmware/ec/src/devices/ocmp_wrappers/ocmp_rfwatchdog.c index 81eba4b7dd..35177f7254 100644 --- a/firmware/ec/src/devices/ocmp_wrappers/ocmp_rfwatchdog.c +++ b/firmware/ec/src/devices/ocmp_wrappers/ocmp_rfwatchdog.c @@ -20,7 +20,8 @@ void _rffe_watchdog_handler(void *context) OCMP_GenerateAlert(context, 1, NULL); } } - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" static ePostCode _rffe_watchdog_init(void *driver, const void *config, const void *alert_token) { @@ -39,7 +40,7 @@ static ePostCode _rffe_watchdog_init(void *driver, const void *config, ThreadedInt_Init(cfg->pin_interrupt, _rffe_watchdog_handler, cfg); return POST_DEV_CFG_DONE; } - +#pragma GCC diagnostic pop const Driver_fxnTable RFFEWatchdogP_fxnTable = { .cb_init = _rffe_watchdog_init, }; diff --git a/firmware/ec/src/subsystem/rffe/rffe_ctrl.c b/firmware/ec/src/subsystem/rffe/rffe_ctrl.c index e84b576278..3341b3d985 100644 --- a/firmware/ec/src/subsystem/rffe/rffe_ctrl.c +++ b/firmware/ec/src/subsystem/rffe/rffe_ctrl.c @@ -19,11 +19,6 @@ #include #include - -typedef enum FE_ParamCfg { - FE_CFG_BAND = 0, -} FE_ParamCfg; - /***************************************************************************** ** FUNCTION NAME : rffe_ctrl_configure_power_amplifier ** diff --git a/firmware/ec/test/Makefile b/firmware/ec/test/Makefile index 69a7b1f4fa..223522d6f6 100644 --- a/firmware/ec/test/Makefile +++ b/firmware/ec/test/Makefile @@ -184,6 +184,9 @@ $(PATHB)Test_ltc4274$(TARGET_EXTENSION): $(STD_FILES) $(TEST_LTC4274_SRC) $(INC_ TEST_OCMP_DEBUGI2C_SRC=$(OCWARE_ROOT)/src/devices/ocmp_wrappers/ocmp_debugi2c.c $(OCWARE_ROOT)/src/devices/i2cbus.c fake/fake_GPIO.c fake/fake_I2C.c fake/fake_ThreadedISR.c fake/fake_debugI2C.c $(OCWARE_ROOT)/platform/oc-sdr/cfg/OC_CONNECT_GBC.c $(PATHB)Test_ocmp_debugi2c$(TARGET_EXTENSION): $(STD_FILES) $(TEST_OCMP_DEBUGI2C_SRC) +TEST_OCMP_RFWATCHDOG_SRC=$(OCWARE_ROOT)/src/devices/ocmp_wrappers/ocmp_rfwatchdog.c $(OCWARE_ROOT)/src/devices/i2cbus.c $(OCWARE_ROOT)/src/helpers/memory.c fake/fake_GPIO.c fake/fake_I2C.c fake/fake_ThreadedISR.c fake/fake_PCA9557.c fake/fake_rfwatchdog.c stub/stub_GateMutex.c $(OCWARE_ROOT)/src/drivers/GpioPCA9557.c $(OCWARE_ROOT)/src/devices/pca9557.c $(OCWARE_ROOT)/platform/oc-sdr/cfg/OC_CONNECT_FE.c +$(PATHB)Test_ocmp_rfwatchdog$(TARGET_EXTENSION): $(STD_FILES) $(TEST_OCMP_RFWATCHDOG_SRC) + $(PATHB)%$(TARGET_EXTENSION): $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $^ -o $@ $(COV_CMDS) diff --git a/firmware/ec/test/fake/fake_PCA9557.c b/firmware/ec/test/fake/fake_PCA9557.c index ee6e1f027d..438415a76d 100644 --- a/firmware/ec/test/fake/fake_PCA9557.c +++ b/firmware/ec/test/fake/fake_PCA9557.c @@ -13,4 +13,5 @@ uint8_t PCA9557_regs[] = { [PCA9557_REGS_OUTPUT_VALUE] = 0x00, /* Output values */ [PCA9557_REGS_POLARITY] = 0x00, /* Polarity */ [PCA9557_REGS_DIR_CONFIG] = 0x00, /* Dir Config */ + [PCA9557_REGS_END] = 0x00, }; diff --git a/firmware/ec/test/fake/fake_rfwatchdog.c b/firmware/ec/test/fake/fake_rfwatchdog.c new file mode 100644 index 0000000000..97d4372a52 --- /dev/null +++ b/firmware/ec/test/fake/fake_rfwatchdog.c @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#include "include/test_rfwatchdog.h" + +extern Fe_gpioCfg fe_gpiocfg; +extern Fe_Watchdog_Cfg fe_watchdog_cfg; + +const I2C_Dev I2C_DEV = { + .bus = OC_CONNECT1_I2C2, + .slave_addr = RFFE_IO_REVPOWER_ALERT_ADDR, +}; +OcGpio_Port ec_io = { + .fn_table = &FakeGpio_fnTable, + .object_data = &(FakeGpio_Obj){}, +}; +bool OcGpio_GpioPins[] = { + [RFWATCHDOG_PIN_1] = OCGPIO_CFG_INPUT, + [RFWATCHDOG_PIN_2] = OCGPIO_CFG_INPUT, + [OC_EC_FE_TRXFE_CONN_RESET] = OCGPIO_CFG_INPUT, +}; +uint32_t OcGpio_GpioConfig[] = { + [RFWATCHDOG_PIN_1] = OCGPIO_CFG_INPUT, + [RFWATCHDOG_PIN_2] = OCGPIO_CFG_INPUT, + [OC_EC_FE_TRXFE_CONN_RESET] = OCGPIO_CFG_INPUT, +}; + +OcGpio_Port fe_watchdog_io = { + .fn_table = &GpioPCA9557_fnTable, + .cfg = + &(PCA9557_Cfg){ + .i2c_dev = { OC_CONNECT1_I2C2, RFFE_IO_REVPOWER_ALERT_ADDR }, + }, + .object_data = &(PCA9557_Obj){}, +}; + +Fe_gpioCfg fe_gpiocfg_invalid = { + /* EC_TRXFECONN_GPIO3/RF_PGOOD_LDO */ + .pin_rf_pgood_ldo = { &ec_io, OC_EC_FE_PWR_GD }, + .pin_fe_12v_ctrl = { &ec_io, OC_EC_FE_CONTROL }, +}; +// FE watch dog +Fe_Watchdog_Cfg fe_watchdog_invalid = { + /* CO6_WD */ + .pin_co6_wd = { &fe_watchdog_io, -1 }, + /* CO5_WD INVALID */ + .pin_co5_wd = { &fe_watchdog_io, -1 }, + /* CO4_WD */ + .pin_co4_wd = { &fe_watchdog_io, -1 }, + /* CO3_WD INVALID */ + .pin_co3_wd = { &fe_watchdog_io, -1 }, +}; + +/* FE CH watch dog */ +RfWatchdog_Cfg fe_NULL = { + .pin_alert_lb = NULL, + .pin_alert_hb = NULL, + .pin_interrupt = NULL, +}; +RfWatchdog_Cfg fe_ch1_invalid_alert_lb = { + .pin_alert_lb = NULL, + .pin_alert_hb = &fe_watchdog_cfg.pin_co5_wd, + .pin_interrupt = &fe_gpiocfg.pin_trxfe_conn_reset, +}; + +RfWatchdog_Cfg fe_ch1_invalid_alert_hb = { + .pin_alert_lb = &fe_watchdog_cfg.pin_co6_wd, + .pin_alert_hb = NULL, + .pin_interrupt = &fe_gpiocfg.pin_trxfe_conn_reset, +}; + +RfWatchdog_Cfg fe_ch1_invalid_interrupt = { + .pin_alert_lb = &fe_watchdog_cfg.pin_co6_wd, + .pin_alert_hb = &fe_watchdog_cfg.pin_co5_wd, + .pin_interrupt = &fe_gpiocfg_invalid.pin_trxfe_conn_reset, +}; +RfWatchdog_Cfg fe_ch2_invalid_alert_lb = { + .pin_alert_lb = NULL, + .pin_alert_hb = &fe_watchdog_cfg.pin_co4_wd, + .pin_interrupt = &fe_gpiocfg.pin_trxfe_conn_reset, +}; + +RfWatchdog_Cfg fe_ch2_invalid_alert_hb = { + .pin_alert_lb = &fe_watchdog_cfg.pin_co3_wd, + .pin_alert_hb = NULL, + .pin_interrupt = &fe_gpiocfg.pin_trxfe_conn_reset, +}; + +RfWatchdog_Cfg fe_ch2_invalid_interrupt = { + .pin_alert_lb = &fe_watchdog_cfg.pin_co3_wd, + .pin_alert_hb = &fe_watchdog_cfg.pin_co4_wd, + .pin_interrupt = &fe_gpiocfg_invalid.pin_trxfe_conn_reset, +}; diff --git a/firmware/ec/test/include/test_PCA9557.h b/firmware/ec/test/include/test_PCA9557.h index c8dc9c658b..fae030c311 100644 --- a/firmware/ec/test/include/test_PCA9557.h +++ b/firmware/ec/test/include/test_PCA9557.h @@ -16,6 +16,7 @@ typedef enum PCA9557Regs { PCA9557_REGS_INPUT_VALUE = 0x00, PCA9557_REGS_OUTPUT_VALUE, PCA9557_REGS_POLARITY, - PCA9557_REGS_DIR_CONFIG + PCA9557_REGS_DIR_CONFIG, + PCA9557_REGS_END = 0x10, } PCA9557Regs; #endif diff --git a/firmware/ec/test/include/test_rfwatchdog.h b/firmware/ec/test/include/test_rfwatchdog.h new file mode 100644 index 0000000000..bee9263e0a --- /dev/null +++ b/firmware/ec/test/include/test_rfwatchdog.h @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +#ifndef _TEST_RFWATCHDOG_H +#define _TEST_RFWATCHDOG_H + +#include "common/inc/global/Framework.h" +#include "common/inc/global/OC_CONNECT1.h" +#include "common/inc/ocmp_wrappers/ocmp_rfwatchdog.h" +#include "fake/fake_GPIO.h" +#include "fake/fake_I2C.h" +#include "inc/subsystem/rffe/rffe_ctrl.h" +#include "include/test_PCA9557.h" +#include "src/drivers/GpioPCA9557.h" +#include +#include "unity.h" + +#define RFWATCHDOG_CH1_DIR_CONFIG_VALUE 0x0C +#define RFWATCHDOG_CH2_DIR_CONFIG_VALUE 0x3C +#define RFWATCHDOG_DIR_CONFIG_DEFAULT_VALUE 0x00 +#define RFWATCHDOG_PIN_1 0x01 +#define RFWATCHDOG_PIN_2 0x02 + +#endif diff --git a/firmware/ec/test/suites/Doc/TestCaseList.xlsx b/firmware/ec/test/suites/Doc/TestCaseList.xlsx index 4bb300cc487c9c9f602c2bf9bb9a6dcfff456657..bafbc4970c34309048ec998a8dfa22eb4bba3500 100644 GIT binary patch delta 14411 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 jY>P-Wh#bBI delta 13273 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 Dsm(b^ diff --git a/firmware/ec/test/suites/Test_ocmp_rfwatchdog.c b/firmware/ec/test/suites/Test_ocmp_rfwatchdog.c new file mode 100644 index 0000000000..b512358d4e --- /dev/null +++ b/firmware/ec/test/suites/Test_ocmp_rfwatchdog.c @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +#include "include/test_rfwatchdog.h" + +/* ======================== Constants & variables =========================== */ +extern bool OcGpio_GpioPins[OC_EC_FE_TRXFE_CONN_RESET]; +extern const Component sys_schema[]; +extern const I2C_Dev I2C_DEV; +extern const OcGpio_FnTable GpioPCA9557_fnTable; +extern Fe_Watchdog_Cfg fe_watchdog_cfg; +extern Fe_Watchdog_Cfg fe_watchdog_invalid; +extern OcGpio_Port ec_io; +extern OcGpio_Port fe_watchdog_io; +extern RfWatchdog_Cfg fe_ch1_invalid_alert_hb; +extern RfWatchdog_Cfg fe_ch1_invalid_alert_lb; +extern RfWatchdog_Cfg fe_ch1_invalid_interrupt; +extern RfWatchdog_Cfg fe_ch1_watchdog; +extern RfWatchdog_Cfg fe_ch2_invalid_alert_hb; +extern RfWatchdog_Cfg fe_ch2_invalid_alert_lb; +extern RfWatchdog_Cfg fe_ch2_invalid_interrupt; +extern RfWatchdog_Cfg fe_ch2_watchdog; +extern RfWatchdog_Cfg fe_NULL; +extern uint8_t PCA9557_regs[PCA9557_REGS_END]; +extern uint32_t OcGpio_GpioConfig[OC_EC_FE_TRXFE_CONN_RESET]; + +/* ============================= Fake Functions ============================= */ +#include +unsigned int s_task_sleep_ticks; +xdc_Void ti_sysbios_knl_Task_sleep__E(xdc_UInt32 nticks) +{ + s_task_sleep_ticks += nticks; +} +void test_alert(void) +{ +} +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, + const void *data) +{ +} +#pragma GCC diagnostic pop +/* ============================= Boilerplate ================================ */ +void suite_setUp(void) +{ + FakeGpio_registerDevSimple(OcGpio_GpioPins, OcGpio_GpioConfig); + fake_I2C_init(); + fake_I2C_registerDevSimple(I2C_DEV.bus, I2C_DEV.slave_addr, PCA9557_regs, + sizeof(PCA9557_regs), sizeof(PCA9557_regs[0]), + sizeof(uint8_t), FAKE_I2C_DEV_BIG_ENDIAN); +} +void setUp(void) +{ +} +void tearDown(void) +{ +} +void suite_tearDown(void) +{ + fake_I2C_deinit(); /* This will automatically unregister devices */ +} + +/* ================================ Tests =================================== */ +void test_init(void) +{ + PCA9557_regs[PCA9557_REGS_DIR_CONFIG] = + RFWATCHDOG_DIR_CONFIG_DEFAULT_VALUE; /* Dir Config */ + OcGpio_GpioConfig[OC_EC_FE_TRXFE_CONN_RESET] = OCGPIO_CFG_OUTPUT; + TEST_ASSERT_EQUAL(POST_DEV_CFG_DONE, RFFEWatchdogP_fxnTable.cb_init( + &fe_ch1_watchdog, NULL, NULL)); + TEST_ASSERT_EQUAL_HEX8(RFWATCHDOG_CH1_DIR_CONFIG_VALUE, + PCA9557_regs[PCA9557_REGS_DIR_CONFIG]); + TEST_ASSERT_EQUAL_HEX8(OCGPIO_CFG_INPUT | OCGPIO_CFG_INT_FALLING, + OcGpio_GpioConfig[OC_EC_FE_TRXFE_CONN_RESET]); + + OcGpio_GpioConfig[OC_EC_FE_TRXFE_CONN_RESET] = + RFWATCHDOG_DIR_CONFIG_DEFAULT_VALUE; + TEST_ASSERT_EQUAL(POST_DEV_CFG_DONE, RFFEWatchdogP_fxnTable.cb_init( + &fe_ch2_watchdog, NULL, NULL)); + TEST_ASSERT_EQUAL_HEX8(RFWATCHDOG_CH2_DIR_CONFIG_VALUE, + PCA9557_regs[PCA9557_REGS_DIR_CONFIG]); + TEST_ASSERT_EQUAL_HEX8(OCGPIO_CFG_INPUT | OCGPIO_CFG_INT_FALLING, + OcGpio_GpioConfig[OC_EC_FE_TRXFE_CONN_RESET]); + + /* Invalid Null test */ + TEST_ASSERT_EQUAL(POST_DEV_CFG_FAIL, + RFFEWatchdogP_fxnTable.cb_init(&fe_NULL, NULL, NULL)); + + /* Invalid ch1 alert_lb test */ + TEST_ASSERT_EQUAL( + POST_DEV_CFG_FAIL, + RFFEWatchdogP_fxnTable.cb_init(&fe_ch1_invalid_alert_lb, NULL, NULL)); + + /* Invalid ch1 alert_hb test */ + TEST_ASSERT_EQUAL( + POST_DEV_CFG_FAIL, + RFFEWatchdogP_fxnTable.cb_init(&fe_ch1_invalid_alert_hb, NULL, NULL)); + + /* Invalid ch1 interrupt test */ + TEST_ASSERT_EQUAL( + POST_DEV_CFG_FAIL, + RFFEWatchdogP_fxnTable.cb_init(&fe_ch1_invalid_interrupt, NULL, NULL)); + + /* Invalid ch2 alert_lb test */ + TEST_ASSERT_EQUAL( + POST_DEV_CFG_FAIL, + RFFEWatchdogP_fxnTable.cb_init(&fe_ch2_invalid_alert_lb, NULL, NULL)); + + /* Invalid ch2 alert_hb test */ + TEST_ASSERT_EQUAL( + POST_DEV_CFG_FAIL, + RFFEWatchdogP_fxnTable.cb_init(&fe_ch2_invalid_alert_hb, NULL, NULL)); + + /* Invalid ch2 interrupt test */ + TEST_ASSERT_EQUAL( + POST_DEV_CFG_FAIL, + RFFEWatchdogP_fxnTable.cb_init(&fe_ch2_invalid_interrupt, NULL, NULL)); +}