summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2021-08-06 09:15:58 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-08-31 21:27:53 +0000
commita97b3b7305b8fcd3ec6d1ee1d3b9297173efdde3 (patch)
tree8435e6818a9c9f9178cc11d5b62e3ce19b1aaf52
parent154b0adcd69f2d433db449b1be5ab821c118bd0d (diff)
downloadchrome-ec-a97b3b7305b8fcd3ec6d1ee1d3b9297173efdde3.tar.gz
chgstv2/sustainer: Add tests for full battery and AC
Currently, unit tests do not check whether the battery sustainer can be enabled when the battery is already full or when the AC is already present. This patch adds tests which check the battery sustainer can be enabled when the battery is already full or when the AC is already present. BUG=b:188457962 BRANCH=None TEST=run-sbs_charging_v2 Change-Id: I4ec9785554d126baca0b60e889c4a2dabbfb628a Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3078401 Reviewed-by: Jack Rosenthal <jrosenth@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3852912
-rw-r--r--common/charge_state_v2.c2
-rw-r--r--test/sbs_charging_v2.c78
2 files changed, 64 insertions, 16 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index 1bfccdec47..f65e80dc6e 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -1240,7 +1240,7 @@ static void show_charging_progress(void)
}
/* Calculate if battery is full based on whether it is accepting charge */
-static int calc_is_full(void)
+test_mockable int calc_is_full(void)
{
static int __bss_slow ret;
diff --git a/test/sbs_charging_v2.c b/test/sbs_charging_v2.c
index 78e4b3fc30..39dc7a9160 100644
--- a/test/sbs_charging_v2.c
+++ b/test/sbs_charging_v2.c
@@ -27,6 +27,7 @@ static int is_force_discharge;
static int is_hibernated;
static int override_voltage, override_current, override_usec;
static int display_soc;
+static int is_full;
/* The simulation doesn't really hibernate, so we must reset this ourselves */
extern timestamp_t shutdown_target_time;
@@ -37,6 +38,7 @@ static void reset_mocks(void)
is_shutdown = is_force_discharge = is_hibernated = 0;
override_voltage = override_current = override_usec = 0;
shutdown_target_time.val = 0ULL;
+ is_full = 0;
}
int board_cut_off_battery(void)
@@ -115,10 +117,14 @@ static int wait_charging_state(void)
static int charge_control(enum ec_charge_control_mode mode)
{
- struct ec_params_charge_control params;
- params.mode = mode;
- return test_send_host_command(EC_CMD_CHARGE_CONTROL, 2, &params,
- sizeof(params), NULL, 0);
+ struct ec_params_charge_control p;
+
+ p.cmd = EC_CHARGE_CONTROL_CMD_SET;
+ p.mode = mode;
+ p.sustain_soc.lower = -1;
+ p.sustain_soc.upper = -1;
+ return test_send_host_command(EC_CMD_CHARGE_CONTROL, 2, &p, sizeof(p),
+ NULL, 0);
}
__override int charge_get_display_charge(void)
@@ -126,6 +132,11 @@ __override int charge_get_display_charge(void)
return display_soc;
}
+__override int calc_is_full(void)
+{
+ return is_full;
+}
+
/* Setup init condition */
static void test_setup(int on_ac)
{
@@ -745,49 +756,86 @@ static int test_battery_sustainer(void)
/* Check mode transition as the SoC changes. */
- /* SoC < lower < upper */
+ ccprintf("Test SoC < lower < upper.\n");
display_soc = 780;
wait_charging_state();
TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+ ccprintf("Pass.\n");
- /* lower < upper < SoC */
+ ccprintf("Test lower < upper < SoC.\n");
display_soc = 810;
wait_charging_state();
TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE);
+ ccprintf("Pass.\n");
- /* Unplug AC. Sustainer gets deactivated. */
+ ccprintf("Test unplug AC.\n");
gpio_set_level(GPIO_AC_PRESENT, 0);
wait_charging_state();
TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+ ccprintf("Pass.\n");
- /* Replug AC. Sustainer gets re-activated. */
+ ccprintf("Test replug AC.\n");
gpio_set_level(GPIO_AC_PRESENT, 1);
wait_charging_state();
TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE);
+ ccprintf("Pass.\n");
- /* lower < SoC < upper */
+ ccprintf("Test lower < SoC < upper.\n");
display_soc = 799;
wait_charging_state();
TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_IDLE);
+ ccprintf("Pass.\n");
- /* SoC < lower < upper */
+ ccprintf("Test SoC < lower < upper.\n");
display_soc = 789;
wait_charging_state();
TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+ ccprintf("Pass.\n");
+
+ ccprintf("Test disable sustainer.\n");
+ charge_control(CHARGE_CONTROL_NORMAL);
+ display_soc = 810;
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+ ccprintf("Pass.\n");
- /* Disable sustainer */
+ ccprintf("Test enable sustainer when battery is full.\n");
+ display_soc = 1000;
+ is_full = 1;
+ wait_charging_state();
+ /* Enable sustainer. */
p.cmd = EC_CHARGE_CONTROL_CMD_SET;
p.mode = CHARGE_CONTROL_NORMAL;
- p.sustain_soc.lower = -1;
- p.sustain_soc.upper = -1;
+ p.sustain_soc.lower = 79;
+ p.sustain_soc.upper = 80;
rv = test_send_host_command(EC_CMD_CHARGE_CONTROL, 2,
&p, sizeof(p), NULL, 0);
TEST_ASSERT(rv == EC_RES_SUCCESS);
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE);
+ ccprintf("Pass.\n");
- /* This time, mode will stay in NORMAL even when upper < SoC. */
+ /* Disable sustainer, unplug AC, upper < SoC < 100. */
+ charge_control(CHARGE_CONTROL_NORMAL);
display_soc = 810;
+ is_full = 0;
+ gpio_set_level(GPIO_AC_PRESENT, 0);
wait_charging_state();
- TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+
+ ccprintf("Test enable sustainer when AC is present.\n");
+ gpio_set_level(GPIO_AC_PRESENT, 1);
+ wait_charging_state();
+ /* Enable sustainer. */
+ p.cmd = EC_CHARGE_CONTROL_CMD_SET;
+ p.mode = CHARGE_CONTROL_NORMAL;
+ p.sustain_soc.lower = 79;
+ p.sustain_soc.upper = 80;
+ rv = test_send_host_command(EC_CMD_CHARGE_CONTROL, 2,
+ &p, sizeof(p), NULL, 0);
+ TEST_ASSERT(rv == EC_RES_SUCCESS);
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE);
+ ccprintf("Pass.\n");
return EC_SUCCESS;
}