blob: 19403c0d0e870383ab0548d47d28a110a25fe5ce [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
Joe Onoratoc4dfae52017-10-17 23:38:21 -070045 // Set up the event
46 android_log_event_list list(TAG_ID);
David Chendd896942017-09-26 11:44:40 -070047
Joe Onoratoc4dfae52017-10-17 23:38:21 -070048 // Convert to a LogEvent
49 list.convert_to_reader();
50 LogEvent event(999, &list);
51
52 // Test
53 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070054}
55
56TEST(LogEntryMatcherTest, TestBoolMatcher) {
57 // Set up the matcher
58 LogEntryMatcher matcher;
59 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -070060 simpleMatcher->set_tag(TAG_ID);
Joe Onoratoc4dfae52017-10-17 23:38:21 -070061 auto keyValue1 = simpleMatcher->add_key_value_matcher();
62 keyValue1->mutable_key_matcher()->set_key(FIELD_ID_1);
63 auto keyValue2 = simpleMatcher->add_key_value_matcher();
64 keyValue2->mutable_key_matcher()->set_key(FIELD_ID_2);
David Chendd896942017-09-26 11:44:40 -070065
Joe Onoratoc4dfae52017-10-17 23:38:21 -070066 // Set up the event
67 android_log_event_list list(TAG_ID);
68 list << true;
69 list << false;
David Chendd896942017-09-26 11:44:40 -070070
Joe Onoratoc4dfae52017-10-17 23:38:21 -070071 // Convert to a LogEvent
72 list.convert_to_reader();
73 LogEvent event(999, &list);
David Chendd896942017-09-26 11:44:40 -070074
Joe Onoratoc4dfae52017-10-17 23:38:21 -070075 // Test
76 keyValue1->set_eq_bool(true);
77 keyValue2->set_eq_bool(false);
78 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070079
Joe Onoratoc4dfae52017-10-17 23:38:21 -070080 keyValue1->set_eq_bool(false);
81 keyValue2->set_eq_bool(false);
82 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
83
84 keyValue1->set_eq_bool(true);
85 keyValue2->set_eq_bool(false);
86 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
87
88 keyValue1->set_eq_bool(true);
89 keyValue2->set_eq_bool(true);
90 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070091}
92
93TEST(LogEntryMatcherTest, TestStringMatcher) {
94 // Set up the matcher
95 LogEntryMatcher matcher;
96 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -070097 simpleMatcher->set_tag(TAG_ID);
David Chendd896942017-09-26 11:44:40 -070098 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -070099 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
100 keyValue->set_eq_string("some value");
David Chendd896942017-09-26 11:44:40 -0700101
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700102 // Set up the event
103 android_log_event_list list(TAG_ID);
104 list << "some value";
David Chendd896942017-09-26 11:44:40 -0700105
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700106 // Convert to a LogEvent
107 list.convert_to_reader();
108 LogEvent event(999, &list);
David Chendd896942017-09-26 11:44:40 -0700109
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700110 // Test
111 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700112}
113
114TEST(LogEntryMatcherTest, TestIntComparisonMatcher) {
115 // Set up the matcher
116 LogEntryMatcher matcher;
117 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700118
119 simpleMatcher->set_tag(TAG_ID);
David Chendd896942017-09-26 11:44:40 -0700120 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700121 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
David Chendd896942017-09-26 11:44:40 -0700122
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700123 // Set up the event
124 android_log_event_list list(TAG_ID);
125 list << 11;
David Chendd896942017-09-26 11:44:40 -0700126
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700127 // Convert to a LogEvent
128 list.convert_to_reader();
129 LogEvent event(999, &list);
130
131 // Test
132
133 // eq_int
134 keyValue->set_eq_int(10);
135 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
136 keyValue->set_eq_int(11);
137 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
138 keyValue->set_eq_int(12);
139 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
140
141 // lt_int
David Chendd896942017-09-26 11:44:40 -0700142 keyValue->set_lt_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700143 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
144 keyValue->set_lt_int(11);
145 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
146 keyValue->set_lt_int(12);
147 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700148
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700149 // lte_int
David Chendd896942017-09-26 11:44:40 -0700150 keyValue->set_lte_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700151 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
152 keyValue->set_lte_int(11);
153 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
154 keyValue->set_lte_int(12);
155 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700156
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700157 // gt_int
158 keyValue->set_gt_int(10);
159 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
160 keyValue->set_gt_int(11);
161 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
162 keyValue->set_gt_int(12);
163 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
164
165 // gte_int
David Chendd896942017-09-26 11:44:40 -0700166 keyValue->set_gte_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700167 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
168 keyValue->set_gte_int(11);
169 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
170 keyValue->set_gte_int(12);
171 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700172}
173
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700174#if 0
175
David Chendd896942017-09-26 11:44:40 -0700176TEST(LogEntryMatcherTest, TestFloatComparisonMatcher) {
177 // Set up the matcher
178 LogEntryMatcher matcher;
179 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700180 simpleMatcher->set_tag(TAG_ID);
181
David Chendd896942017-09-26 11:44:40 -0700182 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700183 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
David Chendd896942017-09-26 11:44:40 -0700184
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700185 LogEvent event;
186 event.tagId = TAG_ID;
David Chendd896942017-09-26 11:44:40 -0700187
188 keyValue->set_lt_float(10.0);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700189 event.floatMap[FIELD_ID_1] = 10.1;
190 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
191 event.floatMap[FIELD_ID_1] = 9.9;
192 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700193
194 keyValue->set_gt_float(10.0);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700195 event.floatMap[FIELD_ID_1] = 10.1;
196 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
197 event.floatMap[FIELD_ID_1] = 9.9;
198 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700199}
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700200#endif
David Chendd896942017-09-26 11:44:40 -0700201
202// Helper for the composite matchers.
Stefan Lafoncdb1a0e2017-09-27 20:24:15 -0700203void addSimpleMatcher(SimpleLogEntryMatcher* simpleMatcher, int tag, int key, int val) {
Yao Chen729093d2017-10-16 10:33:26 -0700204 simpleMatcher->set_tag(tag);
David Chendd896942017-09-26 11:44:40 -0700205 auto keyValue = simpleMatcher->add_key_value_matcher();
206 keyValue->mutable_key_matcher()->set_key(key);
207 keyValue->set_eq_int(val);
208}
209
210TEST(LogEntryMatcherTest, TestAndMatcher) {
211 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700212 LogicalOperation operation = LogicalOperation::AND;
David Chendd896942017-09-26 11:44:40 -0700213
Yao Chencaf339d2017-10-06 16:01:10 -0700214 vector<int> children;
215 children.push_back(0);
216 children.push_back(1);
217 children.push_back(2);
David Chendd896942017-09-26 11:44:40 -0700218
Yao Chencaf339d2017-10-06 16:01:10 -0700219 vector<MatchingState> matcherResults;
220 matcherResults.push_back(MatchingState::kMatched);
221 matcherResults.push_back(MatchingState::kNotMatched);
222 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700223
Yao Chencaf339d2017-10-06 16:01:10 -0700224 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
225
226 matcherResults.clear();
227 matcherResults.push_back(MatchingState::kMatched);
228 matcherResults.push_back(MatchingState::kMatched);
229 matcherResults.push_back(MatchingState::kMatched);
230
231 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700232}
233
234TEST(LogEntryMatcherTest, TestOrMatcher) {
235 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700236 LogicalOperation operation = LogicalOperation::OR;
David Chendd896942017-09-26 11:44:40 -0700237
Yao Chencaf339d2017-10-06 16:01:10 -0700238 vector<int> children;
239 children.push_back(0);
240 children.push_back(1);
241 children.push_back(2);
David Chendd896942017-09-26 11:44:40 -0700242
Yao Chencaf339d2017-10-06 16:01:10 -0700243 vector<MatchingState> matcherResults;
244 matcherResults.push_back(MatchingState::kMatched);
245 matcherResults.push_back(MatchingState::kNotMatched);
246 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700247
Yao Chencaf339d2017-10-06 16:01:10 -0700248 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
249
250 matcherResults.clear();
251 matcherResults.push_back(MatchingState::kNotMatched);
252 matcherResults.push_back(MatchingState::kNotMatched);
253 matcherResults.push_back(MatchingState::kNotMatched);
254
255 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700256}
257
258TEST(LogEntryMatcherTest, TestNotMatcher) {
259 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700260 LogicalOperation operation = LogicalOperation::NOT;
David Chendd896942017-09-26 11:44:40 -0700261
Yao Chencaf339d2017-10-06 16:01:10 -0700262 vector<int> children;
263 children.push_back(0);
David Chendd896942017-09-26 11:44:40 -0700264
Yao Chencaf339d2017-10-06 16:01:10 -0700265 vector<MatchingState> matcherResults;
266 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700267
Yao Chencaf339d2017-10-06 16:01:10 -0700268 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
269
270 matcherResults.clear();
271 matcherResults.push_back(MatchingState::kNotMatched);
272 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700273}
274
Yao Chencaf339d2017-10-06 16:01:10 -0700275TEST(LogEntryMatcherTest, TestNandMatcher) {
David Chendd896942017-09-26 11:44:40 -0700276 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700277 LogicalOperation operation = LogicalOperation::NAND;
David Chendd896942017-09-26 11:44:40 -0700278
Yao Chencaf339d2017-10-06 16:01:10 -0700279 vector<int> children;
280 children.push_back(0);
281 children.push_back(1);
David Chendd896942017-09-26 11:44:40 -0700282
Yao Chencaf339d2017-10-06 16:01:10 -0700283 vector<MatchingState> matcherResults;
284 matcherResults.push_back(MatchingState::kMatched);
285 matcherResults.push_back(MatchingState::kNotMatched);
David Chendd896942017-09-26 11:44:40 -0700286
Yao Chencaf339d2017-10-06 16:01:10 -0700287 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
288
289 matcherResults.clear();
290 matcherResults.push_back(MatchingState::kNotMatched);
291 matcherResults.push_back(MatchingState::kNotMatched);
292 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
293
294 matcherResults.clear();
295 matcherResults.push_back(MatchingState::kMatched);
296 matcherResults.push_back(MatchingState::kMatched);
297 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700298}
299
Yao Chencaf339d2017-10-06 16:01:10 -0700300TEST(LogEntryMatcherTest, TestNorMatcher) {
David Chendd896942017-09-26 11:44:40 -0700301 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700302 LogicalOperation operation = LogicalOperation::NOR;
David Chendd896942017-09-26 11:44:40 -0700303
Yao Chencaf339d2017-10-06 16:01:10 -0700304 vector<int> children;
305 children.push_back(0);
306 children.push_back(1);
David Chendd896942017-09-26 11:44:40 -0700307
Yao Chencaf339d2017-10-06 16:01:10 -0700308 vector<MatchingState> matcherResults;
309 matcherResults.push_back(MatchingState::kMatched);
310 matcherResults.push_back(MatchingState::kNotMatched);
David Chendd896942017-09-26 11:44:40 -0700311
Yao Chencaf339d2017-10-06 16:01:10 -0700312 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700313
Yao Chencaf339d2017-10-06 16:01:10 -0700314 matcherResults.clear();
315 matcherResults.push_back(MatchingState::kNotMatched);
316 matcherResults.push_back(MatchingState::kNotMatched);
317 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700318
Yao Chencaf339d2017-10-06 16:01:10 -0700319 matcherResults.clear();
320 matcherResults.push_back(MatchingState::kMatched);
321 matcherResults.push_back(MatchingState::kMatched);
322 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700323}
Stefan Lafoncdb1a0e2017-09-27 20:24:15 -0700324
David Chendd896942017-09-26 11:44:40 -0700325#else
Yao Chen44cf27c2017-09-14 22:32:50 -0700326GTEST_LOG_(INFO) << "This test does nothing.\n";
David Chendd896942017-09-26 11:44:40 -0700327#endif