22 #include <gtest/gtest.h>
32 int buffer_size = 10000 + rand_r(&rand_seed) % 1000;
33 char buffer[buffer_size];
35 for (
int i = 0; i < 100; ++i) {
39 if ((buffer_size - 1) != message.length()) {
40 ADD_FAILURE() <<
"Message length changed; new size is " << message.length();
43 for (
int c = 0; c < buffer_size - 1; ++c) {
44 if (
'0' <= message[c] && message[c] <=
'9') {
45 ADD_FAILURE() <<
"Number " << message[c] <<
" should be replaced with #";
48 if (message[c] <
' ' ||
'~' < message[c]) {
49 ADD_FAILURE() <<
"Unexpected char " << message[c];
53 if (message[buffer_size - 1] !=
'\0') {
54 ADD_FAILURE() <<
"Missing string terminator";
61 TEST(RedactorTest, NoTrigger) {
66 " {\"search\": \"foo\", \"replace\": \"bar\"}"
72 ASSERT_EQ(
"",
g_rules->begin()->trigger);
73 ASSERT_EQ(
"foo",
g_rules->begin()->search_pattern.pattern());
74 ASSERT_EQ(
"bar",
g_rules->begin()->replacement);
81 TEST(RedactorTest, Trigger) {
86 " {\"trigger\": \"baz\", \"search\": \"foo\", \"replace\": \"bar\"}"
92 ASSERT_EQ(
"baz",
g_rules->begin()->trigger);
97 TEST(RedactorTest, MultiTrigger) {
102 " {\"search\": \"\\\\d+\", \"replace\": \"#\"},"
103 " {\"trigger\": \"baz\", \"search\": \"foo\", \"replace\": \"bar\"}"
107 ASSERT_EQ(
"", error);
113 TEST(RedactorTest, CaseSensitivityProperty) {
118 " {\"search\": \"(C|d)+\", \"replace\": \"_\", \"caseSensitive\": false}"
122 ASSERT_EQ(
"", error);
131 " \"trigger\": \"BaZ\","
132 " \"caseSensitive\": false,"
133 " \"search\": \"bAz\","
134 " \"replace\": \"bar\""
139 ASSERT_EQ(
"", error);
148 " \"trigger\": \"FOO\","
149 " \"caseSensitive\": false,"
150 " \"search\": \"foO\","
151 " \"replace\": \"BAR\""
156 ASSERT_EQ(
"", error);
163 " {\"search\": \"(Xy)+\", \"replace\": \"$\", \"caseSensitive\": true}"
167 ASSERT_EQ(
"", error);
176 " \"trigger\": \"Sensitive\","
177 " \"caseSensitive\": true,"
178 " \"search\": \"SsS\","
179 " \"replace\": \"sss\""
184 ASSERT_EQ(
"", error);
195 " \"trigger\": \"QQQ\","
196 " \"search\": \"qQq\","
197 " \"replace\": \"QqQ\""
202 ASSERT_EQ(
"", error);
209 TEST(RedactorTest, SingleTriggerMultiRule) {
214 " {\"trigger\": \"baz\", \"search\": \"\\\\d+\", \"replace\": \"#\"},"
215 " {\"trigger\": \"baz\", \"search\": \"foo\", \"replace\": \"bar\"}"
219 ASSERT_EQ(
"", error);
225 TEST(RedactorTest, RuleOrder) {
230 " {\"trigger\": \"barC\", \"search\": \".*\", \"replace\": \"Z\"},"
231 " {\"search\": \"1\", \"replace\": \"2\"},"
232 " {\"search\": \"1\", \"replace\": \"3\"},"
233 " {\"trigger\": \"foo\", \"search\": \"2\", \"replace\": \"A\"},"
234 " {\"trigger\": \"bar\", \"search\": \"2\", \"replace\": \"1\"},"
235 " {\"search\": \"1\", \"replace\": \"4\"},"
236 " {\"search\": \"1\", \"replace\": \"5\"},"
237 " {\"trigger\": \"foo\", \"search\": \"A\", \"replace\": \"C\"},"
238 " {\"trigger\": \"bar\", \"search\": \"5\", \"replace\": \"1\"},"
239 " {\"trigger\": \"barC\", \"search\": \".*\", \"replace\": \"D\"}"
243 ASSERT_EQ(
"", error);
244 ASSERT_EQ(10,
g_rules->size());
253 TEST(RedactorTest, InputSize) {
258 " {\"search\": \"[0-9]\", \"replace\": \"#\"}"
262 ASSERT_EQ(
"", error);
264 int buffer_size = 10000;
265 char buffer[buffer_size];
267 string message(buffer);
269 ASSERT_EQ(buffer_size - 1, message.length());
270 for (
int i = 0; i < buffer_size; ++i) {
271 ASSERT_TRUE(message[i] <
'0' ||
'9' < message[i])
272 <<
"Number " << message[i] <<
" should be replaced with #";
276 TEST(RedactorTest, ChangeInputSize) {
281 " {\"search\": \"[A-Z]\", \"replace\": \"\"},"
282 " {\"trigger\": \"reduce\", \"search\": \"[0-9]+\", \"replace\": \"#\"},"
283 " {\"trigger\": \"add\", \"search\": \"[0-9]\", \"replace\": \"####\"}"
287 ASSERT_EQ(
"", error);
293 TEST(RedactorTest, MultiThreaded) {
298 " {\"search\": \"0\", \"replace\": \"#\"},"
299 " {\"search\": \"1\", \"replace\": \"#\"},"
300 " {\"search\": \"2\", \"replace\": \"#\"},"
301 " {\"search\": \"3\", \"replace\": \"#\"},"
302 " {\"search\": \"4\", \"replace\": \"#\"},"
303 " {\"search\": \"5\", \"replace\": \"#\"},"
304 " {\"search\": \"6\", \"replace\": \"#\"},"
305 " {\"search\": \"7\", \"replace\": \"#\"},"
306 " {\"trigger\": \"8\", \"search\": \"8\", \"replace\": \"#\"},"
307 " {\"trigger\": \"9\", \"search\": \"9\", \"replace\": \"#\"}"
311 ASSERT_EQ(
"", error);
313 int processor_count = sysconf(_SC_NPROCESSORS_ONLN);
314 int worker_count = 2 * processor_count;
315 pthread_t worker_ids[worker_count];
316 for (
int i = 0; i < worker_count; ++i) {
318 ASSERT_EQ(0, status);
320 for (
int i = 0; i < worker_count; ++i) {
321 int status = pthread_join(worker_ids[i], NULL);
322 ASSERT_EQ(0, status);
328 int main(
int argc,
char **argv) {
330 #ifndef ADDRESS_SANITIZER
331 ::testing::InitGoogleTest(&argc, argv);
332 return RUN_ALL_TESTS();
void * MultiThreadWorkload(void *unused)
int main(int argc, char **argv)
const char * name() const
Returns the absolute path to the file.
void Redact(string *value, bool *changed)
string SetRedactionRulesFromFile(const string &rules_file_path)
#define ASSERT_UNREDACTED(string)
void OverwriteContents(const std::string &contents)
#define ASSERT_REDACTED_EQ(actual, expected)
void RandomlyFillString(char *string, const int length)
Randomly fills the contents of 'string' up to the given length.