blob: 40c0e9d74c1d2c091d0990cbe1631f012717d1ac [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
Yao Chen80235402017-11-13 20:42:25 -080030const int32_t TAG_ID = 123;
Joe Onoratoc4dfae52017-10-17 23:38:21 -070031const 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
Yao Chen93fe3a32017-11-02 13:52:59 -070045 LogEvent event(TAG_ID, 0);
David Chen1481fe12017-10-16 13:16:34 -070046 event.init();
Joe Onoratoc4dfae52017-10-17 23:38:21 -070047
48 // Test
49 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070050}
51
52TEST(LogEntryMatcherTest, TestBoolMatcher) {
53 // Set up the matcher
54 LogEntryMatcher matcher;
55 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -070056 simpleMatcher->set_tag(TAG_ID);
Joe Onoratoc4dfae52017-10-17 23:38:21 -070057 auto keyValue1 = simpleMatcher->add_key_value_matcher();
58 keyValue1->mutable_key_matcher()->set_key(FIELD_ID_1);
59 auto keyValue2 = simpleMatcher->add_key_value_matcher();
60 keyValue2->mutable_key_matcher()->set_key(FIELD_ID_2);
David Chendd896942017-09-26 11:44:40 -070061
Joe Onoratoc4dfae52017-10-17 23:38:21 -070062 // Set up the event
Yao Chen93fe3a32017-11-02 13:52:59 -070063 LogEvent event(TAG_ID, 0);
Yao Chen80235402017-11-13 20:42:25 -080064 event.write(true);
65 event.write(false);
Joe Onoratoc4dfae52017-10-17 23:38:21 -070066 // Convert to a LogEvent
David Chen1481fe12017-10-16 13:16:34 -070067 event.init();
David Chendd896942017-09-26 11:44:40 -070068
Joe Onoratoc4dfae52017-10-17 23:38:21 -070069 // Test
70 keyValue1->set_eq_bool(true);
71 keyValue2->set_eq_bool(false);
72 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070073
Joe Onoratoc4dfae52017-10-17 23:38:21 -070074 keyValue1->set_eq_bool(false);
75 keyValue2->set_eq_bool(false);
76 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
77
78 keyValue1->set_eq_bool(true);
79 keyValue2->set_eq_bool(false);
80 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
81
82 keyValue1->set_eq_bool(true);
83 keyValue2->set_eq_bool(true);
84 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -070085}
86
87TEST(LogEntryMatcherTest, TestStringMatcher) {
88 // Set up the matcher
89 LogEntryMatcher matcher;
90 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -070091 simpleMatcher->set_tag(TAG_ID);
David Chendd896942017-09-26 11:44:40 -070092 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -070093 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
94 keyValue->set_eq_string("some value");
David Chendd896942017-09-26 11:44:40 -070095
Joe Onoratoc4dfae52017-10-17 23:38:21 -070096 // Set up the event
Yao Chen93fe3a32017-11-02 13:52:59 -070097 LogEvent event(TAG_ID, 0);
Yao Chen80235402017-11-13 20:42:25 -080098 event.write("some value");
Joe Onoratoc4dfae52017-10-17 23:38:21 -070099 // Convert to a LogEvent
David Chen1481fe12017-10-16 13:16:34 -0700100 event.init();
David Chendd896942017-09-26 11:44:40 -0700101
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700102 // Test
103 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700104}
105
Yao Chend41c4222017-11-15 19:26:14 -0800106TEST(LogEntryMatcherTest, TestMultiFieldsMatcher) {
107 // Set up the matcher
108 LogEntryMatcher matcher;
109 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
110 simpleMatcher->set_tag(TAG_ID);
111 auto keyValue1 = simpleMatcher->add_key_value_matcher();
112 keyValue1->mutable_key_matcher()->set_key(FIELD_ID_1);
113 auto keyValue2 = simpleMatcher->add_key_value_matcher();
114 keyValue2->mutable_key_matcher()->set_key(FIELD_ID_2);
115
116 // Set up the event
117 LogEvent event(TAG_ID, 0);
Yao Chen80235402017-11-13 20:42:25 -0800118 event.write(2);
119 event.write(3);
Yao Chend41c4222017-11-15 19:26:14 -0800120
121 // Convert to a LogEvent
122 event.init();
123
124 // Test
125 keyValue1->set_eq_int(2);
126 keyValue2->set_eq_int(3);
127 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
128
129 keyValue1->set_eq_int(2);
130 keyValue2->set_eq_int(4);
131 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
132
133 keyValue1->set_eq_int(4);
134 keyValue2->set_eq_int(3);
135 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
136}
137
David Chendd896942017-09-26 11:44:40 -0700138TEST(LogEntryMatcherTest, TestIntComparisonMatcher) {
139 // Set up the matcher
140 LogEntryMatcher matcher;
141 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700142
143 simpleMatcher->set_tag(TAG_ID);
David Chendd896942017-09-26 11:44:40 -0700144 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700145 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
David Chendd896942017-09-26 11:44:40 -0700146
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700147 // Set up the event
Yao Chen93fe3a32017-11-02 13:52:59 -0700148 LogEvent event(TAG_ID, 0);
Yao Chen80235402017-11-13 20:42:25 -0800149 event.write(11);
David Chen1481fe12017-10-16 13:16:34 -0700150 event.init();
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700151
152 // Test
153
154 // eq_int
155 keyValue->set_eq_int(10);
156 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
157 keyValue->set_eq_int(11);
158 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
159 keyValue->set_eq_int(12);
160 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
161
162 // lt_int
David Chendd896942017-09-26 11:44:40 -0700163 keyValue->set_lt_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700164 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
165 keyValue->set_lt_int(11);
166 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
167 keyValue->set_lt_int(12);
168 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700169
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700170 // lte_int
David Chendd896942017-09-26 11:44:40 -0700171 keyValue->set_lte_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700172 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
173 keyValue->set_lte_int(11);
174 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
175 keyValue->set_lte_int(12);
176 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700177
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700178 // gt_int
179 keyValue->set_gt_int(10);
180 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
181 keyValue->set_gt_int(11);
182 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
183 keyValue->set_gt_int(12);
184 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
185
186 // gte_int
David Chendd896942017-09-26 11:44:40 -0700187 keyValue->set_gte_int(10);
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700188 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
189 keyValue->set_gte_int(11);
190 EXPECT_TRUE(matchesSimple(*simpleMatcher, event));
191 keyValue->set_gte_int(12);
192 EXPECT_FALSE(matchesSimple(*simpleMatcher, event));
David Chendd896942017-09-26 11:44:40 -0700193}
194
195TEST(LogEntryMatcherTest, TestFloatComparisonMatcher) {
196 // Set up the matcher
197 LogEntryMatcher matcher;
198 auto simpleMatcher = matcher.mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700199 simpleMatcher->set_tag(TAG_ID);
200
David Chendd896942017-09-26 11:44:40 -0700201 auto keyValue = simpleMatcher->add_key_value_matcher();
Joe Onoratoc4dfae52017-10-17 23:38:21 -0700202 keyValue->mutable_key_matcher()->set_key(FIELD_ID_1);
David Chendd896942017-09-26 11:44:40 -0700203
Yao Chen80235402017-11-13 20:42:25 -0800204 LogEvent event1(TAG_ID, 0);
David Chendd896942017-09-26 11:44:40 -0700205 keyValue->set_lt_float(10.0);
Yao Chen80235402017-11-13 20:42:25 -0800206 event1.write(10.1f);
207 event1.init();
208 EXPECT_FALSE(matchesSimple(*simpleMatcher, event1));
David Chendd896942017-09-26 11:44:40 -0700209
Yao Chen80235402017-11-13 20:42:25 -0800210 LogEvent event2(TAG_ID, 0);
211 event2.write(9.9f);
212 event2.init();
213 EXPECT_TRUE(matchesSimple(*simpleMatcher, event2));
214
215 LogEvent event3(TAG_ID, 0);
216 event3.write(10.1f);
217 event3.init();
David Chendd896942017-09-26 11:44:40 -0700218 keyValue->set_gt_float(10.0);
Yao Chen80235402017-11-13 20:42:25 -0800219 EXPECT_TRUE(matchesSimple(*simpleMatcher, event3));
220
221 LogEvent event4(TAG_ID, 0);
222 event4.write(9.9f);
223 event4.init();
224 EXPECT_FALSE(matchesSimple(*simpleMatcher, event4));
David Chendd896942017-09-26 11:44:40 -0700225}
226
227// Helper for the composite matchers.
Stefan Lafoncdb1a0e2017-09-27 20:24:15 -0700228void addSimpleMatcher(SimpleLogEntryMatcher* simpleMatcher, int tag, int key, int val) {
Yao Chen729093d2017-10-16 10:33:26 -0700229 simpleMatcher->set_tag(tag);
David Chendd896942017-09-26 11:44:40 -0700230 auto keyValue = simpleMatcher->add_key_value_matcher();
231 keyValue->mutable_key_matcher()->set_key(key);
232 keyValue->set_eq_int(val);
233}
234
235TEST(LogEntryMatcherTest, TestAndMatcher) {
236 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700237 LogicalOperation operation = LogicalOperation::AND;
David Chendd896942017-09-26 11:44:40 -0700238
Yao Chencaf339d2017-10-06 16:01:10 -0700239 vector<int> children;
240 children.push_back(0);
241 children.push_back(1);
242 children.push_back(2);
David Chendd896942017-09-26 11:44:40 -0700243
Yao Chencaf339d2017-10-06 16:01:10 -0700244 vector<MatchingState> matcherResults;
245 matcherResults.push_back(MatchingState::kMatched);
246 matcherResults.push_back(MatchingState::kNotMatched);
247 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700248
Yao Chencaf339d2017-10-06 16:01:10 -0700249 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
250
251 matcherResults.clear();
252 matcherResults.push_back(MatchingState::kMatched);
253 matcherResults.push_back(MatchingState::kMatched);
254 matcherResults.push_back(MatchingState::kMatched);
255
256 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700257}
258
259TEST(LogEntryMatcherTest, TestOrMatcher) {
260 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700261 LogicalOperation operation = LogicalOperation::OR;
David Chendd896942017-09-26 11:44:40 -0700262
Yao Chencaf339d2017-10-06 16:01:10 -0700263 vector<int> children;
264 children.push_back(0);
265 children.push_back(1);
266 children.push_back(2);
David Chendd896942017-09-26 11:44:40 -0700267
Yao Chencaf339d2017-10-06 16:01:10 -0700268 vector<MatchingState> matcherResults;
269 matcherResults.push_back(MatchingState::kMatched);
270 matcherResults.push_back(MatchingState::kNotMatched);
271 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700272
Yao Chencaf339d2017-10-06 16:01:10 -0700273 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
274
275 matcherResults.clear();
276 matcherResults.push_back(MatchingState::kNotMatched);
277 matcherResults.push_back(MatchingState::kNotMatched);
278 matcherResults.push_back(MatchingState::kNotMatched);
279
280 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700281}
282
283TEST(LogEntryMatcherTest, TestNotMatcher) {
284 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700285 LogicalOperation operation = LogicalOperation::NOT;
David Chendd896942017-09-26 11:44:40 -0700286
Yao Chencaf339d2017-10-06 16:01:10 -0700287 vector<int> children;
288 children.push_back(0);
David Chendd896942017-09-26 11:44:40 -0700289
Yao Chencaf339d2017-10-06 16:01:10 -0700290 vector<MatchingState> matcherResults;
291 matcherResults.push_back(MatchingState::kMatched);
David Chendd896942017-09-26 11:44:40 -0700292
Yao Chencaf339d2017-10-06 16:01:10 -0700293 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
294
295 matcherResults.clear();
296 matcherResults.push_back(MatchingState::kNotMatched);
297 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700298}
299
Yao Chencaf339d2017-10-06 16:01:10 -0700300TEST(LogEntryMatcherTest, TestNandMatcher) {
David Chendd896942017-09-26 11:44:40 -0700301 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700302 LogicalOperation operation = LogicalOperation::NAND;
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_TRUE(combinationMatch(children, operation, matcherResults));
313
314 matcherResults.clear();
315 matcherResults.push_back(MatchingState::kNotMatched);
316 matcherResults.push_back(MatchingState::kNotMatched);
317 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
318
319 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}
324
Yao Chencaf339d2017-10-06 16:01:10 -0700325TEST(LogEntryMatcherTest, TestNorMatcher) {
David Chendd896942017-09-26 11:44:40 -0700326 // Set up the matcher
Yao Chencaf339d2017-10-06 16:01:10 -0700327 LogicalOperation operation = LogicalOperation::NOR;
David Chendd896942017-09-26 11:44:40 -0700328
Yao Chencaf339d2017-10-06 16:01:10 -0700329 vector<int> children;
330 children.push_back(0);
331 children.push_back(1);
David Chendd896942017-09-26 11:44:40 -0700332
Yao Chencaf339d2017-10-06 16:01:10 -0700333 vector<MatchingState> matcherResults;
334 matcherResults.push_back(MatchingState::kMatched);
335 matcherResults.push_back(MatchingState::kNotMatched);
David Chendd896942017-09-26 11:44:40 -0700336
Yao Chencaf339d2017-10-06 16:01:10 -0700337 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700338
Yao Chencaf339d2017-10-06 16:01:10 -0700339 matcherResults.clear();
340 matcherResults.push_back(MatchingState::kNotMatched);
341 matcherResults.push_back(MatchingState::kNotMatched);
342 EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700343
Yao Chencaf339d2017-10-06 16:01:10 -0700344 matcherResults.clear();
345 matcherResults.push_back(MatchingState::kMatched);
346 matcherResults.push_back(MatchingState::kMatched);
347 EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
David Chendd896942017-09-26 11:44:40 -0700348}
Stefan Lafoncdb1a0e2017-09-27 20:24:15 -0700349
David Chendd896942017-09-26 11:44:40 -0700350#else
Yao Chen44cf27c2017-09-14 22:32:50 -0700351GTEST_LOG_(INFO) << "This test does nothing.\n";
David Chendd896942017-09-26 11:44:40 -0700352#endif