blob: fdfe8ef46853e498d2b6e6d6a08efd72aeef6175 [file] [log] [blame]
David Chendd896942017-09-26 11:44:40 -07001// 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
Joe Onorato9fc9edf2017-10-15 20:08:52 -070015#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
16#include "matchers/matcher_util.h"
17#include "stats_util.h"
David Chendd896942017-09-26 11:44:40 -070018
Yao Chen44cf27c2017-09-14 22:32:50 -070019#include <gtest/gtest.h>
20#include <log/log_event_list.h>
21#include <log/log_read.h>
22#include <log/logprint.h>
David Chendd896942017-09-26 11:44:40 -070023
24#include <stdio.h>
25
26using namespace android::os::statsd;
27using std::unordered_map;
Yao Chencaf339d2017-10-06 16:01:10 -070028using std::vector;
David Chendd896942017-09-26 11:44:40 -070029
Joe Onoratoc4dfae52017-10-17 23:38:21 -070030const int TAG_ID = 123;
31const int FIELD_ID_1 = 1;
32const int FIELD_ID_2 = 2;
33const int FIELD_ID_3 = 2;
34
35// Private API from liblog.
36extern "C" void android_log_rewind(android_log_context ctx);
Stefan Lafoncdb1a0e2017-09-27 20:24:15 -070037
David Chendd896942017-09-26 11:44:40 -070038#ifdef __ANDROID__
39TEST(LogEntryMatcherTest, TestSimpleMatcher) {
40 // Set up the matcher
41 LogEntryMatcher matcher;
42 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -070043 simpleMatcher->set_tag(TAG_ID);
David Chendd896942017-09-26 11:44:40 -070044
David Chen1481fe12017-10-16 13:16:34 -070045 LogEvent event(TAG_ID);
David Chendd896942017-09-26 11:44:40 -070046
Joe Onoratoc4dfae52017-10-17 23:38:21 -070047 // Convert to a LogEvent
David Chen1481fe12017-10-16 13:16:34 -070048 event.init();
Joe Onoratoc4dfae52017-10-17 23:38:21 -070049
50 // Test
51 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070052}
53
54TEST(LogEntryMatcherTest, TestBoolMatcher) {
55 // Set up the matcher
56 LogEntryMatcher matcher;
57 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -070058 simpleMatcher->set_tag(TAG_ID);
Joe Onoratoc4dfae52017-10-17 23:38:21 -070059 auto keyValue1 = simpleMatcher->add_key_value_matcher();
60 keyValue1->mutable_key_matcher()->set_key(FIELD_ID_1);
61 auto keyValue2 = simpleMatcher->add_key_value_matcher();
62 keyValue2->mutable_key_matcher()->set_key(FIELD_ID_2);
David Chendd896942017-09-26 11:44:40 -070063
Joe Onoratoc4dfae52017-10-17 23:38:21 -070064 // Set up the event
David Chen1481fe12017-10-16 13:16:34 -070065 LogEvent event(TAG_ID);
66 auto list = event.GetAndroidLogEventList();
67 *list << true;
68 *list << false;
David Chendd896942017-09-26 11:44:40 -070069
Joe Onoratoc4dfae52017-10-17 23:38:21 -070070 // Convert to a LogEvent
David Chen1481fe12017-10-16 13:16:34 -070071 event.init();
David Chendd896942017-09-26 11:44:40 -070072
Joe Onoratoc4dfae52017-10-17 23:38:21 -070073 // Test
74 keyValue1->set_eq_bool(true);
75 keyValue2->set_eq_bool(false);
76 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070077
Joe Onoratoc4dfae52017-10-17 23:38:21 -070078 keyValue1->set_eq_bool(false);
79 keyValue2->set_eq_bool(false);
80 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
81
82 keyValue1->set_eq_bool(true);
83 keyValue2->set_eq_bool(false);
84 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
85
86 keyValue1->set_eq_bool(true);
87 keyValue2->set_eq_bool(true);
88 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070089}
90
91TEST(LogEntryMatcherTest, TestStringMatcher) {
92 // Set up the matcher
93 LogEntryMatcher matcher;
94 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -070095 simpleMatcher->set_tag(TAG_ID);
David Chendd896942017-09-26 11:44:40 -070096 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -070097 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
98 keyValue->set_eq_string("some value");
David Chendd896942017-09-26 11:44:40 -070099
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700100 // Set up the event
David Chen1481fe12017-10-16 13:16:34 -0700101 LogEvent event(TAG_ID);
102 auto list = event.GetAndroidLogEventList();
103 *list << "some value";
David Chendd896942017-09-26 11:44:40 -0700104
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700105 // Convert to a LogEvent
David Chen1481fe12017-10-16 13:16:34 -0700106 event.init();
David Chendd896942017-09-26 11:44:40 -0700107
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700108 // Test
109 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700110}
111
112TEST(LogEntryMatcherTest, TestIntComparisonMatcher) {
113 // Set up the matcher
114 LogEntryMatcher matcher;
115 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700116
117 simpleMatcher->set_tag(TAG_ID);
David Chendd896942017-09-26 11:44:40 -0700118 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700119 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
David Chendd896942017-09-26 11:44:40 -0700120
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700121 // Set up the event
David Chen1481fe12017-10-16 13:16:34 -0700122 LogEvent event(TAG_ID);
123 auto list = event.GetAndroidLogEventList();
124 *list << 11;
David Chendd896942017-09-26 11:44:40 -0700125
David Chen1481fe12017-10-16 13:16:34 -0700126 event.init();
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700127
128 // Test
129
130 // eq_int
131 keyValue->set_eq_int(10);
132 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
133 keyValue->set_eq_int(11);
134 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
135 keyValue->set_eq_int(12);
136 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
137
138 // lt_int
David Chendd896942017-09-26 11:44:40 -0700139 keyValue->set_lt_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700140 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
141 keyValue->set_lt_int(11);
142 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
143 keyValue->set_lt_int(12);
144 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700145
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700146 // lte_int
David Chendd896942017-09-26 11:44:40 -0700147 keyValue->set_lte_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700148 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
149 keyValue->set_lte_int(11);
150 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
151 keyValue->set_lte_int(12);
152 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700153
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700154 // gt_int
155 keyValue->set_gt_int(10);
156 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
157 keyValue->set_gt_int(11);
158 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
159 keyValue->set_gt_int(12);
160 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
161
162 // gte_int
David Chendd896942017-09-26 11:44:40 -0700163 keyValue->set_gte_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700164 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
165 keyValue->set_gte_int(11);
166 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
167 keyValue->set_gte_int(12);
168 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700169}
170
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700171#if 0
172
David Chendd896942017-09-26 11:44:40 -0700173TEST(LogEntryMatcherTest, TestFloatComparisonMatcher) {
174 // Set up the matcher
175 LogEntryMatcher matcher;
176 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700177 simpleMatcher->set_tag(TAG_ID);
178
David Chendd896942017-09-26 11:44:40 -0700179 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700180 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
David Chendd896942017-09-26 11:44:40 -0700181
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700182 LogEvent event;
183 event.tagId = TAG_ID;
David Chendd896942017-09-26 11:44:40 -0700184
185 keyValue->set_lt_float(10.0);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700186 event.floatMap[FIELD_ID_1] = 10.1;
187 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
188 event.floatMap[FIELD_ID_1] = 9.9;
189 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700190
191 keyValue->set_gt_float(10.0);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700192 event.floatMap[FIELD_ID_1] = 10.1;
193 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
194 event.floatMap[FIELD_ID_1] = 9.9;
195 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700196}
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700197#endif
David Chendd896942017-09-26 11:44:40 -0700198
199// Helper for the composite matchers.
Stefan Lafoncdb1a0e2017-09-27 20:24:15 -0700200void addSimpleMatcher(SimpleLogEntryMatcher* simpleMatcher, int tag, int key, int val) {
Yao Chen729093d2017-10-16 10:33:26 -0700201 simpleMatcher->set_tag(tag);
David Chendd896942017-09-26 11:44:40 -0700202 auto keyValue = simpleMatcher->add_key_value_matcher();
203 keyValue->mutable_key_matcher()->set_key(key);
204 keyValue->set_eq_int(val);
205}
206
207TEST(LogEntryMatcherTest, TestAndMatcher) {
208 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700209 LogicalOperation operation = LogicalOperation::AND;
David Chendd896942017-09-26 11:44:40 -0700210
Yao Chencaf339d2017-10-06 16:01:10 -0700211 vector<int> children;
212 children.push_back(0);
213 children.push_back(1);
214 children.push_back(2);
David Chendd896942017-09-26 11:44:40 -0700215
Yao Chencaf339d2017-10-06 16:01:10 -0700216 vector<MatchingState> matcherResults;
217 matcherResults.push_back(MatchingState::kMatched);
218 matcherResults.push_back(MatchingState::kNotMatched);
219 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700220
Yao Chencaf339d2017-10-06 16:01:10 -0700221 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
222
223 matcherResults.clear();
224 matcherResults.push_back(MatchingState::kMatched);
225 matcherResults.push_back(MatchingState::kMatched);
226 matcherResults.push_back(MatchingState::kMatched);
227
228 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700229}
230
231TEST(LogEntryMatcherTest, TestOrMatcher) {
232 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700233 LogicalOperation operation = LogicalOperation::OR;
David Chendd896942017-09-26 11:44:40 -0700234
Yao Chencaf339d2017-10-06 16:01:10 -0700235 vector<int> children;
236 children.push_back(0);
237 children.push_back(1);
238 children.push_back(2);
David Chendd896942017-09-26 11:44:40 -0700239
Yao Chencaf339d2017-10-06 16:01:10 -0700240 vector<MatchingState> matcherResults;
241 matcherResults.push_back(MatchingState::kMatched);
242 matcherResults.push_back(MatchingState::kNotMatched);
243 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700244
Yao Chencaf339d2017-10-06 16:01:10 -0700245 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
246
247 matcherResults.clear();
248 matcherResults.push_back(MatchingState::kNotMatched);
249 matcherResults.push_back(MatchingState::kNotMatched);
250 matcherResults.push_back(MatchingState::kNotMatched);
251
252 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700253}
254
255TEST(LogEntryMatcherTest, TestNotMatcher) {
256 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700257 LogicalOperation operation = LogicalOperation::NOT;
David Chendd896942017-09-26 11:44:40 -0700258
Yao Chencaf339d2017-10-06 16:01:10 -0700259 vector<int> children;
260 children.push_back(0);
David Chendd896942017-09-26 11:44:40 -0700261
Yao Chencaf339d2017-10-06 16:01:10 -0700262 vector<MatchingState> matcherResults;
263 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700264
Yao Chencaf339d2017-10-06 16:01:10 -0700265 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
266
267 matcherResults.clear();
268 matcherResults.push_back(MatchingState::kNotMatched);
269 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700270}
271
Yao Chencaf339d2017-10-06 16:01:10 -0700272TEST(LogEntryMatcherTest, TestNandMatcher) {
David Chendd896942017-09-26 11:44:40 -0700273 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700274 LogicalOperation operation = LogicalOperation::NAND;
David Chendd896942017-09-26 11:44:40 -0700275
Yao Chencaf339d2017-10-06 16:01:10 -0700276 vector<int> children;
277 children.push_back(0);
278 children.push_back(1);
David Chendd896942017-09-26 11:44:40 -0700279
Yao Chencaf339d2017-10-06 16:01:10 -0700280 vector<MatchingState> matcherResults;
281 matcherResults.push_back(MatchingState::kMatched);
282 matcherResults.push_back(MatchingState::kNotMatched);
David Chendd896942017-09-26 11:44:40 -0700283
Yao Chencaf339d2017-10-06 16:01:10 -0700284 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
285
286 matcherResults.clear();
287 matcherResults.push_back(MatchingState::kNotMatched);
288 matcherResults.push_back(MatchingState::kNotMatched);
289 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
290
291 matcherResults.clear();
292 matcherResults.push_back(MatchingState::kMatched);
293 matcherResults.push_back(MatchingState::kMatched);
294 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700295}
296
Yao Chencaf339d2017-10-06 16:01:10 -0700297TEST(LogEntryMatcherTest, TestNorMatcher) {
David Chendd896942017-09-26 11:44:40 -0700298 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700299 LogicalOperation operation = LogicalOperation::NOR;
David Chendd896942017-09-26 11:44:40 -0700300
Yao Chencaf339d2017-10-06 16:01:10 -0700301 vector<int> children;
302 children.push_back(0);
303 children.push_back(1);
David Chendd896942017-09-26 11:44:40 -0700304
Yao Chencaf339d2017-10-06 16:01:10 -0700305 vector<MatchingState> matcherResults;
306 matcherResults.push_back(MatchingState::kMatched);
307 matcherResults.push_back(MatchingState::kNotMatched);
David Chendd896942017-09-26 11:44:40 -0700308
Yao Chencaf339d2017-10-06 16:01:10 -0700309 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700310
Yao Chencaf339d2017-10-06 16:01:10 -0700311 matcherResults.clear();
312 matcherResults.push_back(MatchingState::kNotMatched);
313 matcherResults.push_back(MatchingState::kNotMatched);
314 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700315
Yao Chencaf339d2017-10-06 16:01:10 -0700316 matcherResults.clear();
317 matcherResults.push_back(MatchingState::kMatched);
318 matcherResults.push_back(MatchingState::kMatched);
319 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700320}
Stefan Lafoncdb1a0e2017-09-27 20:24:15 -0700321
David Chendd896942017-09-26 11:44:40 -0700322#else
Yao Chen44cf27c2017-09-14 22:32:50 -0700323GTEST_LOG_(INFO) << "This test does nothing.\n";
David Chendd896942017-09-26 11:44:40 -0700324#endif