/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * Test the logic of battery_get_params() to be sure it sets the correct flags * when i2c reads fail. */ #include "battery.h" #include "battery_smart.h" #include "common.h" #include "console.h" #include "i2c.h" #include "test_util.h" #include "util.h" /* Test state */ static int fail_on_first, fail_on_last; static int read_count, write_count; struct batt_params batt; static void reset_and_fail_on(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; } /* Mocked functions */ int sb_read(int cmd, int *param) { read_count++; if (read_count >= fail_on_first && read_count <= fail_on_last) return EC_ERROR_UNKNOWN; return i2c_read16(I2C_PORT_BATTERY, BATTERY_ADDR, cmd, param); } int sb_write(int cmd, int param) { write_count++; return i2c_write16(I2C_PORT_BATTERY, BATTERY_ADDR, cmd, param); } /* Tests */ static int test_param_failures(void) { int i, num_reads; /* No failures */ reset_and_fail_on(0, 0); battery_get_params(&batt); TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE); TEST_ASSERT(!(batt.flags & BATT_FLAG_BAD_ANY)); num_reads = read_count; /* Just a single failure */ for (i = 1; i <= num_reads; i++) { reset_and_fail_on(i, i); battery_get_params(&batt); TEST_ASSERT(batt.flags & BATT_FLAG_BAD_ANY); TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE); } /* Once it fails, it keeps failing */ for (i = 1; i <= num_reads; i++) { reset_and_fail_on(i, num_reads); battery_get_params(&batt); TEST_ASSERT(batt.flags & BATT_FLAG_BAD_ANY); if (i == 1) /* If every read fails, it's not responsive */ TEST_ASSERT(!(batt.flags & BATT_FLAG_RESPONSIVE)); else TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE); } return EC_SUCCESS; } void run_test(void) { RUN_TEST(test_param_failures); test_print_result(); }