From 81e316b3a2bb55c88cd4143bacee8440254d35e4 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Tue, 5 Nov 2019 13:46:14 -0800 Subject: [PATCH] base: avoid evaluating macro argument multiple times. Previously, in the regex test helpers, we would evaluate the haystack expression again to generate the error message, which leads to nonsensical errors if the expression returns a different value on the second call (e.g. functions like dlerror which return null on subsequent calls). Test: bionic-unit-tests with a failure Test: treehugger Change-Id: I2126cefeb45e26638194af8a82d0f2a9d7196edf --- base/include/android-base/test_utils.h | 44 ++++++++++++++------------ 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/base/include/android-base/test_utils.h b/base/include/android-base/test_utils.h index b20f27846..f3d7cb031 100644 --- a/base/include/android-base/test_utils.h +++ b/base/include/android-base/test_utils.h @@ -53,30 +53,34 @@ class CapturedStdout : public CapturedStdFd { CapturedStdout() : CapturedStdFd(STDOUT_FILENO) {} }; -#define ASSERT_MATCH(str, pattern) \ - do { \ - if (!std::regex_search((str), std::regex((pattern)))) { \ - FAIL() << "regex mismatch: expected " << (pattern) << " in:\n" << (str); \ - } \ +#define ASSERT_MATCH(str, pattern) \ + do { \ + auto __s = (str); \ + if (!std::regex_search(__s, std::regex((pattern)))) { \ + FAIL() << "regex mismatch: expected " << (pattern) << " in:\n" << __s; \ + } \ } 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); \ - } \ +#define ASSERT_NOT_MATCH(str, pattern) \ + do { \ + auto __s = (str); \ + if (std::regex_search(__s, std::regex((pattern)))) { \ + FAIL() << "regex mismatch: expected to not find " << (pattern) << " in:\n" << __s; \ + } \ } 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); \ - } \ +#define EXPECT_MATCH(str, pattern) \ + do { \ + auto __s = (str); \ + if (!std::regex_search(__s, std::regex((pattern)))) { \ + ADD_FAILURE() << "regex mismatch: expected " << (pattern) << " in:\n" << __s; \ + } \ } 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); \ - } \ +#define EXPECT_NOT_MATCH(str, pattern) \ + do { \ + auto __s = (str); \ + if (std::regex_search(__s, std::regex((pattern)))) { \ + ADD_FAILURE() << "regex mismatch: expected to not find " << (pattern) << " in:\n" << __s; \ + } \ } while (0)