media/mtransport/test/rlogringbuffer_unittest.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

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

mercurial