summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--health/Android.bp1
-rw-r--r--health/BatteryDefender.cpp55
-rw-r--r--health/include/pixelhealth/BatteryDefender.h24
-rw-r--r--health/test/TestBatteryDefender.cpp284
4 files changed, 304 insertions, 60 deletions
diff --git a/health/Android.bp b/health/Android.bp
index b563b434..e954ca36 100644
--- a/health/Android.bp
+++ b/health/Android.bp
@@ -58,6 +58,7 @@ cc_test {
static_libs: [
"libgmock",
"libpixelhealth",
+ "libbatterymonitor",
],
shared_libs: [
diff --git a/health/BatteryDefender.cpp b/health/BatteryDefender.cpp
index e7e80c43..2cc538b8 100644
--- a/health/BatteryDefender.cpp
+++ b/health/BatteryDefender.cpp
@@ -133,14 +133,12 @@ void BatteryDefender::writeChargeLevelsToFile(const int vendorStart, const int v
}
}
-bool BatteryDefender::isChargePowerAvailable(void) {
- // USB presence is an indicator of connectivity
- const bool chargerPresentWired = readFileToInt(kPathWiredChargerPresent) != 0;
+bool BatteryDefender::isChargePowerAvailable(const bool chargerWirelessOnline) {
+ // USB presence is an indicator of power availability
+ const bool chargerPresentWired = readFileToInt(kPathUSBChargerPresent) != 0;
+ mIsUsbPresent = chargerPresentWired;
- // Wireless online is an indicator of a device having charge power
- const bool chargerOnlineWireless = readFileToInt(kPathWirelessChargerOnline) != 0;
-
- return chargerPresentWired || chargerOnlineWireless;
+ return chargerPresentWired || chargerWirelessOnline;
}
bool BatteryDefender::isDefaultChargeLevel(const int start, const int stop) {
@@ -173,27 +171,53 @@ int32_t BatteryDefender::getTimeToActivate(void) {
(int32_t)ONE_MIN_IN_SECONDS, INT32_MAX);
}
-void BatteryDefender::stateMachine_runAction(const state_E state) {
+void BatteryDefender::stateMachine_runAction(const state_E state,
+ struct android::BatteryProperties *props) {
switch (state) {
case STATE_INIT:
loadPersistentStorage();
+ mWasAcOnline = props->chargerAcOnline;
+ mWasUsbOnline = props->chargerUsbOnline;
break;
case STATE_DISABLED:
case STATE_DISCONNECTED:
clearStateData();
+ mWasAcOnline = false;
+ mWasUsbOnline = false;
break;
case STATE_CONNECTED:
addTimeToChargeTimers();
- if (readFileToInt(kPathBatteryCapacity) == kChargeHighCapacityLevel) {
+ if (props->batteryLevel == kChargeHighCapacityLevel) {
mHasReachedHighCapacityLevel = true;
}
+
+ mWasAcOnline = props->chargerAcOnline;
+ mWasUsbOnline = props->chargerUsbOnline;
break;
case STATE_ACTIVE:
addTimeToChargeTimers();
mTimeActiveSecs += mTimeBetweenUpdateCalls;
+
+ /* Force online if active and still connected to power.
+ * Setting a charge limit below the current charge level may
+ * disable the adapter. This does not occur for wireless adapters.
+ */
+ if (mIsUsbPresent) {
+ /* If both previous fields are incorrectly false, force USB online */
+ if ((mWasAcOnline == false) && (mWasUsbOnline == false)) {
+ props->chargerUsbOnline = true;
+ } else {
+ if (mWasAcOnline) {
+ props->chargerAcOnline = true;
+ }
+ if (mWasUsbOnline) {
+ props->chargerUsbOnline = true;
+ }
+ }
+ }
break;
default:
@@ -259,9 +283,8 @@ BatteryDefender::state_E BatteryDefender::stateMachine_getNextState(const state_
void BatteryDefender::stateMachine_firstAction(const state_E state) {
switch (state) {
case STATE_DISABLED:
- clearStateData();
LOG(INFO) << "Disabled!";
- break;
+ FALLTHROUGH_INTENDED;
case STATE_DISCONNECTED:
clearStateData();
@@ -288,18 +311,22 @@ void BatteryDefender::stateMachine_firstAction(const state_E state) {
}
}
-void BatteryDefender::update(void) {
+void BatteryDefender::update(struct android::BatteryProperties *props) {
+ if (!props) {
+ return;
+ }
+
// Update module inputs
const int chargeLevelVendorStart =
android::base::GetIntProperty(kPropChargeLevelVendorStart, kChargeLevelDefaultStart);
const int chargeLevelVendorStop =
android::base::GetIntProperty(kPropChargeLevelVendorStop, kChargeLevelDefaultStop);
mIsDefenderDisabled = isBatteryDefenderDisabled(chargeLevelVendorStart, chargeLevelVendorStop);
- mIsPowerAvailable = isChargePowerAvailable();
+ mIsPowerAvailable = isChargePowerAvailable(props->chargerWirelessOnline);
mTimeBetweenUpdateCalls = getDeltaTimeSeconds(&mTimePreviousSecs);
// Run state machine
- stateMachine_runAction(mCurrentState);
+ stateMachine_runAction(mCurrentState, props); /* May override battery properties */
const state_E nextState = stateMachine_getNextState(mCurrentState);
if (nextState != mCurrentState) {
stateMachine_firstAction(nextState);
diff --git a/health/include/pixelhealth/BatteryDefender.h b/health/include/pixelhealth/BatteryDefender.h
index 3f9bb1ce..31b410d4 100644
--- a/health/include/pixelhealth/BatteryDefender.h
+++ b/health/include/pixelhealth/BatteryDefender.h
@@ -17,6 +17,8 @@
#ifndef HARDWARE_GOOGLE_PIXEL_HEALTH_BATTERYDEFENDER_H
#define HARDWARE_GOOGLE_PIXEL_HEALTH_BATTERYDEFENDER_H
+#include <batteryservice/BatteryService.h>
+
#include <stdbool.h>
#include <time.h>
#include <string>
@@ -50,7 +52,7 @@ class BatteryDefender {
const int32_t timeToClearTimerSecs = DEFAULT_TIME_TO_CLEAR_SECONDS);
// This function shall be called periodically in HealthService
- void update(void);
+ void update(struct android::BatteryProperties *props);
private:
enum state_E {
@@ -75,9 +77,7 @@ class BatteryDefender {
const int32_t kTimeToClearTimerSecs;
// Sysfs
- const char *const kPathWirelessChargerOnline = "/sys/class/power_supply/wireless/online";
- const char *const kPathWiredChargerPresent = "/sys/class/power_supply/usb/present";
- const char *const kPathBatteryCapacity = "/sys/class/power_supply/battery/capacity";
+ const char *const kPathUSBChargerPresent = "/sys/class/power_supply/usb/present";
const char *const kPathPersistChargerPresentTime =
"/mnt/vendor/persist/battery/defender_charger_time";
const char *const kPathPersistDefenderActiveTime =
@@ -101,6 +101,7 @@ class BatteryDefender {
// Inputs
int64_t mTimeBetweenUpdateCalls = 0;
int64_t mTimePreviousSecs;
+ bool mIsUsbPresent = false;
bool mIsPowerAvailable = false;
bool mIsDefenderDisabled = false;
int32_t mTimeToActivateSecsModified;
@@ -115,10 +116,17 @@ class BatteryDefender {
int mChargeLevelStartPrevious = DEFAULT_CHARGE_LEVEL_START;
int mChargeLevelStopPrevious = DEFAULT_CHARGE_LEVEL_STOP;
bool mHasReachedHighCapacityLevel = false;
+ bool mWasAcOnline = false;
+ bool mWasUsbOnline = false;
+
+ // Process state actions
+ void stateMachine_runAction(const state_E state, struct android::BatteryProperties *props);
+
+ // Check state transitions
+ state_E stateMachine_getNextState(const state_E state);
- void stateMachine_runAction(const state_E state); // Process state actions
- state_E stateMachine_getNextState(const state_E state); // Check transitions
- void stateMachine_firstAction(const state_E state); // Process entry actions
+ // Process state entry actions
+ void stateMachine_firstAction(const state_E state);
void clearStateData(void);
void loadPersistentStorage(void);
@@ -130,7 +138,7 @@ class BatteryDefender {
bool writeIntToFile(const char *path, const int value);
void writeTimeToFile(const char *path, const int value, int64_t *previous);
void writeChargeLevelsToFile(const int vendorStart, const int vendorStop);
- bool isChargePowerAvailable(void);
+ bool isChargePowerAvailable(const bool chargerWirelessOnline);
bool isDefaultChargeLevel(const int start, const int stop);
bool isBatteryDefenderDisabled(const int vendorStart, const int vendorStop);
void addTimeToChargeTimers(void);
diff --git a/health/test/TestBatteryDefender.cpp b/health/test/TestBatteryDefender.cpp
index 5edd4f4d..60a30f11 100644
--- a/health/test/TestBatteryDefender.cpp
+++ b/health/test/TestBatteryDefender.cpp
@@ -104,6 +104,8 @@ using ::testing::InSequence;
using ::testing::Return;
using ::testing::SetArgPointee;
+struct android::BatteryProperties props;
+
class BatteryDefenderTest : public ::testing::Test {
public:
BatteryDefenderTest() {}
@@ -111,6 +113,8 @@ class BatteryDefenderTest : public ::testing::Test {
void SetUp() {
mock = &mockFixture;
+ props = {};
+
EXPECT_CALL(*mock, SetProperty(_, _)).Times(AnyNumber());
EXPECT_CALL(*mock, ReadFileToString(_, _, _)).Times(AnyNumber());
EXPECT_CALL(*mock, GetIntProperty(_, _, _, _)).Times(AnyNumber());
@@ -129,9 +133,7 @@ class BatteryDefenderTest : public ::testing::Test {
HealthInterfaceMock mockFixture;
};
-const char *kPathWirelessChargerOnline = "/sys/class/power_supply/wireless/online";
const char *kPathWiredChargerPresent = "/sys/class/power_supply/usb/present";
-const char *kPathBatteryCapacity = "/sys/class/power_supply/battery/capacity";
const char *kPathPersistChargerPresentTime = "/mnt/vendor/persist/battery/defender_charger_time";
const char *kPathPersistDefenderActiveTime = "/mnt/vendor/persist/battery/defender_active_time";
const char *kPathStartLevel = "/sys/devices/platform/soc/soc:google,charger/charge_start_level";
@@ -149,21 +151,23 @@ static void enableDefender(void) {
ON_CALL(*mock, GetBoolProperty(kPropBatteryDefenderDisable, _)).WillByDefault(Return(false));
}
-static void powerAvailable(void) {
- ON_CALL(*mock, ReadFileToString(kPathWirelessChargerOnline, _, _))
- .WillByDefault(DoAll(SetArgPointee<1>(std::string("1")), Return(true)));
+static void usbPresent(void) {
ON_CALL(*mock, ReadFileToString(kPathWiredChargerPresent, _, _))
.WillByDefault(DoAll(SetArgPointee<1>(std::string("1")), Return(true)));
}
+static void powerAvailable(void) {
+ props.chargerWirelessOnline = 1;
+ usbPresent();
+}
+
static void defaultThreshold(void) {
ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderThreshold, _, _, _))
.WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
}
static void capacityReached(void) {
- ON_CALL(*mock, ReadFileToString(kPathBatteryCapacity, _, _))
- .WillByDefault(DoAll(SetArgPointee<1>(std::to_string(100)), Return(true)));
+ props.batteryLevel = 100;
}
static void initToConnectedCapacityReached(void) {
@@ -186,7 +190,7 @@ TEST_F(BatteryDefenderTest, EnableAndDisconnected) {
// Enable Battery Defender
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "DISCONNECTED"));
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, DisableNonDefaultLevels) {
@@ -197,7 +201,7 @@ TEST_F(BatteryDefenderTest, DisableNonDefaultLevels) {
EXPECT_CALL(*mock, GetIntProperty(kPropChargeLevelVendorStop, _, _, _)).WillOnce(Return(35));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "DISABLED"));
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, DisableExplicit) {
@@ -207,7 +211,7 @@ TEST_F(BatteryDefenderTest, DisableExplicit) {
EXPECT_CALL(*mock, GetBoolProperty(kPropBatteryDefenderDisable, _)).WillOnce(Return(true));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "DISABLED"));
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, InitActive) {
@@ -221,7 +225,7 @@ TEST_F(BatteryDefenderTest, InitActive) {
.WillOnce(DoAll(SetArgPointee<1>(std::to_string(DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1)),
Return(true)));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE"));
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, InitConnectedCapacityReached) {
@@ -237,14 +241,14 @@ TEST_F(BatteryDefenderTest, InitConnectedCapacityReached) {
EXPECT_CALL(*mock, ReadFileToString(kPathPersistChargerPresentTime, _, _))
.WillOnce(DoAll(SetArgPointee<1>(std::to_string(time_expected)), Return(true)));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
- battDefender.update();
+ battDefender.update(&props);
testvar_systemTimeSecs += MIN_TIME_BETWEEN_FILE_UPDATES;
time_expected = DEFAULT_TIME_TO_ACTIVATE_SECONDS - 1 + MIN_TIME_BETWEEN_FILE_UPDATES;
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(time_expected),
kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE"));
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, InitConnected) {
@@ -259,12 +263,12 @@ TEST_F(BatteryDefenderTest, InitConnected) {
EXPECT_CALL(*mock, ReadFileToString(kPathPersistChargerPresentTime, _, _))
.WillOnce(DoAll(SetArgPointee<1>(std::to_string(0)), Return(true)));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
- battDefender.update();
+ battDefender.update(&props);
// mHasReachedHighCapacityLevel shall be false
testvar_systemTimeSecs += DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1;
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, TriggerTime) {
@@ -278,27 +282,26 @@ TEST_F(BatteryDefenderTest, TriggerTime) {
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += MIN_TIME_BETWEEN_FILE_UPDATES;
- battDefender.update();
+ battDefender.update(&props);
// Reached 100% capacity at least once
- EXPECT_CALL(*mock, ReadFileToString(kPathBatteryCapacity, _, _))
- .WillOnce(DoAll(SetArgPointee<1>(std::to_string(100)), Return(true)));
+ capacityReached();
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += MIN_TIME_BETWEEN_FILE_UPDATES;
- battDefender.update();
+ battDefender.update(&props);
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(DEFAULT_TIME_TO_ACTIVATE_SECONDS),
kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += DEFAULT_TIME_TO_ACTIVATE_SECONDS;
- battDefender.update();
+ battDefender.update(&props);
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(DEFAULT_TIME_TO_ACTIVATE_SECONDS +
MIN_TIME_BETWEEN_FILE_UPDATES),
kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE"));
testvar_systemTimeSecs += MIN_TIME_BETWEEN_FILE_UPDATES;
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, ChargeLevels) {
@@ -314,13 +317,13 @@ TEST_F(BatteryDefenderTest, ChargeLevels) {
// No expectations needed; default values already set
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += 0;
- battDefender.update();
+ battDefender.update(&props);
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(60), kPathStartLevel, _));
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(70), kPathStopLevel, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE"));
testvar_systemTimeSecs += DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1;
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, ActiveTime) {
@@ -336,7 +339,7 @@ TEST_F(BatteryDefenderTest, ActiveTime) {
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(60), kPathStartLevel, _));
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(70), kPathStopLevel, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE"));
- battDefender.update();
+ battDefender.update(&props);
}
TEST_F(BatteryDefenderTest, ConnectDisconnectCycle) {
@@ -349,57 +352,262 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectCycle) {
InSequence s;
// Power ON
- ON_CALL(*mock, ReadFileToString(kPathWirelessChargerOnline, _, _))
- .WillByDefault(DoAll(SetArgPointee<1>(std::string("1")), Return(true)));
+ props.chargerWirelessOnline = true;
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(1000), kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += 60;
- battDefender.update();
+ battDefender.update(&props);
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(1060), kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += 60;
- battDefender.update();
+ battDefender.update(&props);
// Power OFF
- ON_CALL(*mock, ReadFileToString(kPathWirelessChargerOnline, _, _))
- .WillByDefault(DoAll(SetArgPointee<1>(std::string("0")), Return(true)));
+ props.chargerWirelessOnline = false;
// Maintain kPathPersistChargerPresentTime = 1060
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += 60;
- battDefender.update();
+ battDefender.update(&props);
// Maintain kPathPersistChargerPresentTime = 1060
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += 60 * 4;
- battDefender.update();
+ battDefender.update(&props);
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(0), kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "DISCONNECTED"));
testvar_systemTimeSecs += MIN_TIME_BETWEEN_FILE_UPDATES;
- battDefender.update();
+ battDefender.update(&props);
// Power ON
- ON_CALL(*mock, ReadFileToString(kPathWirelessChargerOnline, _, _))
- .WillByDefault(DoAll(SetArgPointee<1>(std::string("1")), Return(true)));
+ props.chargerWirelessOnline = true;
// Maintain kPathPersistChargerPresentTime = 0
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += 60;
- battDefender.update();
+ battDefender.update(&props);
capacityReached();
// Maintain kPathPersistChargerPresentTime = 0
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += 60;
- battDefender.update();
+ battDefender.update(&props);
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(60), kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
testvar_systemTimeSecs += 60;
- battDefender.update();
+ battDefender.update(&props);
+}
+
+TEST_F(BatteryDefenderTest, PropsOverride_InitActive_allOnlineFalse) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ usbPresent();
+ defaultThreshold();
+ initToActive();
+
+ InSequence s;
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2);
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, false);
+ ASSERT_EQ(props.chargerUsbOnline, false);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, false);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+}
+
+TEST_F(BatteryDefenderTest, PropsOverride_InitActive_usbOnline) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ usbPresent();
+ defaultThreshold();
+ initToActive();
+
+ InSequence s;
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = true;
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2);
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, false);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, false);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+}
+
+TEST_F(BatteryDefenderTest, PropsOverride_InitActive_acOnline) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ usbPresent();
+ defaultThreshold();
+ initToActive();
+
+ InSequence s;
+
+ props.chargerAcOnline = true;
+ props.chargerUsbOnline = false;
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2);
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, true);
+ ASSERT_EQ(props.chargerUsbOnline, false);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, true);
+ ASSERT_EQ(props.chargerUsbOnline, false);
+}
+
+TEST_F(BatteryDefenderTest, PropsOverride_InitActive_allOnline) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ usbPresent();
+ defaultThreshold();
+ initToActive();
+
+ InSequence s;
+
+ props.chargerAcOnline = true;
+ props.chargerUsbOnline = true;
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2);
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, true);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, true);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+}
+
+TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_allOnlineFalse) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ usbPresent();
+ defaultThreshold();
+ initToConnectedCapacityReached();
+
+ InSequence s;
+
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
+ battDefender.update(&props);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ testvar_systemTimeSecs += DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1;
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2);
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, false);
+ ASSERT_EQ(props.chargerUsbOnline, false);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, false);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+}
+
+TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_usbOnline) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ usbPresent();
+ defaultThreshold();
+ initToConnectedCapacityReached();
+
+ InSequence s;
+
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
+ battDefender.update(&props);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = true;
+ testvar_systemTimeSecs += DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1;
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2);
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, false);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, false);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+}
+
+TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_acOnline) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ usbPresent();
+ defaultThreshold();
+ initToConnectedCapacityReached();
+
+ InSequence s;
+
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
+ battDefender.update(&props);
+
+ props.chargerAcOnline = true;
+ props.chargerUsbOnline = false;
+ testvar_systemTimeSecs += DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1;
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2);
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, true);
+ ASSERT_EQ(props.chargerUsbOnline, false);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, true);
+ ASSERT_EQ(props.chargerUsbOnline, false);
+}
+
+TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_allOnline) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ usbPresent();
+ defaultThreshold();
+ initToConnectedCapacityReached();
+
+ InSequence s;
+
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
+ battDefender.update(&props);
+
+ props.chargerAcOnline = true;
+ props.chargerUsbOnline = true;
+ testvar_systemTimeSecs += DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1;
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2);
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, true);
+ ASSERT_EQ(props.chargerUsbOnline, true);
+
+ props.chargerAcOnline = false;
+ props.chargerUsbOnline = false;
+ battDefender.update(&props);
+ ASSERT_EQ(props.chargerAcOnline, true);
+ ASSERT_EQ(props.chargerUsbOnline, true);
}
} // namespace health