Merge "Change SimplePredicate InitialValue default to UNKNOWN" into rvc-dev

This commit is contained in:
Christine Tsai
2020-05-19 20:30:00 +00:00
committed by Android (Google) Code Review
8 changed files with 290 additions and 22 deletions

View File

@@ -307,9 +307,6 @@ private:
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsWithActivation);
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsNoCondition);
FRIEND_TEST(GaugeMetricE2eTest, TestConditionChangeToTrueSamplePulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_single_bucket);
FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_multiple_buckets);
@@ -328,6 +325,7 @@ private:
FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithSameDeactivation);
FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations);
FRIEND_TEST(CountMetricE2eTest, TestInitialConditionChanges);
FRIEND_TEST(CountMetricE2eTest, TestSlicedState);
FRIEND_TEST(CountMetricE2eTest, TestSlicedStateWithMap);
FRIEND_TEST(CountMetricE2eTest, TestMultipleSlicedStates);
@@ -345,6 +343,10 @@ private:
FRIEND_TEST(DurationMetricE2eTest, TestSlicedStatePrimaryFieldsNotSubsetDimInWhat);
FRIEND_TEST(DurationMetricE2eTest, TestWithSlicedStatePrimaryFieldsSubset);
FRIEND_TEST(ValueMetricE2eTest, TestInitialConditionChanges);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState);
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState_WithDimensions);
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState_WithIncorrectDimensions);

View File

@@ -459,6 +459,7 @@ protected:
FRIEND_TEST(CountMetricE2eTest, TestSlicedStateWithMap);
FRIEND_TEST(CountMetricE2eTest, TestMultipleSlicedStates);
FRIEND_TEST(CountMetricE2eTest, TestSlicedStateWithPrimaryFields);
FRIEND_TEST(CountMetricE2eTest, TestInitialConditionChanges);
FRIEND_TEST(DurationMetricE2eTest, TestOneBucket);
FRIEND_TEST(DurationMetricE2eTest, TestTwoBuckets);
@@ -488,6 +489,7 @@ protected:
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState);
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState_WithDimensions);
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState_WithIncorrectDimensions);
FRIEND_TEST(ValueMetricE2eTest, TestInitialConditionChanges);
};
} // namespace statsd

View File

@@ -292,9 +292,6 @@ private:
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsWithActivation);
FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsNoCondition);
FRIEND_TEST(GaugeMetricE2eTest, TestConditionChangeToTrueSamplePulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_single_bucket);
FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_multiple_buckets);
@@ -322,6 +319,7 @@ private:
TestActivationOnBootMultipleActivationsDifferentActivationTypes);
FRIEND_TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart);
FRIEND_TEST(CountMetricE2eTest, TestInitialConditionChanges);
FRIEND_TEST(CountMetricE2eTest, TestSlicedState);
FRIEND_TEST(CountMetricE2eTest, TestSlicedStateWithMap);
FRIEND_TEST(CountMetricE2eTest, TestMultipleSlicedStates);
@@ -339,6 +337,10 @@ private:
FRIEND_TEST(DurationMetricE2eTest, TestWithSlicedStatePrimaryFieldsSuperset);
FRIEND_TEST(DurationMetricE2eTest, TestWithSlicedStatePrimaryFieldsSubset);
FRIEND_TEST(ValueMetricE2eTest, TestInitialConditionChanges);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState);
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState_WithDimensions);
FRIEND_TEST(ValueMetricE2eTest, TestInitWithSlicedState_WithIncorrectDimensions);

View File

@@ -131,7 +131,7 @@ message SimplePredicate {
UNKNOWN = 0;
FALSE = 1;
}
optional InitialValue initial_value = 5 [default = FALSE];
optional InitialValue initial_value = 5 [default = UNKNOWN];
optional FieldMatcher dimensions = 6;
}

View File

