blob: 790ead61b1e9586bfd80838ed0e375fa40dbe139 [file] [log] [blame]
// Copyright 2015 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.
#include <map>
#include <string>
#include <utility>
#include <vector>
#include "gtest/gtest.h"
#include "thermald/thermal_state_engine.h"
#include "thermald/thermal_zone.h"
using std::make_pair;
using std::string;
using std::vector;
namespace thermald {
static const char *kTemp0Name = "temperature 0";
static const char *kTemp1Name = "temperature 1";
static const int kSt2S0ActThld = 60000;
static const int kSt2S0BotThld = 55000;
static const int kSt2S1ActThld = 70000;
static const int kSt2S1BotThld = 65000;
static const int kSt3S0ActThld = 70000;
static const int kSt3S0BotThld = 65000;
static const int kSt3S1ActThld = 80000;
static const int kSt3S1BotThld = 75000;
static const int kSt4S0ActThld = 80000;
static const int kSt4S0BotThld = 75000;
static const int kSt4S1ActThld = kTempInfinite; // No activation threshold
static const int kSt4S1BotThld = kTemp0K; // No bottom threshold
static const int kSt5S0ActThld = 90000;
static const int kSt5S0BotThld = 85000;
static const int kSt5S1ActThld = 100000;
static const int kSt5S1BotThld = 95000;
// Test case for ThermalStateEngine monitoring a single temperature.
class ThermalStateEngineSingleTemperatureTest : public testing::Test {
protected:
ThermalStateEngineSingleTemperatureTest() : state_engine_(&thermal_zone_) {}
static void SetUpTestCase();
static void AddThermalState(int state_id, int activation_threshold,
int bottom_threshold);
static ThermalZone thermal_zone_;
ThermalStateEngine state_engine_;
};
class ThermalStateEngineSingleTemperatureInitialTransitionTest :
public ThermalStateEngineSingleTemperatureTest {};
ThermalZone ThermalStateEngineSingleTemperatureTest::thermal_zone_;
void ThermalStateEngineSingleTemperatureTest::AddThermalState(
int state_id, int activation_threshold, int bottom_threshold) {
std::unique_ptr<ThermalState> state = std::make_unique<ThermalState>();
ThermalPointThresholds thresholds;
state->id = state_id;
thresholds.activation = activation_threshold;
thresholds.bottom = bottom_threshold;
state->thresholds.insert(make_pair(kTemp0Name, thresholds));
thermal_zone_.states.push_back(std::move(state));
}
void ThermalStateEngineSingleTemperatureTest::SetUpTestCase() {
thermal_zone_.name = "single temp zone";
// Set up from higher to lower criticality/temperatures.
AddThermalState(3, kSt3S0ActThld, kSt3S0BotThld);
AddThermalState(2, kSt2S0ActThld, kSt2S0BotThld);
AddThermalState(1, kTemp0K, kTemp0K);
}
// Verify for the initial transition that the lowest temperature state is
// entered if the temperature is below the activation threshold of the next
// state.
TEST_F(ThermalStateEngineSingleTemperatureInitialTransitionTest,
TemperatureBelowActivationThresholdOfSecondState) {
bool rc;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
ASSERT_TRUE(rc);
EXPECT_EQ(1, state_engine_.current_state().id);
}
// Verify for the initial transition that an intermediate state is entered if
// the temperature is at the activation threshold of the state.
TEST_F(ThermalStateEngineSingleTemperatureInitialTransitionTest,
TemperatureAtActivationThreshold) {
bool rc;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
ASSERT_TRUE(rc);
EXPECT_EQ(2, state_engine_.current_state().id);
}
// Verify for the initial transition that an intermediate state is entered if
// the temperature is above the activation threshold of the state and below the
// activation threshold of the next state.
TEST_F(ThermalStateEngineSingleTemperatureInitialTransitionTest,
TemperatureAboveActivationThreshold) {
bool rc;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld - 1);
ASSERT_TRUE(rc);
EXPECT_EQ(2, state_engine_.current_state().id);
}
// Verify for the initial transition that the highest temperature state is
// entered if the temperature is at the activation threshold of the state.
TEST_F(ThermalStateEngineSingleTemperatureInitialTransitionTest,
TemperatureAtActivationThresholdOfHighestState) {
bool rc;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
ASSERT_TRUE(rc);
EXPECT_EQ(3, state_engine_.current_state().id);
}
// Verify for the initial transition that the highest temperature state is
// entered if the temperature is above the activation threshold of the state.
TEST_F(ThermalStateEngineSingleTemperatureInitialTransitionTest,
TemperatureAboveActivationThresholdOfHighestState) {
bool rc;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name,
kSt3S0ActThld + 5000);
ASSERT_TRUE(rc);
EXPECT_EQ(3, state_engine_.current_state().id);
}
// Verify that no transition to a higher state occurs when the temperature is
// just below the activation threshold of the higher state state.
TEST_F(ThermalStateEngineSingleTemperatureTest,
TemperatureJustBelowActivationThreshold) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld - 1);
ASSERT_EQ(2, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(2, state_engine_.current_state().id);
}
// Verify that no transition to a lower state occurs when the temperature is
// just above the bottom threshold of the current state.
TEST_F(ThermalStateEngineSingleTemperatureTest,
TemperatureJustAboveBottomThreshold) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0BotThld + 1);
ASSERT_EQ(2, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(2, state_engine_.current_state().id);
}
// Verify that a higher state is entered when the temperature is at the
// activation threshold of the state.
TEST_F(ThermalStateEngineSingleTemperatureTest,
TemperatureRisesToActivationThreshold) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
ASSERT_EQ(1, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(2, state_engine_.current_state().id);
}
// Verify that a higher state is entered when the temperature is above the
// activation threshold of the state.
TEST_F(ThermalStateEngineSingleTemperatureTest,
TemperatureRisesAboveActivationThreshold) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name,
kSt2S0ActThld + 1000);
ASSERT_EQ(1, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(2, state_engine_.current_state().id);
}
// Verify that a lower state is entered when the temperature is at the bottom
// threshold of the current state.
TEST_F(ThermalStateEngineSingleTemperatureTest,
TemperatureDropsToBottomThreshold) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0BotThld);
ASSERT_EQ(3, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(2, state_engine_.current_state().id);
}
// Verify that a lower state is entered when the temperature is below
// the bottom threshold of the current state.
TEST_F(ThermalStateEngineSingleTemperatureTest,
TemperatureDropsBelowBottomThreshold) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0BotThld - 1);
ASSERT_EQ(3, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(2, state_engine_.current_state().id);
}
// Verify [cur_state + 2] is entered directly when the activation
// threshold of that state is reached.
TEST_F(ThermalStateEngineSingleTemperatureTest,
SuddenTemperatureRise) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
ASSERT_EQ(1, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(3, state_engine_.current_state().id);
}
// Verify [cur_state - 2] is entered directly when the bottom threshold
// of [cur_state - 1] is reached.
TEST_F(ThermalStateEngineSingleTemperatureTest,
SuddenTemperatureDrop) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0BotThld);
ASSERT_EQ(3, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(1, state_engine_.current_state().id);
}
// Verify that the lowest state is active at a very low temperature.
TEST_F(ThermalStateEngineSingleTemperatureTest,
VeryLowTemperature) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld - 1);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, -260000);
ASSERT_EQ(2, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(1, state_engine_.current_state().id);
}
// Test case for ThermalStateEngine monitoring multiple temperatures.
class ThermalStateEngineMultipleTemperaturesTest : public testing::Test {
protected:
ThermalStateEngineMultipleTemperaturesTest()
: state_engine_(&thermal_zone_) {}
static void SetUpTestCase();
static void AddThermalState(int state_id,
int activation_threshold_0,
int bottom_threshold_0,
int activation_threshold_1,
int bottom_threshold_1);
static ThermalZone thermal_zone_;
ThermalStateEngine state_engine_;
};
class ThermalStateEngineMultipleTemperaturesInitialTransitionTest :
public ThermalStateEngineMultipleTemperaturesTest {};
class ThermalStateEngineMultipleTemperaturesNoThresholdsTest :
public ThermalStateEngineMultipleTemperaturesTest {};
ThermalZone ThermalStateEngineMultipleTemperaturesTest::thermal_zone_;
void ThermalStateEngineMultipleTemperaturesTest::AddThermalState(
int state_id,
int activation_threshold_0, int bottom_threshold_0,
int activation_threshold_1, int bottom_threshold_1) {
std::unique_ptr<ThermalState> state = std::make_unique<ThermalState>();
ThermalPointThresholds thresholds;
state->id = state_id;
thresholds.activation = activation_threshold_0;
thresholds.bottom = bottom_threshold_0;
state->thresholds.insert(make_pair(kTemp0Name, thresholds));
thresholds.activation = activation_threshold_1;
thresholds.bottom = bottom_threshold_1;
state->thresholds.insert(make_pair(kTemp1Name, thresholds));
thermal_zone_.states.push_back(std::move(state));
}
void ThermalStateEngineMultipleTemperaturesTest::SetUpTestCase() {
thermal_zone_.name = "multi temp zone";
// Set up from higher to lower criticality/temperatures.
AddThermalState(5, kSt5S0ActThld, kSt5S0BotThld, kSt5S1ActThld,
kSt5S1BotThld);
AddThermalState(4, kSt4S0ActThld, kSt4S0BotThld, kSt4S1ActThld,
kSt4S1BotThld);
AddThermalState(3, kSt3S0ActThld, kSt3S0BotThld, kSt3S1ActThld,
kSt3S1BotThld);
AddThermalState(2, kSt2S0ActThld, kSt2S0BotThld, kSt2S1ActThld,
kSt2S1BotThld);
AddThermalState(1, kTemp0K, kTemp0K, kTemp0K, kTemp0K);
}
// Verify for the initial transition that the lowest temperature state is
// entered when the first reported temperature is below the activation
// threshold of the next state.
TEST_F(ThermalStateEngineMultipleTemperaturesInitialTransitionTest,
TemperatureBelowActivationThresholdOfSecondState) {
bool rc;
rc = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld - 1);
ASSERT_TRUE(rc);
EXPECT_EQ(1, state_engine_.current_state().id);
}
// Verify for the initial transition that a the correct thermal state is entered
// when the first reported temperature is at the activation threshold of the
// state (not the lowest temperature state).
TEST_F(ThermalStateEngineMultipleTemperaturesInitialTransitionTest,
TemperatureAtActivationThreshold) {
bool rc;
rc = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld);
ASSERT_TRUE(rc);
EXPECT_EQ(2, state_engine_.current_state().id);
}
// Verify for the initial transitions that the lowest temperature state is
// active when all temperatures are below the activation threshold of the next
// state.
TEST_F(ThermalStateEngineMultipleTemperaturesInitialTransitionTest,
AllTemperaturesBelowActivationThresholdsOfSecondState) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld - 1);
ASSERT_EQ(1, initial_state);
ASSERT_TRUE(rc);
EXPECT_EQ(1, state_engine_.current_state().id);
}
// Verify that a temperature without any readings is treated as a
// very low temperature.
TEST_F(ThermalStateEngineMultipleTemperaturesTest,
TreatsUnkownTemperatureAsVeryLow) {
bool rc[3];
int state[2];
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
initial_state = state_engine_.current_state().id;
rc[0] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
state[0] = state_engine_.current_state().id;
rc[1] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
state[1] = state_engine_.current_state().id;
rc[2] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0BotThld);
ASSERT_EQ(1, initial_state);
ASSERT_TRUE(rc[0]);
ASSERT_EQ(2, state[0]);
ASSERT_TRUE(rc[1]);
ASSERT_EQ(3, state[1]);
ASSERT_TRUE(rc[2]);
ASSERT_EQ(2, state_engine_.current_state().id);
}
// Verify that a thermal state is entered when one of the temperatures
// reaches the activation threshold of that state.
TEST_F(ThermalStateEngineMultipleTemperaturesTest,
SingleTemperatureAtActivationThreshold) {
bool rc;
int initial_state;
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
initial_state = state_engine_.current_state().id;
rc = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld);
ASSERT_EQ(1, initial_state);
ASSERT_TRUE(rc);
EXPECT_EQ(2, state_engine_.current_state().id);
}
// Verify that a lower thermal state is entered only when all temperatures
// which were at/above the activation threshold of the current state reach
// the bottom threshold of the current state.
TEST_F(ThermalStateEngineMultipleTemperaturesTest,
AllBottomThresholdsMustBeReached) {
int initial_state;
bool rc[7];
int state[6];
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld);
initial_state = state_engine_.current_state().id;
// Temperature 0 just above bottom threshold.
rc[0] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0BotThld + 1);
state[0] = state_engine_.current_state().id;
// Temperature 1 just above bottom threshold.
rc[1] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1BotThld + 1);
state[1] = state_engine_.current_state().id;
// Temperature 0 reaches bottom threshold.
rc[2] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0BotThld);
state[2] = state_engine_.current_state().id;
// Temperature 1 reaches bottom threshold => state 1.
rc[3] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1BotThld);
state[3] = state_engine_.current_state().id;
// Only one of the temperatures exceeds activation threshold.
// Temperature 1 reaches state 2 activation threshold again.
rc[4] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld);
state[4] = state_engine_.current_state().id;
// Temperature 1 just above bottom threshold.
rc[5] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1BotThld + 1);
state[5] = state_engine_.current_state().id;
// Temperature 1 reaches bottom threshold => state 1.
rc[6] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1BotThld);
ASSERT_EQ(2, initial_state);
ASSERT_TRUE(rc[0]);
ASSERT_EQ(2, state[0]);
ASSERT_TRUE(rc[1]);
ASSERT_EQ(2, state[1]);
ASSERT_TRUE(rc[2]);
ASSERT_EQ(2, state[2]);
ASSERT_TRUE(rc[3]);
ASSERT_EQ(1, state[3]);
ASSERT_TRUE(rc[4]);
ASSERT_EQ(2, state[4]);
ASSERT_TRUE(rc[5]);
ASSERT_EQ(2, state[5]);
ASSERT_TRUE(rc[6]);
ASSERT_EQ(1, state_engine_.current_state().id);
}
// Verify that for a transition to a lower state it is sufficient that a
// temperature reaches the bottom threshold of the active state once, it
// may rise afterwards above the threshold as long as it stays below the
// activation threshold of the current state.
TEST_F(ThermalStateEngineMultipleTemperaturesTest,
TemperatureRisesAgainAboveBottomThreshold) {
int initial_state;
bool rc[3];
int state[2];
// Start in state 2, with both temperatures >= activation threshold.
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld);
initial_state = state_engine_.current_state().id;
// Temperature 0 reaches bottom threshold.
rc[0] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0BotThld);
state[0] = state_engine_.current_state().id;
// Temperature 0 rises again, but stays below the activation threshold of
// state 2.
rc[1] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
state[1] = state_engine_.current_state().id;
// Temperature 1 reaches bottom threshold => state 1.
rc[2] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1BotThld);
ASSERT_EQ(2, initial_state);
ASSERT_TRUE(rc[0]);
ASSERT_EQ(2, state[0]);
ASSERT_TRUE(rc[1]);
ASSERT_EQ(2, state[1]);
ASSERT_TRUE(rc[2]);
ASSERT_EQ(1, state_engine_.current_state().id);
}
// Verify that for a transition to a lower state a temperature need to reach
// the bottom threshold again if it rose to the activation threshold after
// the prior drop to the bottom threshold.
TEST_F(ThermalStateEngineMultipleTemperaturesTest,
TemperatureRisesToActivationThresholdAfterReachingBottomThreshold) {
int initial_state;
bool rc[4];
int state[3];
// Start in state 2, with both temperatures at/above activation threshold.
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld);
initial_state = state_engine_.current_state().id;
// Temperature 0 reaches bottom threshold.
rc[0] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0BotThld);
state[0] = state_engine_.current_state().id;
// Temperature 0 rises to the activation threshold.
rc[1] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
state[1] = state_engine_.current_state().id;
// Temperature 1 reaches bottom threshold.
rc[2] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1BotThld);
state[2] = state_engine_.current_state().id;
// Temperature 0 reaches the bottom threshold again => state 1.
rc[3] =state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0BotThld);
ASSERT_EQ(2, initial_state);
ASSERT_TRUE(rc[0]);
ASSERT_EQ(2, state[0]);
ASSERT_TRUE(rc[1]);
ASSERT_EQ(2, state[1]);
ASSERT_TRUE(rc[2]);
ASSERT_EQ(2, state[2]);
ASSERT_TRUE(rc[3]);
ASSERT_EQ(1, state_engine_.current_state().id);
}
// Verify [cur_state + 2] is entered directly when an activation
// threshold of that state is reached.
TEST_F(ThermalStateEngineMultipleTemperaturesTest,
SuddenTemperatureRise) {
bool rc;
int initial_state;
// Start in state 1.
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld - 1);
state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld - 1);
initial_state = state_engine_.current_state().id;
// Temperature 0 at activation threshold of state 3 => state 3.
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
ASSERT_EQ(1, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(3, state_engine_.current_state().id);
}
// Verify [cur_state - 2] is entered directly when all temperatures
// have reached the bottom thresholds of [cur_state - 1].
TEST_F(ThermalStateEngineMultipleTemperaturesTest,
SuddenTemperatureDrop) {
int initial_state;
bool rc[2];
int state[2];
// Start in state 3 with both temperatures >= activation threshold.
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt3S1ActThld);
initial_state = state_engine_.current_state().id;
// First temperature reaches bottom threshold.
rc[0] = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0BotThld);
state[0] = state_engine_.current_state().id;
// Second temperature reaches bottom threshold => state 1.
rc[1] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1BotThld);
state[1] = state_engine_.current_state().id;
ASSERT_EQ(3, initial_state);
ASSERT_TRUE(rc[0]);
ASSERT_EQ(3, state[0]);
ASSERT_TRUE(rc[1]);
ASSERT_EQ(1, state[1]);
}
// Verify that a thermal state without thresholds for a temperature is
// skipped upon changes of only this temperature.
TEST_F(ThermalStateEngineMultipleTemperaturesNoThresholdsTest,
SkipsStateWithoutThresholds) {
int initial_state;
bool rc[3];
int state[2];
// Start in state 2, with both temperatures >= activation threshold.
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt2S0ActThld);
state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt2S1ActThld);
initial_state = state_engine_.current_state().id;
// Temperature 1 just below the activation threshold of state 5 => state 3.
rc[0] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt5S1ActThld - 1);
state[0] = state_engine_.current_state().id;
// Temperature 1 reaches activation threshold of state 5 => state 5.
rc[1] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt5S1ActThld);
state[1] = state_engine_.current_state().id;
// Temperature 1 reaches bottom threshold of state 5 => state 3.
rc[2] = state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt5S1BotThld);
ASSERT_EQ(2, initial_state);
ASSERT_TRUE(rc[0]);
ASSERT_EQ(3, state[0]);
ASSERT_TRUE(rc[1]);
ASSERT_EQ(5, state[1]);
ASSERT_TRUE(rc[2]);
ASSERT_EQ(3, state_engine_.current_state().id);
}
// Verify that a thermal state without thresholds for a temperature is
// entered when the activation thresholds of other temperatures are
// reached.
TEST_F(ThermalStateEngineMultipleTemperaturesNoThresholdsTest,
OtherTemperatureReachesActivationThreshold) {
bool rc;
int initial_state;
// Start in state 3 with both temperatures >= activation threshold.
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt3S0ActThld);
state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt3S1ActThld);
initial_state = state_engine_.current_state().id;
// Temperature 0 reaches activation threshold of state 4 => state 4.
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt4S0ActThld);
ASSERT_EQ(3, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(4, state_engine_.current_state().id);
}
// Verify that a thermal state without thresholds for a temperature is
// left when the bottom thresholds of other temperatures are reached.
TEST_F(ThermalStateEngineMultipleTemperaturesNoThresholdsTest,
OtherTemperatureReachesBottomThreshold) {
bool rc;
int initial_state;
// Start in state 4, with temperature 0 at activation threshold and
// temperature 1 at the activation thresold of state 3.
state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt4S0ActThld);
state_engine_.ProcessTemperatureUpdate(kTemp1Name, kSt3S1ActThld);
initial_state = state_engine_.current_state().id;
// Temperature 0 reaches bottom threshold of state 4 => state 3.
rc = state_engine_.ProcessTemperatureUpdate(kTemp0Name, kSt4S0BotThld);
ASSERT_EQ(4, initial_state);
ASSERT_TRUE(rc);
ASSERT_EQ(3, state_engine_.current_state().id);
}
} // thermald