summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2023-01-05 10:35:09 -0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-02-01 15:29:09 +0000
commit350ca7c4ad9c5bd134479a1d96b8471cc18bc8eb (patch)
treeb2a9ac3778eff506fc060ef3b89397f66459d93c
parent4df9649461170b99b4d882f36d049fb932415096 (diff)
downloadchrome-ec-350ca7c4ad9c5bd134479a1d96b8471cc18bc8eb.tar.gz
SBS: Add more unit tests for battery_get_params
Currently, we test only BATT_FLAG_RESPONSIVE and BAD_ANY. This patch adds test for the other flags. It also explicitly tests flag transitions (0 -> 1 and 1 -> 0), and reading voltages and currents. BUG=None BRANCH=None TEST=run-battery_get_params_smart Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Change-Id: Ia83d782c427aff1e12b71e0f1569e1e577648671 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4137167 Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com> Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org> Commit-Queue: Paul Fagerburg <pfagerburg@chromium.org> (cherry picked from commit 095a1ac65d1dd163623fa2081aaea4f844e3a78b) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4212308 Commit-Queue: Ivan Chen <yulunchen@google.com> Reviewed-by: Owen Yang <owen.yang@ecs.corp-partner.google.com> Reviewed-by: Shou-Chieh Hsu <shouchieh@chromium.org> Tested-by: Owen Yang <owen.yang@ecs.corp-partner.google.com>
-rw-r--r--test/battery_get_params_smart.c161
1 files changed, 155 insertions, 6 deletions
diff --git a/test/battery_get_params_smart.c b/test/battery_get_params_smart.c
index 42582df363..48273c4be0 100644
--- a/test/battery_get_params_smart.c
+++ b/test/battery_get_params_smart.c
@@ -18,6 +18,7 @@
static int fail_on_first, fail_on_last;
static int read_count, write_count;
struct batt_params batt;
+static int cmd_to_fail;
void battery_compensate_params(struct batt_params *batt)
{
@@ -27,15 +28,21 @@ void board_battery_compensate_params(struct batt_params *batt)
{
}
-static void reset_and_fail_on(int first, int last)
+static void reset_counters(int first, int last)
{
- /* We're not initializing the fake battery, so everything reads zero */
- memset(&batt, 0, sizeof(typeof(batt)));
read_count = write_count = 0;
fail_on_first = first;
fail_on_last = last;
}
+static void reset_and_fail_on(int first, int last, int cmd)
+{
+ /* We're not initializing the fake battery, so everything reads zero */
+ memset(&batt, 0, sizeof(typeof(batt)));
+ cmd_to_fail = cmd;
+ reset_counters(first, last);
+}
+
/* Mocked functions */
int sb_read(int cmd, int *param)
{
@@ -43,8 +50,12 @@ int sb_read(int cmd, int *param)
if (read_count >= fail_on_first && read_count <= fail_on_last)
return EC_ERROR_UNKNOWN;
+ if (cmd == cmd_to_fail)
+ return EC_ERROR_UNKNOWN;
+
return i2c_read16(I2C_PORT_BATTERY, BATTERY_ADDR_FLAGS, cmd, param);
}
+
int sb_write(int cmd, int param)
{
write_count++;
@@ -57,15 +68,17 @@ static int test_param_failures(void)
int i, num_reads;
/* No failures */
- reset_and_fail_on(0, 0);
+ reset_and_fail_on(0, 0, -1);
battery_get_params(&batt);
TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE);
TEST_ASSERT(!(batt.flags & BATT_FLAG_BAD_ANY));
+
+ /* Save the max number of reads. */
num_reads = read_count;
/* Just a single failure */
for (i = 1; i <= num_reads; i++) {
- reset_and_fail_on(i, i);
+ reset_and_fail_on(i, i, -1);
battery_get_params(&batt);
TEST_ASSERT(batt.flags & BATT_FLAG_BAD_ANY);
TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE);
@@ -73,7 +86,7 @@ static int test_param_failures(void)
/* Once it fails, it keeps failing */
for (i = 1; i <= num_reads; i++) {
- reset_and_fail_on(i, num_reads);
+ reset_and_fail_on(i, num_reads, -1);
battery_get_params(&batt);
TEST_ASSERT(batt.flags & BATT_FLAG_BAD_ANY);
if (i == 1)
@@ -86,9 +99,145 @@ static int test_param_failures(void)
return EC_SUCCESS;
}
+/**
+ * Test if battery_get_params sets a flag properly for a SB command.
+ *
+ * @param cmd SB command to fail.
+ * @param flag Flag expected to be set when <cmd> fails.
+ * @return EC_SUCCESS
+ */
+static int test_flag(int cmd, int flag)
+{
+ reset_and_fail_on(0, 0, cmd);
+ battery_get_params(&batt);
+ TEST_ASSERT(batt.flags & flag);
+ TEST_ASSERT(!((batt.flags & ~flag) & BATT_FLAG_BAD_ANY));
+ TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE);
+
+ /*
+ * When SB_CHARGING_VOLTAGE, SB_CHARGING_CURRENT, or
+ * SB_RELATIVE_STATE_OF_CHARGE fails, WANT_CHARGE should be cleared.
+ */
+ switch (cmd) {
+ case SB_RELATIVE_STATE_OF_CHARGE:
+ case SB_CHARGING_VOLTAGE:
+ case SB_CHARGING_CURRENT:
+ TEST_ASSERT(!(batt.flags & BATT_FLAG_WANT_CHARGE));
+ TEST_ASSERT(batt.desired_voltage == 0);
+ TEST_ASSERT(batt.desired_current == 0);
+ break;
+ default:
+ TEST_ASSERT(batt.flags & BATT_FLAG_WANT_CHARGE);
+ TEST_ASSERT(batt.desired_voltage == 100);
+ TEST_ASSERT(batt.desired_current == 100);
+ }
+
+ /*
+ * Failure is recovered. <flag> should be cleared. WANT_CHARGE should be
+ * set.
+ */
+ cmd_to_fail = -1;
+ battery_get_params(&batt);
+ TEST_ASSERT(!(batt.flags & flag));
+ TEST_ASSERT(batt.flags & BATT_FLAG_WANT_CHARGE);
+
+ return EC_SUCCESS;
+}
+
+static int test_flags(void)
+{
+ sb_write(SB_CHARGING_VOLTAGE, 100);
+ sb_write(SB_CHARGING_CURRENT, 100);
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 50);
+
+ /* Test each command-flag pair. */
+ test_flag(SB_TEMPERATURE, BATT_FLAG_BAD_TEMPERATURE);
+ test_flag(SB_RELATIVE_STATE_OF_CHARGE, BATT_FLAG_BAD_STATE_OF_CHARGE);
+ test_flag(SB_VOLTAGE, BATT_FLAG_BAD_VOLTAGE);
+ test_flag(SB_CURRENT, BATT_FLAG_BAD_CURRENT);
+ test_flag(SB_AVERAGE_CURRENT, BATT_FLAG_BAD_AVERAGE_CURRENT);
+ test_flag(SB_CHARGING_VOLTAGE, BATT_FLAG_BAD_DESIRED_VOLTAGE);
+ test_flag(SB_CHARGING_CURRENT, BATT_FLAG_BAD_DESIRED_CURRENT);
+ test_flag(SB_REMAINING_CAPACITY, BATT_FLAG_BAD_REMAINING_CAPACITY);
+ test_flag(SB_FULL_CHARGE_CAPACITY, BATT_FLAG_BAD_FULL_CAPACITY);
+ test_flag(SB_BATTERY_STATUS, BATT_FLAG_BAD_STATUS);
+
+ /*
+ * All reads succeed. BATT_FLAG_RESPONSIVE should be set. Then, all
+ * reads fail. BATT_FLAG_RESPONSIVE should be cleared.
+ */
+ reset_and_fail_on(0, 0, -1);
+ battery_get_params(&batt);
+ TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE);
+
+ reset_counters(1, read_count);
+ battery_get_params(&batt);
+ TEST_ASSERT(!(batt.flags & BATT_FLAG_RESPONSIVE));
+
+ /* Test WANT_CHARGE is explicitly cleared. */
+ reset_and_fail_on(0, 0, SB_RELATIVE_STATE_OF_CHARGE);
+ batt.flags |= BATT_FLAG_WANT_CHARGE;
+ battery_get_params(&batt);
+ TEST_ASSERT(!(batt.flags & BATT_FLAG_WANT_CHARGE));
+
+ return EC_SUCCESS;
+}
+
+static int test_full_state_of_charge(void)
+{
+ /*
+ * When SoC is full, BATT_FLAG_WANT_CHARGE should be cleared and
+ * desired voltage and current are also cleared.
+ */
+ sb_write(SB_CHARGING_VOLTAGE, 100);
+ sb_write(SB_CHARGING_CURRENT, 100);
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 100);
+
+ reset_and_fail_on(0, 0, -1);
+ battery_get_params(&batt);
+ TEST_ASSERT(!(batt.flags & BATT_FLAG_WANT_CHARGE));
+ TEST_ASSERT(batt.desired_voltage == 0);
+ TEST_ASSERT(batt.desired_current == 0);
+ TEST_ASSERT(batt.state_of_charge == 100);
+
+ return EC_SUCCESS;
+}
+
+static int test_voltage(void)
+{
+ sb_write(SB_VOLTAGE, 100);
+ reset_and_fail_on(0, 0, -1);
+
+ battery_get_params(&batt);
+ TEST_ASSERT(batt.voltage == 100);
+
+ return EC_SUCCESS;
+}
+
+static int test_current(void)
+{
+ /* Test positive (charge) current. */
+ sb_write(SB_CURRENT, 100);
+ reset_and_fail_on(0, 0, -1);
+ battery_get_params(&batt);
+ TEST_ASSERT(batt.current == 100);
+
+ /* Test negative (discharge) current. */
+ sb_write(SB_CURRENT, -100);
+ reset_and_fail_on(0, 0, -1);
+ battery_get_params(&batt);
+ TEST_ASSERT(batt.current == -100);
+
+ return EC_SUCCESS;
+}
+
void run_test(int argc, const char **argv)
{
RUN_TEST(test_param_failures);
+ RUN_TEST(test_flags);
+ RUN_TEST(test_full_state_of_charge);
+ RUN_TEST(test_voltage);
+ RUN_TEST(test_current);
test_print_result();
}