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