tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

rlogconnector_unittest.cpp (7995B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 /* Original author: bcampen@mozilla.com */
      8 
      9 #include "rlogconnector.h"
     10 
     11 extern "C" {
     12 // clang-format off
     13 #include "registry.h"
     14 #include "r_log.h"
     15 // clang-format on
     16 }
     17 
     18 #define GTEST_HAS_RTTI 0
     19 #include <deque>
     20 #include <string>
     21 #include <vector>
     22 
     23 #include "gtest/gtest.h"
     24 
     25 using mozilla::RLogConnector;
     26 
     27 int NR_LOG_TEST = 0;
     28 
     29 class RLogConnectorTest : public ::testing::Test {
     30 public:
     31  RLogConnectorTest() { Init(); }
     32 
     33  ~RLogConnectorTest() { Free(); }
     34 
     35  static void SetUpTestCase() {
     36    NR_reg_init();
     37    r_log_init();
     38    /* Would be nice to be able to unregister in the fixture */
     39    const char* facility = "rlogconnector_test";
     40    r_log_register(const_cast<char*>(facility), &NR_LOG_TEST);
     41  }
     42 
     43  void Init() { RLogConnector::CreateInstance(); }
     44 
     45  void Free() { RLogConnector::DestroyInstance(); }
     46 
     47  void ReInit() {
     48    Free();
     49    Init();
     50  }
     51 };
     52 
     53 TEST_F(RLogConnectorTest, TestGetFree) {
     54  RLogConnector* instance = RLogConnector::GetInstance();
     55  ASSERT_NE(nullptr, instance);
     56 }
     57 
     58 TEST_F(RLogConnectorTest, TestFilterEmpty) {
     59  std::deque<std::string> logs;
     60  RLogConnector::GetInstance()->GetAny(0, &logs);
     61  ASSERT_EQ(0U, logs.size());
     62 }
     63 
     64 TEST_F(RLogConnectorTest, TestBasicFilter) {
     65  r_log(NR_LOG_TEST, LOG_INFO, "Test");
     66  std::deque<std::string> logs;
     67  RLogConnector::GetInstance()->Filter("Test", 0, &logs);
     68  ASSERT_EQ(1U, logs.size());
     69 }
     70 
     71 TEST_F(RLogConnectorTest, TestBasicFilterContent) {
     72  r_log(NR_LOG_TEST, LOG_INFO, "Test");
     73  std::deque<std::string> logs;
     74  RLogConnector::GetInstance()->Filter("Test", 0, &logs);
     75  ASSERT_EQ("Test", logs.back());
     76 }
     77 
     78 TEST_F(RLogConnectorTest, TestFilterAnyFrontMatch) {
     79  r_log(NR_LOG_TEST, LOG_INFO, "Test");
     80  std::vector<std::string> substrings;
     81  substrings.push_back("foo");
     82  substrings.push_back("Test");
     83  std::deque<std::string> logs;
     84  RLogConnector::GetInstance()->FilterAny(substrings, 0, &logs);
     85  ASSERT_EQ("Test", logs.back());
     86 }
     87 
     88 TEST_F(RLogConnectorTest, TestFilterAnyBackMatch) {
     89  r_log(NR_LOG_TEST, LOG_INFO, "Test");
     90  std::vector<std::string> substrings;
     91  substrings.push_back("Test");
     92  substrings.push_back("foo");
     93  std::deque<std::string> logs;
     94  RLogConnector::GetInstance()->FilterAny(substrings, 0, &logs);
     95  ASSERT_EQ("Test", logs.back());
     96 }
     97 
     98 TEST_F(RLogConnectorTest, TestFilterAnyBothMatch) {
     99  r_log(NR_LOG_TEST, LOG_INFO, "Test");
    100  std::vector<std::string> substrings;
    101  substrings.push_back("Tes");
    102  substrings.push_back("est");
    103  std::deque<std::string> logs;
    104  RLogConnector::GetInstance()->FilterAny(substrings, 0, &logs);
    105  ASSERT_EQ("Test", logs.back());
    106 }
    107 
    108 TEST_F(RLogConnectorTest, TestFilterAnyNeitherMatch) {
    109  r_log(NR_LOG_TEST, LOG_INFO, "Test");
    110  std::vector<std::string> substrings;
    111  substrings.push_back("tes");
    112  substrings.push_back("esT");
    113  std::deque<std::string> logs;
    114  RLogConnector::GetInstance()->FilterAny(substrings, 0, &logs);
    115  ASSERT_EQ(0U, logs.size());
    116 }
    117 
    118 TEST_F(RLogConnectorTest, TestAllMatch) {
    119  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    120  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    121  std::deque<std::string> logs;
    122  RLogConnector::GetInstance()->GetAny(0, &logs);
    123  ASSERT_EQ(2U, logs.size());
    124 }
    125 
    126 TEST_F(RLogConnectorTest, TestOrder) {
    127  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    128  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    129  std::deque<std::string> logs;
    130  RLogConnector::GetInstance()->GetAny(0, &logs);
    131  ASSERT_EQ("Test2", logs.back());
    132  ASSERT_EQ("Test1", logs.front());
    133 }
    134 
    135 TEST_F(RLogConnectorTest, TestNoMatch) {
    136  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    137  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    138  std::deque<std::string> logs;
    139  RLogConnector::GetInstance()->Filter("foo", 0, &logs);
    140  ASSERT_EQ(0U, logs.size());
    141 }
    142 
    143 TEST_F(RLogConnectorTest, TestSubstringFilter) {
    144  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    145  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    146  std::deque<std::string> logs;
    147  RLogConnector::GetInstance()->Filter("t1", 0, &logs);
    148  ASSERT_EQ(1U, logs.size());
    149  ASSERT_EQ("Test1", logs.back());
    150 }
    151 
    152 TEST_F(RLogConnectorTest, TestFilterLimit) {
    153  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    154  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    155  r_log(NR_LOG_TEST, LOG_INFO, "Test3");
    156  r_log(NR_LOG_TEST, LOG_INFO, "Test4");
    157  r_log(NR_LOG_TEST, LOG_INFO, "Test5");
    158  r_log(NR_LOG_TEST, LOG_INFO, "Test6");
    159  std::deque<std::string> logs;
    160  RLogConnector::GetInstance()->Filter("Test", 2, &logs);
    161  ASSERT_EQ(2U, logs.size());
    162  ASSERT_EQ("Test6", logs.back());
    163  ASSERT_EQ("Test5", logs.front());
    164 }
    165 
    166 TEST_F(RLogConnectorTest, TestFilterAnyLimit) {
    167  r_log(NR_LOG_TEST, LOG_INFO, "TestOne");
    168  r_log(NR_LOG_TEST, LOG_INFO, "TestTwo");
    169  r_log(NR_LOG_TEST, LOG_INFO, "TestThree");
    170  r_log(NR_LOG_TEST, LOG_INFO, "TestFour");
    171  r_log(NR_LOG_TEST, LOG_INFO, "TestFive");
    172  r_log(NR_LOG_TEST, LOG_INFO, "TestSix");
    173  std::vector<std::string> substrings;
    174  // Matches Two, Three, Four, and Six
    175  substrings.push_back("tT");
    176  substrings.push_back("o");
    177  substrings.push_back("r");
    178  substrings.push_back("S");
    179  std::deque<std::string> logs;
    180  RLogConnector::GetInstance()->FilterAny(substrings, 2, &logs);
    181  ASSERT_EQ(2U, logs.size());
    182  ASSERT_EQ("TestSix", logs.back());
    183  ASSERT_EQ("TestFour", logs.front());
    184 }
    185 
    186 TEST_F(RLogConnectorTest, TestLimit) {
    187  RLogConnector::GetInstance()->SetLogLimit(3);
    188  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    189  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    190  r_log(NR_LOG_TEST, LOG_INFO, "Test3");
    191  r_log(NR_LOG_TEST, LOG_INFO, "Test4");
    192  r_log(NR_LOG_TEST, LOG_INFO, "Test5");
    193  r_log(NR_LOG_TEST, LOG_INFO, "Test6");
    194  std::deque<std::string> logs;
    195  RLogConnector::GetInstance()->GetAny(0, &logs);
    196  ASSERT_EQ(3U, logs.size());
    197  ASSERT_EQ("Test6", logs.back());
    198  ASSERT_EQ("Test4", logs.front());
    199 }
    200 
    201 TEST_F(RLogConnectorTest, TestLimitBulkDiscard) {
    202  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    203  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    204  r_log(NR_LOG_TEST, LOG_INFO, "Test3");
    205  r_log(NR_LOG_TEST, LOG_INFO, "Test4");
    206  r_log(NR_LOG_TEST, LOG_INFO, "Test5");
    207  r_log(NR_LOG_TEST, LOG_INFO, "Test6");
    208  RLogConnector::GetInstance()->SetLogLimit(3);
    209  std::deque<std::string> logs;
    210  RLogConnector::GetInstance()->GetAny(0, &logs);
    211  ASSERT_EQ(3U, logs.size());
    212  ASSERT_EQ("Test6", logs.back());
    213  ASSERT_EQ("Test4", logs.front());
    214 }
    215 
    216 TEST_F(RLogConnectorTest, TestIncreaseLimit) {
    217  RLogConnector::GetInstance()->SetLogLimit(3);
    218  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    219  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    220  r_log(NR_LOG_TEST, LOG_INFO, "Test3");
    221  r_log(NR_LOG_TEST, LOG_INFO, "Test4");
    222  r_log(NR_LOG_TEST, LOG_INFO, "Test5");
    223  r_log(NR_LOG_TEST, LOG_INFO, "Test6");
    224  RLogConnector::GetInstance()->SetLogLimit(300);
    225  std::deque<std::string> logs;
    226  RLogConnector::GetInstance()->GetAny(0, &logs);
    227  ASSERT_EQ(3U, logs.size());
    228  ASSERT_EQ("Test6", logs.back());
    229  ASSERT_EQ("Test4", logs.front());
    230 }
    231 
    232 TEST_F(RLogConnectorTest, TestClear) {
    233  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    234  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    235  r_log(NR_LOG_TEST, LOG_INFO, "Test3");
    236  r_log(NR_LOG_TEST, LOG_INFO, "Test4");
    237  r_log(NR_LOG_TEST, LOG_INFO, "Test5");
    238  r_log(NR_LOG_TEST, LOG_INFO, "Test6");
    239  RLogConnector::GetInstance()->SetLogLimit(0);
    240  RLogConnector::GetInstance()->SetLogLimit(4096);
    241  std::deque<std::string> logs;
    242  RLogConnector::GetInstance()->GetAny(0, &logs);
    243  ASSERT_EQ(0U, logs.size());
    244 }
    245 
    246 TEST_F(RLogConnectorTest, TestReInit) {
    247  r_log(NR_LOG_TEST, LOG_INFO, "Test1");
    248  r_log(NR_LOG_TEST, LOG_INFO, "Test2");
    249  r_log(NR_LOG_TEST, LOG_INFO, "Test3");
    250  r_log(NR_LOG_TEST, LOG_INFO, "Test4");
    251  r_log(NR_LOG_TEST, LOG_INFO, "Test5");
    252  r_log(NR_LOG_TEST, LOG_INFO, "Test6");
    253  ReInit();
    254  std::deque<std::string> logs;
    255  RLogConnector::GetInstance()->GetAny(0, &logs);
    256  ASSERT_EQ(0U, logs.size());
    257 }