// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EXTENSIONS_TEST_FLAKINESS_TEST_UTIL_H_ #define EXTENSIONS_TEST_FLAKINESS_TEST_UTIL_H_ #include "testing/gtest/include/gtest/gtest.h" // NO *LANDED* CODE SHOULD EVER USE THESE. They are purely for development // aid. // // A set of helper macros to quickly instantiate a test suite for a test to // run hundreds of times in order to help flush out flakes. // // Given a test suite, MyTestSuite, these macros work together to generate a // parameterized test that will run a given number of times, as follows: // // // Note: Prepend "AAAA_" so that the test always comes first. // class AAAA_Deflake_MyTestSuite : public MyTestSuite, // public testing::WithParamInterface<int> { // }; // // INSTANTIATE_TEST_SUITE_P( // AAAA_Flaky, AAAA_Deflake_MyTestSuite, // testing::Range(0, 100)); // Or another provided amount. // // Assume there is the following flaky test that you want to exercise: // // class MyTestSuite { ... }; // // // Disabled for flakiness. // IN_PROC_BROWSER_TEST_F(MyTestSuite, DISABLED_MyTestCase) { // ... // } // // These macros can be used as follows: // // class MyTestSuite { ... }; // // INSTANTIATE_FLAKINESS_TEST_100(MyTestSuite); // IN_PROC_BROWSER_TEST_P(FLAKINESS_TEST_NAME(MyTestSuite), MyTestCase) { // ... // } // // The generated test will run 100 times. namespace extensions { // Produces the flakiness test name, e.g. "AAAA_Deflake_MyTestSuite". #define FLAKINESS_TEST_NAME(TestName) … namespace internal { // Defines the subclass for the parameterized test suite. #define DEFINE_FLAKINESS_TEST(TestName) … // Instantiates the test suite. This is broken into multiple helpers in order // to work around C's, uh, interesting macro evaluation patterns. #define INSTANTIATE_FLAKINESS_TEST_IMPL(IterationCount, FlakinessTestName) … #define INSTANTIATE_FLAKINESS_TEST_HELPER(IterationCount, ...) … } // namespace internal // Defines and instantiates a test suite that will run `IterationCount` times. #define INSTANTIATE_FLAKINESS_TEST(TestName, IterationCount) … #define INSTANTIATE_FLAKINESS_TEST_100(TestName) … #define INSTANTIATE_FLAKINESS_TEST_1000(TestName) … } // namespace extensions #endif // EXTENSIONS_TEST_FLAKINESS_TEST_UTIL_H_