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 }