base: extract {ASSERT,EXPECT}_MATCH helpers from debuggerd_test.

Add some helper macros that perform regex string matching to
<android-base/test_utils.h>.

Test: libbase_test32/64 on host
Change-Id: I1b0f03dc73f8b4fdfb8ac6c75d59ef421e0e9640
This commit is contained in:
Josh Gao 2017-04-27 19:48:44 -07:00
parent 51c2088f3b
commit 30171a8b47
4 changed files with 77 additions and 16 deletions

View File

@ -116,6 +116,7 @@ cc_test {
"stringprintf_test.cpp",
"strings_test.cpp",
"test_main.cpp",
"test_utils_test.cpp",
],
target: {
android: {

View File

@ -17,6 +17,7 @@
#ifndef ANDROID_BASE_TEST_UTILS_H
#define ANDROID_BASE_TEST_UTILS_H
#include <regex>
#include <string>
#include <android-base/macros.h>
@ -70,4 +71,32 @@ class CapturedStderr {
DISALLOW_COPY_AND_ASSIGN(CapturedStderr);
};
#define ASSERT_MATCH(str, pattern) \
do { \
if (!std::regex_search((str), std::regex((pattern)))) { \
FAIL() << "regex mismatch: expected " << (pattern) << " in:\n" << (str); \
} \
} while (0)
#define ASSERT_NOT_MATCH(str, pattern) \
do { \
if (std::regex_search((str), std::regex((pattern)))) { \
FAIL() << "regex mismatch: expected to not find " << (pattern) << " in:\n" << (str); \
} \
} while (0)
#define EXPECT_MATCH(str, pattern) \
do { \
if (!std::regex_search((str), std::regex((pattern)))) { \
ADD_FAILURE() << "regex mismatch: expected " << (pattern) << " in:\n" << (str); \
} \
} while (0)
#define EXPECT_NOT_MATCH(str, pattern) \
do { \
if (std::regex_search((str), std::regex((pattern)))) { \
ADD_FAILURE() << "regex mismatch: expected to not find " << (pattern) << " in:\n" << (str); \
} \
} while (0)
#endif // ANDROID_BASE_TEST_UTILS_H

46
base/test_utils_test.cpp Normal file
View File

@ -0,0 +1,46 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "android-base/test_utils.h"
#include <gtest/gtest-spi.h>
#include <gtest/gtest.h>
namespace android {
namespace base {
TEST(TestUtilsTest, AssertMatch) {
ASSERT_MATCH("foobar", R"(fo+baz?r)");
EXPECT_FATAL_FAILURE(ASSERT_MATCH("foobar", R"(foobaz)"), "regex mismatch");
}
TEST(TestUtilsTest, AssertNotMatch) {
ASSERT_NOT_MATCH("foobar", R"(foobaz)");
EXPECT_FATAL_FAILURE(ASSERT_NOT_MATCH("foobar", R"(foobar)"), "regex mismatch");
}
TEST(TestUtilsTest, ExpectMatch) {
EXPECT_MATCH("foobar", R"(fo+baz?r)");
EXPECT_NONFATAL_FAILURE(EXPECT_MATCH("foobar", R"(foobaz)"), "regex mismatch");
}
TEST(TestUtilsTest, ExpectNotMatch) {
EXPECT_NOT_MATCH("foobar", R"(foobaz)");
EXPECT_NONFATAL_FAILURE(EXPECT_NOT_MATCH("foobar", R"(foobar)"), "regex mismatch");
}
} // namespace base
} // namespace android

View File

@ -36,6 +36,7 @@
#include <android-base/parseint.h>
#include <android-base/properties.h>
#include <android-base/strings.h>
#include <android-base/test_utils.h>
#include <android-base/unique_fd.h>
#include <cutils/sockets.h>
#include <gtest/gtest.h>
@ -75,22 +76,6 @@ constexpr char kWaitForGdbKey[] = "debug.debuggerd.wait_for_gdb";
return value; \
}()
#define ASSERT_MATCH(str, pattern) \
do { \
std::regex r((pattern)); \
if (!std::regex_search((str), r)) { \
FAIL() << "regex mismatch: expected " << (pattern) << " in: \n" << (str); \
} \
} while (0)
#define ASSERT_NOT_MATCH(str, pattern) \
do { \
std::regex r((pattern)); \
if (std::regex_search((str), r)) { \
FAIL() << "regex mismatch: expected to not find " << (pattern) << " in: \n" << (str); \
} \
} while (0)
#define ASSERT_BACKTRACE_FRAME(result, frame_name) \
ASSERT_MATCH(result, R"(#\d\d pc [0-9a-f]+\s+ /system/lib)" ARCH_SUFFIX \
R"(/libc.so \()" frame_name R"(\+)")