Home | History | Annotate | Download | only in condition
      1 // Copyright (C) 2017 The Android Open Source Project
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #include "src/condition/StateTracker.h"
     16 #include "tests/statsd_test_util.h"
     17 
     18 #include <gmock/gmock.h>
     19 #include <gtest/gtest.h>
     20 #include <stdio.h>
     21 #include <numeric>
     22 #include <vector>
     23 
     24 using std::map;
     25 using std::unordered_map;
     26 using std::vector;
     27 
     28 #ifdef __ANDROID__
     29 namespace android {
     30 namespace os {
     31 namespace statsd {
     32 
     33 const int kUidProcTag = 27;
     34 
     35 SimplePredicate getUidProcStatePredicate() {
     36     SimplePredicate simplePredicate;
     37     simplePredicate.set_start(StringToId("UidProcState"));
     38 
     39     simplePredicate.mutable_dimensions()->set_field(kUidProcTag);
     40     simplePredicate.mutable_dimensions()->add_child()->set_field(1);
     41     simplePredicate.mutable_dimensions()->add_child()->set_field(2);
     42 
     43     simplePredicate.set_count_nesting(false);
     44     return simplePredicate;
     45 }
     46 
     47 void makeUidProcStateEvent(int32_t uid, int32_t state, LogEvent* event) {
     48     event->write(uid);
     49     event->write(state);
     50     event->init();
     51 }
     52 
     53 TEST(StateTrackerTest, TestStateChange) {
     54     int uid1 = 111;
     55     int uid2 = 222;
     56 
     57     int state1 = 1001;
     58     int state2 = 1002;
     59     unordered_map<int64_t, int> trackerNameIndexMap;
     60     trackerNameIndexMap[StringToId("UidProcState")] = 0;
     61     vector<Matcher> primaryFields;
     62     primaryFields.push_back(getSimpleMatcher(kUidProcTag, 1));
     63     StateTracker tracker(ConfigKey(12, 123), 123, 0, getUidProcStatePredicate(),
     64                          trackerNameIndexMap, primaryFields);
     65 
     66     LogEvent event(kUidProcTag, 0 /*timestamp*/);
     67     makeUidProcStateEvent(uid1, state1, &event);
     68 
     69     vector<MatchingState> matcherState;
     70     matcherState.push_back(MatchingState::kMatched);
     71     vector<sp<ConditionTracker>> allPredicates;
     72     vector<ConditionState> conditionCache(1, ConditionState::kNotEvaluated);
     73     vector<bool> changedCache(1, false);
     74 
     75     tracker.evaluateCondition(event, matcherState, allPredicates, conditionCache, changedCache);
     76     EXPECT_EQ(1ULL, tracker.mLastChangedToTrueDimensions.size());
     77     EXPECT_EQ(0ULL, tracker.mLastChangedToFalseDimensions.size());
     78     EXPECT_TRUE(changedCache[0]);
     79 
     80     changedCache[0] = false;
     81     conditionCache[0] = ConditionState::kNotEvaluated;
     82     tracker.evaluateCondition(event, matcherState, allPredicates, conditionCache, changedCache);
     83     EXPECT_EQ(0ULL, tracker.mLastChangedToTrueDimensions.size());
     84     EXPECT_EQ(0ULL, tracker.mLastChangedToFalseDimensions.size());
     85     EXPECT_FALSE(changedCache[0]);
     86 
     87     LogEvent event2(kUidProcTag, 0 /*timestamp*/);
     88     makeUidProcStateEvent(uid1, state2, &event2);
     89 
     90     changedCache[0] = false;
     91     conditionCache[0] = ConditionState::kNotEvaluated;
     92     tracker.evaluateCondition(event2, matcherState, allPredicates, conditionCache, changedCache);
     93     EXPECT_EQ(1ULL, tracker.mLastChangedToTrueDimensions.size());
     94     EXPECT_EQ(1ULL, tracker.mLastChangedToFalseDimensions.size());
     95     EXPECT_TRUE(changedCache[0]);
     96 
     97     LogEvent event3(kUidProcTag, 0 /*timestamp*/);
     98     makeUidProcStateEvent(uid2, state1, &event3);
     99     changedCache[0] = false;
    100     conditionCache[0] = ConditionState::kNotEvaluated;
    101     tracker.evaluateCondition(event3, matcherState, allPredicates, conditionCache, changedCache);
    102     EXPECT_EQ(1ULL, tracker.mLastChangedToTrueDimensions.size());
    103     EXPECT_EQ(0ULL, tracker.mLastChangedToFalseDimensions.size());
    104     EXPECT_TRUE(changedCache[0]);
    105 }
    106 
    107 }  // namespace statsd
    108 }  // namespace os
    109 }  // namespace android
    110 #else
    111 GTEST_LOG_(INFO) << "This test does nothing.\n";
    112 #endif
    113