@@ -27,6 +27,92 @@ namespace statsd {
#ifdef __ANDROID__
/**
* Tests the initial condition and condition after the first log events for
* count metrics with either a combination condition or simple condition.
*
* Metrics should be initialized with condition kUnknown (given that the
* predicate is using the default InitialValue of UNKNOWN). The condition should
* be updated to either kFalse or kTrue if a condition event is logged for all
* children conditions.
*/
TEST(CountMetricE2eTest, TestInitialConditionChanges) {
// Initialize config.
StatsdConfig config;
config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
config.add_default_pull_packages("AID_ROOT"); // Fake puller is registered with root.
auto syncStartMatcher = CreateSyncStartAtomMatcher();
*config.add_atom_matcher() = syncStartMatcher;
*config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher();
*config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher();
*config.add_atom_matcher() = CreateBatteryStateNoneMatcher();
*config.add_atom_matcher() = CreateBatteryStateUsbMatcher();
auto screenOnPredicate = CreateScreenIsOnPredicate();
*config.add_predicate() = screenOnPredicate;
auto deviceUnpluggedPredicate = CreateDeviceUnpluggedPredicate();
*config.add_predicate() = deviceUnpluggedPredicate;
auto screenOnOnBatteryPredicate = config.add_predicate();
screenOnOnBatteryPredicate->set_id(StringToId("screenOnOnBatteryPredicate"));
screenOnOnBatteryPredicate->mutable_combination()->set_operation(LogicalOperation::AND);
addPredicateToPredicateCombination(screenOnPredicate, screenOnOnBatteryPredicate);
addPredicateToPredicateCombination(deviceUnpluggedPredicate, screenOnOnBatteryPredicate);
// CountSyncStartWhileScreenOnOnBattery (CombinationCondition)
CountMetric* countMetric1 = config.add_count_metric();
countMetric1->set_id(StringToId("CountSyncStartWhileScreenOnOnBattery"));
countMetric1->set_what(syncStartMatcher.id());
countMetric1->set_condition(screenOnOnBatteryPredicate->id());
countMetric1->set_bucket(FIVE_MINUTES);
// CountSyncStartWhileOnBattery (SimpleCondition)
CountMetric* countMetric2 = config.add_count_metric();
countMetric2->set_id(StringToId("CountSyncStartWhileOnBatterySliceScreen"));
countMetric2->set_what(syncStartMatcher.id());
countMetric2->set_condition(deviceUnpluggedPredicate.id());
countMetric2->set_bucket(FIVE_MINUTES);
const uint64_t bucketStartTimeNs = 10000000000; // 0:10
const uint64_t bucketSizeNs =
TimeUnitToBucketSizeInMillis(config.count_metric(0).bucket()) * 1000000LL;
int uid = 12345;
int64_t cfgId = 98765;
ConfigKey cfgKey(uid, cfgId);
auto processor = CreateStatsLogProcessor(bucketStartTimeNs, bucketStartTimeNs, config, cfgKey);
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
sp<MetricsManager> metricsManager = processor->mMetricsManagers.begin()->second;
EXPECT_TRUE(metricsManager->isConfigValid());
EXPECT_EQ(2, metricsManager->mAllMetricProducers.size());
sp<MetricProducer> metricProducer1 = metricsManager->mAllMetricProducers[0];
sp<MetricProducer> metricProducer2 = metricsManager->mAllMetricProducers[1];
EXPECT_EQ(ConditionState::kUnknown, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kUnknown, metricProducer2->mCondition);
auto screenOnEvent =
CreateScreenStateChangedEvent(bucketStartTimeNs + 30, android::view::DISPLAY_STATE_ON);
processor->OnLogEvent(screenOnEvent.get());
EXPECT_EQ(ConditionState::kUnknown, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kUnknown, metricProducer2->mCondition);
auto pluggedUsbEvent = CreateBatteryStateChangedEvent(
bucketStartTimeNs + 50, BatteryPluggedStateEnum::BATTERY_PLUGGED_USB);
processor->OnLogEvent(pluggedUsbEvent.get());
EXPECT_EQ(ConditionState::kFalse, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kFalse, metricProducer2->mCondition);
auto pluggedNoneEvent = CreateBatteryStateChangedEvent(
bucketStartTimeNs + 70, BatteryPluggedStateEnum::BATTERY_PLUGGED_NONE);
processor->OnLogEvent(pluggedNoneEvent.get());
EXPECT_EQ(ConditionState::kTrue, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kTrue, metricProducer2->mCondition);
}
/**
* Test a count metric that has one slice_by_state with no primary fields.
*
@@ -85,7 +171,7 @@ TEST(CountMetricE2eTest, TestSlicedState) {
x x x x x x (syncStartEvents)
| | (ScreenIsOnEvent)
| | (ScreenIsOffEvent)
| (ScreenUnknownEvent)
| (ScreenDozeEvent)
*/
// Initialize log events - first bucket.
std::vector<int> attributionUids1 = {123};
@@ -243,9 +329,8 @@ TEST(CountMetricE2eTest, TestSlicedStateWithMap) {
|-----------------------------|-----------------------------|--
x x x x x x x x x (syncStartEvents)
-----------------------------------------------------------SCREEN_OFF events
| (ScreenStateUnknownEvent = 0)
| | (ScreenStateOffEvent = 1)
| (ScreenStateDozeEvent = 3)
| | (ScreenStateDozeEvent = 3)
| (ScreenStateDozeSuspendEvent =
4)
-----------------------------------------------------------SCREEN_ON events
@@ -262,7 +347,7 @@ TEST(CountMetricE2eTest, TestSlicedStateWithMap) {
attributionTags1, "sync_name")); // 0:30
events.push_back(CreateScreenStateChangedEvent(
bucketStartTimeNs + 30 * NS_PER_SEC,
android::view::DisplayStateEnum::DISPLAY_STATE_UNKNOWN)); // 0:40
android::view::DisplayStateEnum::DISPLAY_STATE_DOZE)); // 0:40
events.push_back(CreateSyncStartEvent(bucketStartTimeNs + 60 * NS_PER_SEC, attributionUids1,
attributionTags1, "sync_name")); // 1:10
events.push_back(CreateScreenStateChangedEvent(
@@ -625,9 +710,8 @@ TEST(CountMetricE2eTest, TestMultipleSlicedStates) {
|------------------------|------------------------|--
1 1 1 1 1 2 1 1 2 (AppCrashEvents)
---------------------------------------------------SCREEN_OFF events
| (ScreenUnknownEvent = 0)
| | (ScreenOffEvent = 1)
| (ScreenDozeEvent = 3)
| | (ScreenDozeEvent = 3)
---------------------------------------------------SCREEN_ON events
| | (ScreenOnEvent = 2)
| (ScreenOnSuspendEvent = 6)
@@ -660,7 +744,7 @@ TEST(CountMetricE2eTest, TestMultipleSlicedStates) {
CreateAppCrashOccurredEvent(bucketStartTimeNs + 20 * NS_PER_SEC, 1 /*uid*/)); // 0:30
events.push_back(CreateScreenStateChangedEvent(
bucketStartTimeNs + 30 * NS_PER_SEC,
android::view::DisplayStateEnum::DISPLAY_STATE_UNKNOWN)); // 0:40
android::view::DisplayStateEnum::DISPLAY_STATE_DOZE)); // 0:40
events.push_back(
CreateAppCrashOccurredEvent(bucketStartTimeNs + 60 * NS_PER_SEC, 1 /*uid*/)); // 1:10
events.push_back(CreateUidProcessStateChangedEvent(

View File

@@ -63,8 +63,143 @@ StatsdConfig CreateStatsdConfig(bool useCondition = true) {
return config;
}
StatsdConfig CreateStatsdConfigWithStates() {
StatsdConfig config;
config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
config.add_default_pull_packages("AID_ROOT"); // Fake puller is registered with root.
auto pulledAtomMatcher = CreateSimpleAtomMatcher("TestMatcher", util::SUBSYSTEM_SLEEP_STATE);
*config.add_atom_matcher() = pulledAtomMatcher;
*config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher();
*config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher();
*config.add_atom_matcher() = CreateBatteryStateNoneMatcher();
*config.add_atom_matcher() = CreateBatteryStateUsbMatcher();
auto screenOnPredicate = CreateScreenIsOnPredicate();
*config.add_predicate() = screenOnPredicate;
auto screenOffPredicate = CreateScreenIsOffPredicate();
*config.add_predicate() = screenOffPredicate;
auto deviceUnpluggedPredicate = CreateDeviceUnpluggedPredicate();
*config.add_predicate() = deviceUnpluggedPredicate;
auto screenOnOnBatteryPredicate = config.add_predicate();
screenOnOnBatteryPredicate->set_id(StringToId("screenOnOnBatteryPredicate"));
screenOnOnBatteryPredicate->mutable_combination()->set_operation(LogicalOperation::AND);
addPredicateToPredicateCombination(screenOnPredicate, screenOnOnBatteryPredicate);
addPredicateToPredicateCombination(deviceUnpluggedPredicate, screenOnOnBatteryPredicate);
auto screenOffOnBatteryPredicate = config.add_predicate();
screenOffOnBatteryPredicate->set_id(StringToId("ScreenOffOnBattery"));
screenOffOnBatteryPredicate->mutable_combination()->set_operation(LogicalOperation::AND);
addPredicateToPredicateCombination(screenOffPredicate, screenOffOnBatteryPredicate);
addPredicateToPredicateCombination(deviceUnpluggedPredicate, screenOffOnBatteryPredicate);
const State screenState =
CreateScreenStateWithSimpleOnOffMap(/*screen on id=*/321, /*screen off id=*/123);
*config.add_state() = screenState;
// ValueMetricSubsystemSleepWhileScreenOnOnBattery
auto valueMetric1 = config.add_value_metric();
valueMetric1->set_id(metricId);
valueMetric1->set_what(pulledAtomMatcher.id());
valueMetric1->set_condition(screenOnOnBatteryPredicate->id());
*valueMetric1->mutable_value_field() =
CreateDimensions(util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
valueMetric1->set_bucket(FIVE_MINUTES);
valueMetric1->set_use_absolute_value_on_reset(true);
valueMetric1->set_skip_zero_diff_output(false);
valueMetric1->set_max_pull_delay_sec(INT_MAX);
// ValueMetricSubsystemSleepWhileScreenOffOnBattery
ValueMetric* valueMetric2 = config.add_value_metric();
valueMetric2->set_id(StringToId("ValueMetricSubsystemSleepWhileScreenOffOnBattery"));
valueMetric2->set_what(pulledAtomMatcher.id());
valueMetric2->set_condition(screenOffOnBatteryPredicate->id());
*valueMetric2->mutable_value_field() =
CreateDimensions(util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
valueMetric2->set_bucket(FIVE_MINUTES);
valueMetric2->set_use_absolute_value_on_reset(true);
valueMetric2->set_skip_zero_diff_output(false);
valueMetric2->set_max_pull_delay_sec(INT_MAX);
// ValueMetricSubsystemSleepWhileOnBatterySliceScreen
ValueMetric* valueMetric3 = config.add_value_metric();
valueMetric3->set_id(StringToId("ValueMetricSubsystemSleepWhileOnBatterySliceScreen"));
valueMetric3->set_what(pulledAtomMatcher.id());
valueMetric3->set_condition(deviceUnpluggedPredicate.id());
*valueMetric3->mutable_value_field() =
CreateDimensions(util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
valueMetric3->add_slice_by_state(screenState.id());
valueMetric3->set_bucket(FIVE_MINUTES);
valueMetric3->set_use_absolute_value_on_reset(true);
valueMetric3->set_skip_zero_diff_output(false);
valueMetric3->set_max_pull_delay_sec(INT_MAX);
return config;
}
} // namespace
/**
* Tests the initial condition and condition after the first log events for
* value metrics with either a combination condition or simple condition.
*
* Metrics should be initialized with condition kUnknown (given that the
* predicate is using the default InitialValue of UNKNOWN). The condition should
* be updated to either kFalse or kTrue if a condition event is logged for all
* children conditions.
*/
TEST(ValueMetricE2eTest, TestInitialConditionChanges) {
StatsdConfig config = CreateStatsdConfigWithStates();
int64_t baseTimeNs = getElapsedRealtimeNs();
int64_t configAddedTimeNs = 10 * 60 * NS_PER_SEC + baseTimeNs;
int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(config.value_metric(0).bucket()) * 1000000;
ConfigKey cfgKey;
int32_t tagId = util::SUBSYSTEM_SLEEP_STATE;
auto processor =
CreateStatsLogProcessor(baseTimeNs, configAddedTimeNs, config, cfgKey,
SharedRefBase::make<FakeSubsystemSleepCallback>(), tagId);
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
sp<MetricsManager> metricsManager = processor->mMetricsManagers.begin()->second;
EXPECT_TRUE(metricsManager->isConfigValid());
EXPECT_EQ(3, metricsManager->mAllMetricProducers.size());
// Combination condition metric - screen on and device unplugged
sp<MetricProducer> metricProducer1 = metricsManager->mAllMetricProducers[0];
// Simple condition metric - device unplugged
sp<MetricProducer> metricProducer2 = metricsManager->mAllMetricProducers[2];
EXPECT_EQ(ConditionState::kUnknown, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kUnknown, metricProducer2->mCondition);
auto screenOnEvent =
CreateScreenStateChangedEvent(configAddedTimeNs + 30, android::view::DISPLAY_STATE_ON);
processor->OnLogEvent(screenOnEvent.get());
EXPECT_EQ(ConditionState::kUnknown, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kUnknown, metricProducer2->mCondition);
auto screenOffEvent =
CreateScreenStateChangedEvent(configAddedTimeNs + 40, android::view::DISPLAY_STATE_OFF);
processor->OnLogEvent(screenOffEvent.get());
EXPECT_EQ(ConditionState::kUnknown, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kUnknown, metricProducer2->mCondition);
auto pluggedUsbEvent = CreateBatteryStateChangedEvent(
configAddedTimeNs + 50, BatteryPluggedStateEnum::BATTERY_PLUGGED_USB);
processor->OnLogEvent(pluggedUsbEvent.get());
EXPECT_EQ(ConditionState::kFalse, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kFalse, metricProducer2->mCondition);
auto pluggedNoneEvent = CreateBatteryStateChangedEvent(
configAddedTimeNs + 70, BatteryPluggedStateEnum::BATTERY_PLUGGED_NONE);
processor->OnLogEvent(pluggedNoneEvent.get());
EXPECT_EQ(ConditionState::kFalse, metricProducer1->mCondition);
EXPECT_EQ(ConditionState::kTrue, metricProducer2->mCondition);
}
TEST(ValueMetricE2eTest, TestPulledEvents) {
auto config = CreateStatsdConfig();
int64_t baseTimeNs = getElapsedRealtimeNs();

View File

@@ -169,7 +169,6 @@ AtomMatcher CreateScreenStateChangedAtomMatcher(
return atom_matcher;
}
AtomMatcher CreateScreenTurnedOnAtomMatcher() {
return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
android::view::DisplayStateEnum::DISPLAY_STATE_ON);
@@ -335,22 +334,46 @@ State CreateScreenStateWithOnOffMap(int64_t screenOnId, int64_t screenOffId) {
return state;
}
State CreateScreenStateWithSimpleOnOffMap(int64_t screenOnId, int64_t screenOffId) {
State state;
state.set_id(StringToId("ScreenStateSimpleOnOff"));
state.set_atom_id(util::SCREEN_STATE_CHANGED);
auto map = CreateScreenStateSimpleOnOffMap(screenOnId, screenOffId);
*state.mutable_map() = map;
return state;
}
StateMap_StateGroup CreateScreenStateOnGroup(int64_t screenOnId) {
StateMap_StateGroup group;
group.set_group_id(screenOnId);
group.add_value(2);
group.add_value(5);
group.add_value(6);
group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON);
group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_VR);
group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON_SUSPEND);
return group;
}
StateMap_StateGroup CreateScreenStateOffGroup(int64_t screenOffId) {
StateMap_StateGroup group;
group.set_group_id(screenOffId);
group.add_value(0);
group.add_value(1);
group.add_value(3);
group.add_value(4);
group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_DOZE);
group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_DOZE_SUSPEND);
return group;
}
StateMap_StateGroup CreateScreenStateSimpleOnGroup(int64_t screenOnId) {
StateMap_StateGroup group;
group.set_group_id(screenOnId);
group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON);
return group;
}
StateMap_StateGroup CreateScreenStateSimpleOffGroup(int64_t screenOffId) {
StateMap_StateGroup group;
group.set_group_id(screenOffId);
group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
return group;
}
@@ -361,6 +384,13 @@ StateMap CreateScreenStateOnOffMap(int64_t screenOnId, int64_t screenOffId) {
return map;
}
StateMap CreateScreenStateSimpleOnOffMap(int64_t screenOnId, int64_t screenOffId) {
StateMap map;
*map.add_group() = CreateScreenStateSimpleOnGroup(screenOnId);
*map.add_group() = CreateScreenStateSimpleOffGroup(screenOffId);
return map;
}
void addPredicateToPredicateCombination(const Predicate& predicate,
Predicate* combinationPredicate) {
combinationPredicate->mutable_combination()->add_predicate(predicate.id());

View File

@@ -149,17 +149,30 @@ State CreateUidProcessState();
// Create State proto for overlay state atom.
State CreateOverlayState();
// Create State proto for screen state atom with on/off map.
State CreateScreenStateWithOnOffMap(int64_t screenOnId, int64_t screenOffId);
// Create State proto for screen state atom with simple on/off map.
State CreateScreenStateWithSimpleOnOffMap(int64_t screenOnId, int64_t screenOffId);
// Create StateGroup proto for ScreenState ON group
StateMap_StateGroup CreateScreenStateOnGroup(int64_t screenOnId);
// Create StateGroup proto for ScreenState OFF group
StateMap_StateGroup CreateScreenStateOffGroup(int64_t screenOffId);
// Create StateGroup proto for simple ScreenState ON group
StateMap_StateGroup CreateScreenStateSimpleOnGroup(int64_t screenOnId);
// Create StateGroup proto for simple ScreenState OFF group
StateMap_StateGroup CreateScreenStateSimpleOffGroup(int64_t screenOffId);
// Create StateMap proto for ScreenState ON/OFF map
StateMap CreateScreenStateOnOffMap(int64_t screenOnId, int64_t screenOffId);
// Create StateMap proto for simple ScreenState ON/OFF map
StateMap CreateScreenStateSimpleOnOffMap(int64_t screenOnId, int64_t screenOffId);
// Add a predicate to the predicate combination.
void addPredicateToPredicateCombination(const Predicate& predicate, Predicate* combination);