xref: /aosp_15_r20/external/cronet/base/libcpp_hardening_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2022 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include <vector>
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
8*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
9*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
10*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker namespace {
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker // TODO(thakis): Remove _LIBCPP_ENABLE_ASSERTIONS here once
15*6777b538SAndroid Build Coastguard Worker // pnacl-saigo's libc++ is new enough.
16*6777b538SAndroid Build Coastguard Worker #if defined(__GLIBCXX__)
17*6777b538SAndroid Build Coastguard Worker #if !defined(_GLIBCXX_ASSERTIONS)
18*6777b538SAndroid Build Coastguard Worker #error "libstdc++ assertions should be enabled"
19*6777b538SAndroid Build Coastguard Worker #endif
20*6777b538SAndroid Build Coastguard Worker #elif !_LIBCPP_ENABLE_ASSERTIONS && \
21*6777b538SAndroid Build Coastguard Worker     _LIBCPP_HARDENING_MODE != _LIBCPP_HARDENING_MODE_EXTENSIVE
22*6777b538SAndroid Build Coastguard Worker #error "_LIBCPP_HARDENING_MODE not defined"
23*6777b538SAndroid Build Coastguard Worker #endif
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker using ::testing::ContainsRegex;
26*6777b538SAndroid Build Coastguard Worker using ::testing::Not;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker // This test checks for two things:
29*6777b538SAndroid Build Coastguard Worker //
30*6777b538SAndroid Build Coastguard Worker // 0. Assertions are enabled for libc++ and cause the process to crash when
31*6777b538SAndroid Build Coastguard Worker //    invoked (in this test's case, when an out of bounds access is made in
32*6777b538SAndroid Build Coastguard Worker //    std::vector.
33*6777b538SAndroid Build Coastguard Worker // 1. The correct assertion handler is linked in depending on whether or not
34*6777b538SAndroid Build Coastguard Worker //    this test is built in debug mode. libc++ passes the string
35*6777b538SAndroid Build Coastguard Worker //    {file}:{line} assertion {expression} failed: {message}. The default
36*6777b538SAndroid Build Coastguard Worker //    libc++ handler, which we use in debug mode, prints this string to stderr,
37*6777b538SAndroid Build Coastguard Worker //    while the nondebug assertion handler just crashes immediately. Therefore,
38*6777b538SAndroid Build Coastguard Worker //    to check that we linked in the correct assertion handler, we check for the
39*6777b538SAndroid Build Coastguard Worker //    presence or absence of the above string.
TEST(LibcppHardeningTest,Assertions)40*6777b538SAndroid Build Coastguard Worker TEST(LibcppHardeningTest, Assertions) {
41*6777b538SAndroid Build Coastguard Worker   std::vector<int> vec = {0, 1, 2};
42*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM()
43*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(vec[3], ".*assertion.*failed:");
44*6777b538SAndroid Build Coastguard Worker #else
45*6777b538SAndroid Build Coastguard Worker // We have to explicitly check for the GTEST_HAS_DEATH_TEST macro instead of
46*6777b538SAndroid Build Coastguard Worker // using EXPECT_DEATH_IF_SUPPORTED(...) for the following reasons:
47*6777b538SAndroid Build Coastguard Worker //
48*6777b538SAndroid Build Coastguard Worker // 0. EXPECT_DEATH(...) does not support (non-escaped) parentheses in the regex,
49*6777b538SAndroid Build Coastguard Worker //    so we can't use negative look arounds (https://stackoverflow.com/a/406408)
50*6777b538SAndroid Build Coastguard Worker //    to check that the error message doesn't exist.
51*6777b538SAndroid Build Coastguard Worker // 1. EXPECT_DEATH_IF_SUPPORTED(...) does not support having gmock matchers as
52*6777b538SAndroid Build Coastguard Worker //    the second argument if GTEST_HAS_DEATH_TEST is false.
53*6777b538SAndroid Build Coastguard Worker //
54*6777b538SAndroid Build Coastguard Worker // We also have to prevent this test from running on Android because even though
55*6777b538SAndroid Build Coastguard Worker // death tests are supported on Android, GTest death tests don't work with
56*6777b538SAndroid Build Coastguard Worker // base::ImmediateCrash() (https://crbug.com/1353549#c2).
57*6777b538SAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST && !GTEST_OS_LINUX_ANDROID
58*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH(vec[3], Not(ContainsRegex(".*assertion.*failed:")));
59*6777b538SAndroid Build Coastguard Worker #else
60*6777b538SAndroid Build Coastguard Worker   GTEST_UNSUPPORTED_DEATH_TEST(vec[3], "", );
61*6777b538SAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_LINUX_ANDROID
62*6777b538SAndroid Build Coastguard Worker #endif  // CHECK_WILL_STREAM()
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker }  // namespace
66