proxygen
LoggingTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-present, Facebook, Inc.
3  * All rights reserved.
4  *
5  * This source code is licensed under the BSD-style license found in the
6  * LICENSE file in the root directory of this source tree. An additional grant
7  * of patent rights can be found in the PATENTS file in the same directory.
8  *
9  */
10 #include <folly/io/IOBuf.h>
11 #include <glog/logging.h>
14 
15 using namespace folly;
16 using namespace proxygen;
17 using namespace std;
18 using namespace testing;
19 
20 class LoggingTests : public testing::Test {
21 };
22 
23 TEST_F(LoggingTests, PrintHexIobuf) {
24  unique_ptr<IOBuf> buf = IOBuf::create(128);
25  EXPECT_EQ(IOBufPrinter::printHexFolly(buf.get()), "");
26  EXPECT_EQ(IOBufPrinter::printHex16(buf.get()), "");
27 
28  uint8_t* data = buf->writableData();
29  data[0] = 0x0C;
30  data[1] = 0xFF;
31  data[2] = 0x00;
32  data[3] = 0x10;
33  buf->append(4);
34  EXPECT_TRUE(IOBufPrinter::printHexFolly(buf.get()) != "");
35  EXPECT_EQ(IOBufPrinter::printHex16(buf.get()), "0cff 0010 ");
36 
37  // some linewrap
38  for (int i = 0; i < 16; i++) {
39  data[4 + i] = 0xFE;
40  }
41  buf->append(16);
42  EXPECT_TRUE(IOBufPrinter::printHexFolly(buf.get()) != "");
43  string info = IOBufPrinter::printChainInfo(buf.get());
44  EXPECT_TRUE(info.find("iobuf of size 20 tailroom ") != string::npos);
45  EXPECT_EQ(IOBufPrinter::printHex16(buf.get()),
46  "0cff 0010 fefe fefe fefe fefe fefe fefe \nfefe fefe ");
47 }
48 
49 TEST_F(LoggingTests, HexString) {
50  uint8_t buf[] = {
51  0x03, 0x04, 0x11, 0x22, 0xBB, 0xAA
52  };
53  string s((const char *)buf, sizeof(buf));
54  EXPECT_EQ("03041122bbaa", hexStr(s));
55 }
56 
57 TEST_F(LoggingTests, DumpBin) {
58  // null IOBuf
59  EXPECT_EQ(IOBufPrinter::printBin(nullptr), "");
60 
61  unique_ptr<IOBuf> b1 = IOBuf::create(128);
62  b1->writableData()[0] = 0x33;
63  b1->writableData()[1] = 0x77;
64  b1->append(2);
65  unique_ptr<IOBuf> b2 = IOBuf::create(128);
66  b2->writableData()[0] = 0xFF;
67  b2->append(1);
68  b1->appendChain(std::move(b2));
69  EXPECT_EQ(IOBufPrinter::printBin(b1.get()),
70  "00110011 3 01110111 w \n11111111 \n");
71  // with coalescing
72  EXPECT_EQ(IOBufPrinter::printBin(b1.get(), true),
73  "00110011 3 01110111 w 11111111 \n");
74 }
75 
76 TEST_F(LoggingTests, DumpBinToFile) {
77  struct stat fstat;
78  string tmpfile("/tmp/test.bin");
79 
80  unlink(tmpfile.c_str());
81  unique_ptr<IOBuf> buf = IOBuf::create(128);
82  // the content doesn't matter
83  buf->append(2);
84  dumpBinToFile(tmpfile, buf.get());
85  EXPECT_EQ(stat(tmpfile.c_str(), &fstat), 0);
86 
87  // check if it's going to overwrite the existing file
88  buf->append(4);
89  dumpBinToFile(tmpfile, buf.get());
90  EXPECT_EQ(stat(tmpfile.c_str(), &fstat), 0);
91  EXPECT_EQ(fstat.st_size, 2);
92  unlink(tmpfile.c_str());
93 
94  // null iobuf
95  dumpBinToFile(tmpfile, nullptr);
96  // unable to open file
97  dumpBinToFile("/proc/test", nullptr);
98 }
99 
100 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_TEST) {
101  EXPECT_THROW([]{
102  CHECK_LOG_AND_THROW(false, ERROR, runtime_error)
103  << "Test log and exception message";
104  }(), runtime_error);
105  EXPECT_NO_THROW([]{
106  CHECK_LOG_AND_THROW(true, ERROR, runtime_error)
107  << "This should not be logged";
108  });
109 }
110 
111 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_LT_TEST) {
112  EXPECT_THROW([]{
113  CHECK_LOG_AND_THROW_LT(5, 4, ERROR, runtime_error)
114  << "Test log and exception message";
115  }(), runtime_error);
116  EXPECT_NO_THROW([]{
117  CHECK_LOG_AND_THROW_LT(3, 4, ERROR, runtime_error)
118  << "This should not be logged";
119  });
120 }
121 
122 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_LE_TEST) {
123  EXPECT_THROW([]{
124  CHECK_LOG_AND_THROW_LE(5, 4, ERROR, runtime_error)
125  << "Test log and exception message";
126  }(), runtime_error);
127  EXPECT_NO_THROW([]{
128  CHECK_LOG_AND_THROW_LE(3, 4, ERROR, runtime_error)
129  << "This should not be logged";
130  });
131  EXPECT_NO_THROW([]{
132  CHECK_LOG_AND_THROW_LE(4, 4, ERROR, runtime_error)
133  << "This should not be logged";
134  });
135 }
136 
137 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_GT_TEST) {
138  EXPECT_THROW([]{
139  CHECK_LOG_AND_THROW_GT(3, 4, ERROR, runtime_error)
140  << "Test log and exception message";
141  }(), runtime_error);
142  EXPECT_NO_THROW([]{
143  CHECK_LOG_AND_THROW_GT(5, 4, ERROR, runtime_error)
144  << "This should not be logged";
145  });
146 }
147 
148 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_GE_TEST) {
149  EXPECT_THROW([]{
150  CHECK_LOG_AND_THROW_GE(3, 4, ERROR, runtime_error)
151  << "Test log and exception message";
152  }(), runtime_error);
153  EXPECT_NO_THROW([]{
154  CHECK_LOG_AND_THROW_GE(5, 4, ERROR, runtime_error)
155  << "This should not be logged";
156  });
157  EXPECT_NO_THROW([]{
158  CHECK_LOG_AND_THROW_GE(4, 4, ERROR, runtime_error)
159  << "This should not be logged";
160  });
161 }
162 
163 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_EQ_TEST) {
164  EXPECT_THROW([]{
165  CHECK_LOG_AND_THROW_EQ(5, 4, ERROR, runtime_error)
166  << "Test log and exception message";
167  }(), runtime_error);
168  EXPECT_NO_THROW([]{
169  CHECK_LOG_AND_THROW_EQ(4, 4, ERROR, runtime_error)
170  << "This should not be logged";
171  });
172 }
173 
174 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_NE_TEST) {
175  EXPECT_THROW([]{
176  CHECK_LOG_AND_THROW_NE(4, 4, ERROR, runtime_error)
177  << "Test log and exception message";
178  }(), runtime_error);
179  EXPECT_NO_THROW([]{
180  CHECK_LOG_AND_THROW_NE(3, 4, ERROR, runtime_error)
181  << "This should not be logged";
182  });
183 }
184 
185 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_NOT_NULL_TEST) {
186  EXPECT_THROW([]{
187  CHECK_LOG_AND_THROW_NOT_NULL(nullptr, ERROR, runtime_error)
188  << "Test log and exception message";
189  }(), runtime_error);
190  EXPECT_NO_THROW([]{
191  CHECK_LOG_AND_THROW_NOT_NULL("hello", ERROR, runtime_error)
192  << "This should not be logged";
193  });
194 }
195 
196 TEST_F(LoggingTests, CHECK_LOG_AND_THROW_NULL_TEST) {
197  EXPECT_THROW([]{
198  CHECK_LOG_AND_THROW_NULL("hello", ERROR, runtime_error)
199  << "Test log and exception message";
200  }(), runtime_error);
201  EXPECT_NO_THROW([]{
202  CHECK_LOG_AND_THROW_NULL(nullptr, ERROR, runtime_error)
203  << "This should not be logged";
204  });
205 }
#define CHECK_LOG_AND_THROW_LT(X, Y, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:90
def info()
Definition: deadlock.py:447
void dumpBinToFile(const string &filename, const IOBuf *buf)
Definition: Logging.cpp:132
#define EXPECT_NO_THROW(statement)
Definition: gtest.h:1845
#define EXPECT_THROW(statement, expected_exception)
Definition: gtest.h:1843
static std::unique_ptr< IOBuf > create(std::size_t capacity)
Definition: IOBuf.cpp:229
string hexStr(StringPiece sp)
Definition: Logging.cpp:47
#define CHECK_LOG_AND_THROW_GT(X, Y, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:96
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
void appendChain(std::unique_ptr< IOBuf > &&iobuf)
Definition: IOBuf.h:827
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
#define CHECK_LOG_AND_THROW_NOT_NULL(X, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:108
STL namespace.
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
#define CHECK_LOG_AND_THROW_NULL(X, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:111
uint8_t * writableData()
Definition: IOBuf.h:509
constexpr auto data(C &c) -> decltype(c.data())
Definition: Access.h:71
#define CHECK_LOG_AND_THROW_NE(X, Y, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:105
#define CHECK_LOG_AND_THROW_GE(X, Y, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:99
TEST_F(AsyncSSLSocketWriteTest, write_coalescing1)
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
#define CHECK_LOG_AND_THROW(CONDITION, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:82
#define CHECK_LOG_AND_THROW_EQ(X, Y, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:102
static set< string > s
#define CHECK_LOG_AND_THROW_LE(X, Y, LOG_LEVEL, EXCEPTION)
Definition: Logging.h:93
void append(std::size_t amount)
Definition: IOBuf.h:689