diff options
Diffstat (limited to 'zephyr/test/drivers/default/src/battery.c')
-rw-r--r-- | zephyr/test/drivers/default/src/battery.c | 233 |
1 files changed, 226 insertions, 7 deletions
diff --git a/zephyr/test/drivers/default/src/battery.c b/zephyr/test/drivers/default/src/battery.c index 2e06725af5..02f85d9662 100644 --- a/zephyr/test/drivers/default/src/battery.c +++ b/zephyr/test/drivers/default/src/battery.c @@ -3,26 +3,78 @@ * found in the LICENSE file. */ -#include <zephyr/kernel.h> -#include <zephyr/ztest.h> -#include <zephyr/drivers/gpio.h> -#include <zephyr/drivers/gpio/gpio_emul.h> - #include "battery.h" +#include "battery_fuel_gauge.h" +#include "emul/emul_common_i2c.h" +#include "emul/emul_smart_battery.h" #include "test/drivers/test_state.h" +#include "test/drivers/utils.h" + +#include <zephyr/drivers/emul.h> +#include <zephyr/drivers/gpio.h> +#include <zephyr/drivers/gpio/gpio_emul.h> +#include <zephyr/fff.h> +#include <zephyr/kernel.h> +#include <zephyr/ztest.h> #define GPIO_BATT_PRES_ODL_PATH DT_PATH(named_gpios, ec_batt_pres_odl) #define GPIO_BATT_PRES_ODL_PORT DT_GPIO_PIN(GPIO_BATT_PRES_ODL_PATH, gpios) +FAKE_VALUE_FUNC(int, battery2_write_func, const struct emul *, int, uint8_t, + int, void *); +FAKE_VALUE_FUNC(int, battery2_read_func, const struct emul *, int, uint8_t *, + int, void *); + +bool authenticate_battery_type(int index, const char *manuf_name); + +extern int battery_fuel_gauge_type_override; + +struct battery_fixture { + struct i2c_common_emul_data *battery_i2c_common; + i2c_common_emul_finish_write_func finish_write_func; + i2c_common_emul_start_read_func start_read_func; +}; + +static void *battery_setup(void) +{ + static struct battery_fixture fixture; + static const struct emul *emul = EMUL_DT_GET(DT_NODELABEL(battery)); + + fixture.battery_i2c_common = + emul_smart_battery_get_i2c_common_data(emul); + + return &fixture; +} + +static void battery_before(void *data) +{ + struct battery_fixture *fixture = data; + + RESET_FAKE(battery2_write_func); + RESET_FAKE(battery2_read_func); + fixture->finish_write_func = fixture->battery_i2c_common->finish_write; + fixture->start_read_func = fixture->battery_i2c_common->start_read; +} + static void battery_after(void *data) { + struct battery_fixture *fixture = data; const struct device *dev = DEVICE_DT_GET(DT_GPIO_CTLR(GPIO_BATT_PRES_ODL_PATH, gpios)); /* Set default state (battery is present) */ gpio_emul_input_set(dev, GPIO_BATT_PRES_ODL_PORT, 0); + battery_fuel_gauge_type_override = -1; + + i2c_common_emul_set_write_func(fixture->battery_i2c_common, NULL, NULL); + i2c_common_emul_set_read_func(fixture->battery_i2c_common, NULL, NULL); + fixture->battery_i2c_common->finish_write = fixture->finish_write_func; + fixture->battery_i2c_common->start_read = fixture->start_read_func; } +ZTEST_SUITE(battery, drivers_predicate_post_main, battery_setup, battery_before, + battery_after, NULL); + ZTEST_USER(battery, test_battery_is_present_gpio) { const struct device *dev = @@ -37,5 +89,172 @@ ZTEST_USER(battery, test_battery_is_present_gpio) zassert_equal(BP_NO, battery_is_present()); } -ZTEST_SUITE(battery, drivers_predicate_post_main, NULL, NULL, battery_after, - NULL); +ZTEST(battery, test_authenticate_battery_type) +{ + /* Invalid index */ + zassert_false(authenticate_battery_type(BATTERY_TYPE_COUNT, NULL)); + /* Use fuel-gauge 1's manufacturer name for index 0 */ + zassert_false(authenticate_battery_type( + 0, board_battery_info[1].fuel_gauge.manuf_name)); + /* Use the correct manufacturer name, but wrong device name (because the + * index is 1 and not 0) + */ + zassert_false(authenticate_battery_type( + 1, board_battery_info[1].fuel_gauge.manuf_name)); +} + +ZTEST(battery, test_board_get_default_battery_type) +{ + zassert_equal(DEFAULT_BATTERY_TYPE, board_get_default_battery_type()); +} + +ZTEST_F(battery, test_board_cutoff_actuates_driver) +{ + /* We check the return type because board_is_cut_off() is set outside of + * board_cut_off_battery() and may be changed by other factors. + */ + + /* Try with invalid battery type */ + battery_fuel_gauge_type_override = BATTERY_TYPE_COUNT; + zassert_equal(EC_RES_ERROR, board_cut_off_battery()); + + /* Setup error conditions for battery 1*/ + battery_fuel_gauge_type_override = 1; + fixture->battery_i2c_common->finish_write = NULL; + i2c_common_emul_set_write_func(fixture->battery_i2c_common, + battery2_write_func, NULL); + + /* Check that i2c error returns EC_RES_ERROR */ + battery2_write_func_fake.return_val = -1; + zassert_equal(EC_RES_ERROR, board_cut_off_battery()); + + /* Check for OK when i2c succeeds */ + battery2_write_func_fake.return_val = 0; + zassert_ok(board_cut_off_battery()); +} + +ZTEST_F(battery, test_sleep) +{ + /* Try with invalid battery type */ + battery_fuel_gauge_type_override = BATTERY_TYPE_COUNT; + zassert_equal(EC_ERROR_UNKNOWN, battery_sleep_fuel_gauge()); + + /* Check 1st battery (lgc,ac17a8m) */ + battery_fuel_gauge_type_override = 0; + zassert_equal(EC_ERROR_UNIMPLEMENTED, battery_sleep_fuel_gauge()); + + /* Check 2nd battery (panasonic,ap15l5j) */ + battery_fuel_gauge_type_override = 1; + fixture->battery_i2c_common->finish_write = NULL; + i2c_common_emul_set_write_func(fixture->battery_i2c_common, + battery2_write_func, NULL); + zassert_ok(battery_sleep_fuel_gauge()); +} + +struct battery2_read_data { + size_t count; + const uint8_t *values; +}; + +static int battery2_read(const struct emul *target, int reg, uint8_t *val, + int bytes, void *d) +{ + struct battery2_read_data *data = d; + + if (bytes < data->count) { + *val = data->values[bytes]; + } + + return 0; +} + +ZTEST(battery, test_is_charge_fet_disabled__invalid_battery_type) +{ + battery_fuel_gauge_type_override = BATTERY_TYPE_COUNT; + zassert_equal(-1, battery_is_charge_fet_disabled()); +} + +ZTEST(battery, test_is_charge_fet_disabled__cfet_mask_is_0) +{ + battery_fuel_gauge_type_override = 2; + zassert_equal(0, battery_is_charge_fet_disabled()); +} + +ZTEST_F(battery, test_is_charge_fet_disabled__i2c_error) +{ + /* Set the battery to battery 1 */ + battery_fuel_gauge_type_override = 1; + + /* Override the finish_write common callback since we don't actually + * want to be messing with the emulator. + */ + fixture->battery_i2c_common->finish_write = NULL; + + /* Set up an error condition for battery 1 to fail writing to i2c */ + battery2_write_func_fake.return_val = -1; + i2c_common_emul_set_write_func(fixture->battery_i2c_common, + battery2_write_func, NULL); + + /* Verify the error */ + zassert_equal(-1, battery_is_charge_fet_disabled()); +} + +ZTEST_F(battery, test_is_charge_fet_disabled) +{ + /* Custom data expected to be read from the battery */ + static const uint8_t values[] = { 0x20, 0x54, 0x00, 0x00, + 0x00, 0x00, 0x00 }; + static struct battery2_read_data data = { + .count = ARRAY_SIZE(values), + .values = values, + }; + + /* Set up the fake read function */ + battery2_read_func_fake.custom_fake = battery2_read; + i2c_common_emul_set_read_func(fixture->battery_i2c_common, + battery2_read_func, &data); + + /* Override the finish_write and start_read common callback since we + * don't actually want to be messing with the emulator. + */ + fixture->battery_i2c_common->finish_write = NULL; + fixture->battery_i2c_common->start_read = NULL; + + zassert_equal(1, battery_is_charge_fet_disabled()); +} + +ZTEST(battery, test_get_disconnect_state__invalid_battery_type) +{ + battery_fuel_gauge_type_override = BATTERY_TYPE_COUNT; + zassert_equal(BATTERY_DISCONNECT_ERROR, battery_get_disconnect_state()); +} + +ZTEST_F(battery, test_get_disconnect_state__fail_i2c_read) +{ + /* Use battery 0 */ + battery_fuel_gauge_type_override = 0; + + /* Configure i2c to fail on read */ + battery2_read_func_fake.return_val = -1; + i2c_common_emul_set_read_func(fixture->battery_i2c_common, + battery2_read_func, NULL); + + /* Check for disconnect error */ + zassert_equal(BATTERY_DISCONNECT_ERROR, battery_get_disconnect_state()); +} + +ZTEST_F(battery, test_get_disconnect_state) +{ + static const uint8_t values[] = { 0x00, 0x20 }; + static struct battery2_read_data data = { + .count = ARRAY_SIZE(values), + .values = values, + }; + + /* Enable i2c reads and set them to always return 0x2000 */ + battery2_read_func_fake.custom_fake = battery2_read; + i2c_common_emul_set_read_func(fixture->battery_i2c_common, + battery2_read_func, &data); + + zassert_equal(BATTERY_DISCONNECTED, battery_get_disconnect_state()); +} |