xref: /aosp_15_r20/external/cronet/base/check_is_test.h (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 #ifndef BASE_CHECK_IS_TEST_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_CHECK_IS_TEST_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/not_fatal_until.h"
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker // Code paths taken in tests are sometimes different from those taken in
12*6777b538SAndroid Build Coastguard Worker // production. This might be because the respective tests do not initialize some
13*6777b538SAndroid Build Coastguard Worker // objects that would be required for the "normal" code path.
14*6777b538SAndroid Build Coastguard Worker //
15*6777b538SAndroid Build Coastguard Worker // Ideally, such code constructs should be avoided, so that tests really test
16*6777b538SAndroid Build Coastguard Worker // the production code and not something different.
17*6777b538SAndroid Build Coastguard Worker //
18*6777b538SAndroid Build Coastguard Worker // However, there already are hundreds of test-only paths in production code
19*6777b538SAndroid Build Coastguard Worker // Cleaning up all these cases retroactively and completely avoiding such cases
20*6777b538SAndroid Build Coastguard Worker // in the future seems unrealistic.
21*6777b538SAndroid Build Coastguard Worker //
22*6777b538SAndroid Build Coastguard Worker // Thus, it is useful to prevent the test code-only paths to be taken in
23*6777b538SAndroid Build Coastguard Worker // production scenarios.
24*6777b538SAndroid Build Coastguard Worker //
25*6777b538SAndroid Build Coastguard Worker // `CHECK_IS_TEST` can be used to assert that a test-only path is actually taken
26*6777b538SAndroid Build Coastguard Worker // only in tests. For instance:
27*6777b538SAndroid Build Coastguard Worker //
28*6777b538SAndroid Build Coastguard Worker //   // This only happens in unit tests:
29*6777b538SAndroid Build Coastguard Worker //   if (!url_loader_factory)
30*6777b538SAndroid Build Coastguard Worker //   {
31*6777b538SAndroid Build Coastguard Worker //     // Assert that this code path is really only taken in tests.
32*6777b538SAndroid Build Coastguard Worker //     CHECK_IS_TEST();
33*6777b538SAndroid Build Coastguard Worker //     return;
34*6777b538SAndroid Build Coastguard Worker //   }
35*6777b538SAndroid Build Coastguard Worker //
36*6777b538SAndroid Build Coastguard Worker // `CHECK_IS_TEST` is thread safe.
37*6777b538SAndroid Build Coastguard Worker //
38*6777b538SAndroid Build Coastguard Worker // An optional base::NotFatalUntil argument can be provided to make the
39*6777b538SAndroid Build Coastguard Worker // instance non-fatal (dumps without crashing) before a provided milestone.
40*6777b538SAndroid Build Coastguard Worker // See base/check.h for details.
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker #define CHECK_IS_TEST(...) base::internal::check_is_test_impl(__VA_ARGS__)
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker namespace base::internal {
45*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void check_is_test_impl(
46*6777b538SAndroid Build Coastguard Worker     base::NotFatalUntil fatal_milestone =
47*6777b538SAndroid Build Coastguard Worker         base::NotFatalUntil::NoSpecifiedMilestoneInternal);
48*6777b538SAndroid Build Coastguard Worker }  // namespace base::internal
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker #endif  // BASE_CHECK_IS_TEST_H_
51