Home | History | Annotate | Download | only in tests
      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 "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
     16 #include "matchers/matcher_util.h"
     17 #include "stats_log_util.h"
     18 #include "stats_util.h"
     19 
     20 #include <gtest/gtest.h>
     21 #include <log/log_event_list.h>
     22 #include <log/log_read.h>
     23 #include <log/logprint.h>
     24 
     25 #include <stdio.h>
     26 
     27 using namespace android::os::statsd;
     28 using std::unordered_map;
     29 using std::vector;
     30 
     31 const int32_t TAG_ID = 123;
     32 const int FIELD_ID_1 = 1;
     33 const int FIELD_ID_2 = 2;
     34 const int FIELD_ID_3 = 2;
     35 
     36 const int ATTRIBUTION_UID_FIELD_ID = 1;
     37 const int ATTRIBUTION_TAG_FIELD_ID = 2;
     38 
     39 
     40 #ifdef __ANDROID__
     41 TEST(AtomMatcherTest, TestSimpleMatcher) {
     42     UidMap uidMap;
     43 
     44     // Set up the matcher
     45     AtomMatcher matcher;
     46     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
     47     simpleMatcher->set_atom_id(TAG_ID);
     48 
     49     LogEvent event(TAG_ID, 0);
     50     EXPECT_TRUE(event.write(11));
     51     event.init();
     52 
     53     // Test
     54     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
     55 
     56     // Wrong tag id.
     57     simpleMatcher->set_atom_id(TAG_ID + 1);
     58     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
     59 }
     60 
     61 TEST(AtomMatcherTest, TestAttributionMatcher) {
     62     UidMap uidMap;
     63     AttributionNodeInternal attribution_node1;
     64     attribution_node1.set_uid(1111);
     65     attribution_node1.set_tag("location1");
     66 
     67     AttributionNodeInternal attribution_node2;
     68     attribution_node2.set_uid(2222);
     69     attribution_node2.set_tag("location2");
     70 
     71     AttributionNodeInternal attribution_node3;
     72     attribution_node3.set_uid(3333);
     73     attribution_node3.set_tag("location3");
     74     std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2,
     75                                                               attribution_node3};
     76 
     77     // Set up the event
     78     LogEvent event(TAG_ID, 0);
     79     event.write(attribution_nodes);
     80     event.write("some value");
     81     // Convert to a LogEvent
     82     event.init();
     83 
     84     // Set up the matcher
     85     AtomMatcher matcher;
     86     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
     87     simpleMatcher->set_atom_id(TAG_ID);
     88 
     89     // Match first node.
     90     auto attributionMatcher = simpleMatcher->add_field_value_matcher();
     91     attributionMatcher->set_field(FIELD_ID_1);
     92     attributionMatcher->set_position(Position::FIRST);
     93     attributionMatcher->mutable_matches_tuple()->add_field_value_matcher()->set_field(
     94         ATTRIBUTION_TAG_FIELD_ID);
     95     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)->set_eq_string("tag");
     96 
     97     auto fieldMatcher = simpleMatcher->add_field_value_matcher();
     98     fieldMatcher->set_field(FIELD_ID_2);
     99     fieldMatcher->set_eq_string("some value");
    100 
    101     // Tag not matched.
    102     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    103     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    104         ->set_eq_string("location3");
    105     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    106     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    107         ->set_eq_string("location1");
    108     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    109 
    110     // Match last node.
    111     attributionMatcher->set_position(Position::LAST);
    112     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    113     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    114         ->set_eq_string("location3");
    115     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    116 
    117     // Match any node.
    118     attributionMatcher->set_position(Position::ANY);
    119     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    120     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    121         ->set_eq_string("location1");
    122     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    123     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    124         ->set_eq_string("location2");
    125     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    126     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    127         ->set_eq_string("location3");
    128     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    129     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    130         ->set_eq_string("location4");
    131     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    132 
    133     // Attribution match but primitive field not match.
    134     attributionMatcher->set_position(Position::ANY);
    135     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    136         ->set_eq_string("location2");
    137     fieldMatcher->set_eq_string("wrong value");
    138     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    139 
    140     fieldMatcher->set_eq_string("some value");
    141 
    142     // Uid match.
    143     attributionMatcher->set_position(Position::ANY);
    144     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)->set_field(
    145         ATTRIBUTION_UID_FIELD_ID);
    146     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)->set_eq_string("pkg0");
    147     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    148 
    149     uidMap.updateMap(
    150             1, {1111, 1111, 2222, 3333, 3333} /* uid list */, {1, 1, 2, 1, 2} /* version list */,
    151             {android::String16("pkg0"), android::String16("pkg1"), android::String16("pkg1"),
    152              android::String16("Pkg2"), android::String16("PkG3")} /* package name list */);
    153 
    154     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    155     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    156         ->set_eq_string("pkg3");
    157     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    158     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    159         ->set_eq_string("pkg2");
    160     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    161     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    162         ->set_eq_string("pkg1");
    163     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    164     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    165         ->set_eq_string("pkg0");
    166     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    167 
    168     attributionMatcher->set_position(Position::FIRST);
    169     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    170         ->set_eq_string("pkg0");
    171     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    172     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    173         ->set_eq_string("pkg3");
    174     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    175     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    176         ->set_eq_string("pkg2");
    177     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    178     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    179         ->set_eq_string("pkg1");
    180     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    181 
    182     attributionMatcher->set_position(Position::LAST);
    183     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    184         ->set_eq_string("pkg0");
    185     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    186     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    187         ->set_eq_string("pkg3");
    188     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    189     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    190         ->set_eq_string("pkg2");
    191     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    192     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    193         ->set_eq_string("pkg1");
    194     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    195 
    196     // Uid + tag.
    197     attributionMatcher->set_position(Position::ANY);
    198     attributionMatcher->mutable_matches_tuple()->add_field_value_matcher()->set_field(
    199         ATTRIBUTION_TAG_FIELD_ID);
    200     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    201         ->set_eq_string("pkg0");
    202     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    203         ->set_eq_string("location1");
    204     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    205     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    206         ->set_eq_string("pkg1");
    207     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    208         ->set_eq_string("location1");
    209     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    210     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    211         ->set_eq_string("pkg1");
    212     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    213         ->set_eq_string("location2");
    214     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    215     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    216         ->set_eq_string("pkg2");
    217     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    218         ->set_eq_string("location3");
    219     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    220     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    221         ->set_eq_string("pkg3");
    222     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    223         ->set_eq_string("location3");
    224     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    225     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    226         ->set_eq_string("pkg3");
    227     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    228         ->set_eq_string("location1");
    229     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    230 
    231     attributionMatcher->set_position(Position::FIRST);
    232     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    233         ->set_eq_string("pkg0");
    234     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    235         ->set_eq_string("location1");
    236     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    237     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    238         ->set_eq_string("pkg1");
    239     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    240         ->set_eq_string("location1");
    241     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    242     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    243         ->set_eq_string("pkg1");
    244     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    245         ->set_eq_string("location2");
    246     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    247     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    248         ->set_eq_string("pkg2");
    249     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    250         ->set_eq_string("location3");
    251     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    252     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    253         ->set_eq_string("pkg3");
    254     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    255         ->set_eq_string("location3");
    256     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    257     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    258         ->set_eq_string("pkg3");
    259     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    260         ->set_eq_string("location1");
    261     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    262 
    263     attributionMatcher->set_position(Position::LAST);
    264     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    265         ->set_eq_string("pkg0");
    266     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    267         ->set_eq_string("location1");
    268     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    269     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    270         ->set_eq_string("pkg1");
    271     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    272         ->set_eq_string("location1");
    273     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    274     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    275         ->set_eq_string("pkg1");
    276     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    277         ->set_eq_string("location2");
    278     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    279     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    280         ->set_eq_string("pkg2");
    281     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    282         ->set_eq_string("location3");
    283     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    284     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    285         ->set_eq_string("pkg3");
    286     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    287         ->set_eq_string("location3");
    288     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    289     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
    290         ->set_eq_string("pkg3");
    291     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(1)
    292         ->set_eq_string("location1");
    293     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    294 }
    295 
    296 TEST(AtomMatcherTest, TestNeqAnyStringMatcher) {
    297     UidMap uidMap;
    298     uidMap.updateMap(
    299             1, {1111, 1111, 2222, 3333, 3333} /* uid list */, {1, 1, 2, 1, 2} /* version list */,
    300             {android::String16("pkg0"), android::String16("pkg1"), android::String16("pkg1"),
    301              android::String16("Pkg2"), android::String16("PkG3")} /* package name list */);
    302 
    303     AttributionNodeInternal attribution_node1;
    304     attribution_node1.set_uid(1111);
    305     attribution_node1.set_tag("location1");
    306 
    307     AttributionNodeInternal attribution_node2;
    308     attribution_node2.set_uid(2222);
    309     attribution_node2.set_tag("location2");
    310 
    311     AttributionNodeInternal attribution_node3;
    312     attribution_node3.set_uid(3333);
    313     attribution_node3.set_tag("location3");
    314 
    315     AttributionNodeInternal attribution_node4;
    316     attribution_node4.set_uid(1066);
    317     attribution_node4.set_tag("location3");
    318     std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2,
    319                                                               attribution_node3, attribution_node4};
    320 
    321     // Set up the event
    322     LogEvent event(TAG_ID, 0);
    323     event.write(attribution_nodes);
    324     event.write("some value");
    325     // Convert to a LogEvent
    326     event.init();
    327 
    328     // Set up the matcher
    329     AtomMatcher matcher;
    330     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
    331     simpleMatcher->set_atom_id(TAG_ID);
    332 
    333     // Match first node.
    334     auto attributionMatcher = simpleMatcher->add_field_value_matcher();
    335     attributionMatcher->set_field(FIELD_ID_1);
    336     attributionMatcher->set_position(Position::FIRST);
    337     attributionMatcher->mutable_matches_tuple()->add_field_value_matcher()->set_field(
    338             ATTRIBUTION_UID_FIELD_ID);
    339     auto neqStringList = attributionMatcher->mutable_matches_tuple()
    340                                  ->mutable_field_value_matcher(0)
    341                                  ->mutable_neq_any_string();
    342     neqStringList->add_str_value("pkg2");
    343     neqStringList->add_str_value("pkg3");
    344 
    345     auto fieldMatcher = simpleMatcher->add_field_value_matcher();
    346     fieldMatcher->set_field(FIELD_ID_2);
    347     fieldMatcher->set_eq_string("some value");
    348 
    349     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    350 
    351     neqStringList->Clear();
    352     neqStringList->add_str_value("pkg1");
    353     neqStringList->add_str_value("pkg3");
    354     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    355 
    356     attributionMatcher->set_position(Position::ANY);
    357     neqStringList->Clear();
    358     neqStringList->add_str_value("maps.com");
    359     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    360 
    361     neqStringList->Clear();
    362     neqStringList->add_str_value("PkG3");
    363     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    364 
    365     attributionMatcher->set_position(Position::LAST);
    366     neqStringList->Clear();
    367     neqStringList->add_str_value("AID_STATSD");
    368     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    369 }
    370 
    371 TEST(AtomMatcherTest, TestEqAnyStringMatcher) {
    372     UidMap uidMap;
    373     uidMap.updateMap(
    374             1, {1111, 1111, 2222, 3333, 3333} /* uid list */, {1, 1, 2, 1, 2} /* version list */,
    375             {android::String16("pkg0"), android::String16("pkg1"), android::String16("pkg1"),
    376              android::String16("Pkg2"), android::String16("PkG3")} /* package name list */);
    377 
    378     AttributionNodeInternal attribution_node1;
    379     attribution_node1.set_uid(1067);
    380     attribution_node1.set_tag("location1");
    381 
    382     AttributionNodeInternal attribution_node2;
    383     attribution_node2.set_uid(2222);
    384     attribution_node2.set_tag("location2");
    385 
    386     AttributionNodeInternal attribution_node3;
    387     attribution_node3.set_uid(3333);
    388     attribution_node3.set_tag("location3");
    389 
    390     AttributionNodeInternal attribution_node4;
    391     attribution_node4.set_uid(1066);
    392     attribution_node4.set_tag("location3");
    393     std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2,
    394                                                               attribution_node3, attribution_node4};
    395 
    396     // Set up the event
    397     LogEvent event(TAG_ID, 0);
    398     event.write(attribution_nodes);
    399     event.write("some value");
    400     // Convert to a LogEvent
    401     event.init();
    402 
    403     // Set up the matcher
    404     AtomMatcher matcher;
    405     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
    406     simpleMatcher->set_atom_id(TAG_ID);
    407 
    408     // Match first node.
    409     auto attributionMatcher = simpleMatcher->add_field_value_matcher();
    410     attributionMatcher->set_field(FIELD_ID_1);
    411     attributionMatcher->set_position(Position::FIRST);
    412     attributionMatcher->mutable_matches_tuple()->add_field_value_matcher()->set_field(
    413             ATTRIBUTION_UID_FIELD_ID);
    414     auto eqStringList = attributionMatcher->mutable_matches_tuple()
    415                                 ->mutable_field_value_matcher(0)
    416                                 ->mutable_eq_any_string();
    417     eqStringList->add_str_value("AID_ROOT");
    418     eqStringList->add_str_value("AID_INCIDENTD");
    419 
    420     auto fieldMatcher = simpleMatcher->add_field_value_matcher();
    421     fieldMatcher->set_field(FIELD_ID_2);
    422     fieldMatcher->set_eq_string("some value");
    423 
    424     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    425 
    426     attributionMatcher->set_position(Position::ANY);
    427     eqStringList->Clear();
    428     eqStringList->add_str_value("AID_STATSD");
    429     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    430 
    431     eqStringList->Clear();
    432     eqStringList->add_str_value("pkg1");
    433     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    434 
    435     auto normalStringField = fieldMatcher->mutable_eq_any_string();
    436     normalStringField->add_str_value("some value123");
    437     normalStringField->add_str_value("some value");
    438     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    439 
    440     normalStringField->Clear();
    441     normalStringField->add_str_value("AID_STATSD");
    442     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    443 
    444     eqStringList->Clear();
    445     eqStringList->add_str_value("maps.com");
    446     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    447 }
    448 
    449 TEST(AtomMatcherTest, TestBoolMatcher) {
    450     UidMap uidMap;
    451     // Set up the matcher
    452     AtomMatcher matcher;
    453     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
    454     simpleMatcher->set_atom_id(TAG_ID);
    455     auto keyValue1 = simpleMatcher->add_field_value_matcher();
    456     keyValue1->set_field(FIELD_ID_1);
    457     auto keyValue2 = simpleMatcher->add_field_value_matcher();
    458     keyValue2->set_field(FIELD_ID_2);
    459 
    460     // Set up the event
    461     LogEvent event(TAG_ID, 0);
    462     EXPECT_TRUE(event.write(true));
    463     EXPECT_TRUE(event.write(false));
    464     // Convert to a LogEvent
    465     event.init();
    466 
    467     // Test
    468     keyValue1->set_eq_bool(true);
    469     keyValue2->set_eq_bool(false);
    470     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    471 
    472     keyValue1->set_eq_bool(false);
    473     keyValue2->set_eq_bool(false);
    474     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    475 
    476     keyValue1->set_eq_bool(false);
    477     keyValue2->set_eq_bool(true);
    478     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    479 
    480     keyValue1->set_eq_bool(true);
    481     keyValue2->set_eq_bool(true);
    482     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    483 }
    484 
    485 TEST(AtomMatcherTest, TestStringMatcher) {
    486     UidMap uidMap;
    487     // Set up the matcher
    488     AtomMatcher matcher;
    489     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
    490     simpleMatcher->set_atom_id(TAG_ID);
    491     auto keyValue = simpleMatcher->add_field_value_matcher();
    492     keyValue->set_field(FIELD_ID_1);
    493     keyValue->set_eq_string("some value");
    494 
    495     // Set up the event
    496     LogEvent event(TAG_ID, 0);
    497     event.write("some value");
    498     // Convert to a LogEvent
    499     event.init();
    500 
    501     // Test
    502     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    503 }
    504 
    505 TEST(AtomMatcherTest, TestMultiFieldsMatcher) {
    506     UidMap uidMap;
    507     // Set up the matcher
    508     AtomMatcher matcher;
    509     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
    510     simpleMatcher->set_atom_id(TAG_ID);
    511     auto keyValue1 = simpleMatcher->add_field_value_matcher();
    512     keyValue1->set_field(FIELD_ID_1);
    513     auto keyValue2 = simpleMatcher->add_field_value_matcher();
    514     keyValue2->set_field(FIELD_ID_2);
    515 
    516     // Set up the event
    517     LogEvent event(TAG_ID, 0);
    518     event.write(2);
    519     event.write(3);
    520 
    521     // Convert to a LogEvent
    522     event.init();
    523 
    524     // Test
    525     keyValue1->set_eq_int(2);
    526     keyValue2->set_eq_int(3);
    527     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    528 
    529     keyValue1->set_eq_int(2);
    530     keyValue2->set_eq_int(4);
    531     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    532 
    533     keyValue1->set_eq_int(4);
    534     keyValue2->set_eq_int(3);
    535     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    536 }
    537 
    538 TEST(AtomMatcherTest, TestIntComparisonMatcher) {
    539     UidMap uidMap;
    540     // Set up the matcher
    541     AtomMatcher matcher;
    542     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
    543 
    544     simpleMatcher->set_atom_id(TAG_ID);
    545     auto keyValue = simpleMatcher->add_field_value_matcher();
    546     keyValue->set_field(FIELD_ID_1);
    547 
    548     // Set up the event
    549     LogEvent event(TAG_ID, 0);
    550     event.write(11);
    551     event.init();
    552 
    553     // Test
    554 
    555     // eq_int
    556     keyValue->set_eq_int(10);
    557     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    558     keyValue->set_eq_int(11);
    559     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    560     keyValue->set_eq_int(12);
    561     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    562 
    563     // lt_int
    564     keyValue->set_lt_int(10);
    565     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    566     keyValue->set_lt_int(11);
    567     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    568     keyValue->set_lt_int(12);
    569     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    570 
    571     // lte_int
    572     keyValue->set_lte_int(10);
    573     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    574     keyValue->set_lte_int(11);
    575     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    576     keyValue->set_lte_int(12);
    577     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    578 
    579     // gt_int
    580     keyValue->set_gt_int(10);
    581     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    582     keyValue->set_gt_int(11);
    583     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    584     keyValue->set_gt_int(12);
    585     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    586 
    587     // gte_int
    588     keyValue->set_gte_int(10);
    589     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    590     keyValue->set_gte_int(11);
    591     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
    592     keyValue->set_gte_int(12);
    593     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
    594 }
    595 
    596 TEST(AtomMatcherTest, TestFloatComparisonMatcher) {
    597     UidMap uidMap;
    598     // Set up the matcher
    599     AtomMatcher matcher;
    600     auto simpleMatcher = matcher.mutable_simple_atom_matcher();
    601     simpleMatcher->set_atom_id(TAG_ID);
    602 
    603     auto keyValue = simpleMatcher->add_field_value_matcher();
    604     keyValue->set_field(FIELD_ID_1);
    605 
    606     LogEvent event1(TAG_ID, 0);
    607     keyValue->set_lt_float(10.0);
    608     event1.write(10.1f);
    609     event1.init();
    610     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event1));
    611 
    612     LogEvent event2(TAG_ID, 0);
    613     event2.write(9.9f);
    614     event2.init();
    615     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event2));
    616 
    617     LogEvent event3(TAG_ID, 0);
    618     event3.write(10.1f);
    619     event3.init();
    620     keyValue->set_gt_float(10.0);
    621     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event3));
    622 
    623     LogEvent event4(TAG_ID, 0);
    624     event4.write(9.9f);
    625     event4.init();
    626     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event4));
    627 }
    628 
    629 // Helper for the composite matchers.
    630 void addSimpleMatcher(SimpleAtomMatcher* simpleMatcher, int tag, int key, int val) {
    631     simpleMatcher->set_atom_id(tag);
    632     auto keyValue = simpleMatcher->add_field_value_matcher();
    633     keyValue->set_field(key);
    634     keyValue->set_eq_int(val);
    635 }
    636 
    637 TEST(AtomMatcherTest, TestAndMatcher) {
    638     // Set up the matcher
    639     LogicalOperation operation = LogicalOperation::AND;
    640 
    641     vector<int> children;
    642     children.push_back(0);
    643     children.push_back(1);
    644     children.push_back(2);
    645 
    646     vector<MatchingState> matcherResults;
    647     matcherResults.push_back(MatchingState::kMatched);
    648     matcherResults.push_back(MatchingState::kNotMatched);
    649     matcherResults.push_back(MatchingState::kMatched);
    650 
    651     EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
    652 
    653     matcherResults.clear();
    654     matcherResults.push_back(MatchingState::kMatched);
    655     matcherResults.push_back(MatchingState::kMatched);
    656     matcherResults.push_back(MatchingState::kMatched);
    657 
    658     EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
    659 }
    660 
    661 TEST(AtomMatcherTest, TestOrMatcher) {
    662     // Set up the matcher
    663     LogicalOperation operation = LogicalOperation::OR;
    664 
    665     vector<int> children;
    666     children.push_back(0);
    667     children.push_back(1);
    668     children.push_back(2);
    669 
    670     vector<MatchingState> matcherResults;
    671     matcherResults.push_back(MatchingState::kMatched);
    672     matcherResults.push_back(MatchingState::kNotMatched);
    673     matcherResults.push_back(MatchingState::kMatched);
    674 
    675     EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
    676 
    677     matcherResults.clear();
    678     matcherResults.push_back(MatchingState::kNotMatched);
    679     matcherResults.push_back(MatchingState::kNotMatched);
    680     matcherResults.push_back(MatchingState::kNotMatched);
    681 
    682     EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
    683 }
    684 
    685 TEST(AtomMatcherTest, TestNotMatcher) {
    686     // Set up the matcher
    687     LogicalOperation operation = LogicalOperation::NOT;
    688 
    689     vector<int> children;
    690     children.push_back(0);
    691 
    692     vector<MatchingState> matcherResults;
    693     matcherResults.push_back(MatchingState::kMatched);
    694 
    695     EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
    696 
    697     matcherResults.clear();
    698     matcherResults.push_back(MatchingState::kNotMatched);
    699     EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
    700 }
    701 
    702 TEST(AtomMatcherTest, TestNandMatcher) {
    703     // Set up the matcher
    704     LogicalOperation operation = LogicalOperation::NAND;
    705 
    706     vector<int> children;
    707     children.push_back(0);
    708     children.push_back(1);
    709 
    710     vector<MatchingState> matcherResults;
    711     matcherResults.push_back(MatchingState::kMatched);
    712     matcherResults.push_back(MatchingState::kNotMatched);
    713 
    714     EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
    715 
    716     matcherResults.clear();
    717     matcherResults.push_back(MatchingState::kNotMatched);
    718     matcherResults.push_back(MatchingState::kNotMatched);
    719     EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
    720 
    721     matcherResults.clear();
    722     matcherResults.push_back(MatchingState::kMatched);
    723     matcherResults.push_back(MatchingState::kMatched);
    724     EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
    725 }
    726 
    727 TEST(AtomMatcherTest, TestNorMatcher) {
    728     // Set up the matcher
    729     LogicalOperation operation = LogicalOperation::NOR;
    730 
    731     vector<int> children;
    732     children.push_back(0);
    733     children.push_back(1);
    734 
    735     vector<MatchingState> matcherResults;
    736     matcherResults.push_back(MatchingState::kMatched);
    737     matcherResults.push_back(MatchingState::kNotMatched);
    738 
    739     EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
    740 
    741     matcherResults.clear();
    742     matcherResults.push_back(MatchingState::kNotMatched);
    743     matcherResults.push_back(MatchingState::kNotMatched);
    744     EXPECT_TRUE(combinationMatch(children, operation, matcherResults));
    745 
    746     matcherResults.clear();
    747     matcherResults.push_back(MatchingState::kMatched);
    748     matcherResults.push_back(MatchingState::kMatched);
    749     EXPECT_FALSE(combinationMatch(children, operation, matcherResults));
    750 }
    751 #else
    752 GTEST_LOG_(INFO) << "This test does nothing.\n";
    753 #endif
    754