xref: /aosp_15_r20/external/grpc-grpc/test/cpp/README-iOS.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker## C++ tests on iOS
2*cc02d7e2SAndroid Build Coastguard Worker
3*cc02d7e2SAndroid Build Coastguard Worker[GTMGoogleTestRunner](https://github.com/google/google-toolbox-for-mac/blob/master/UnitTesting/GTMGoogleTestRunner.mm) is used to convert googletest cases to XCTest that can be run on iOS. GTMGoogleTestRunner doesn't execute the `main` function, so we can't have any test logic in `main`.
4*cc02d7e2SAndroid Build Coastguard WorkerHowever, it's ok to call `::testing::InitGoogleTest` in `main`, as `GTMGoogleTestRunner` [calls InitGoogleTest](https://github.com/google/google-toolbox-for-mac/blob/master/UnitTesting/GTMGoogleTestRunner.mm#L151).
5*cc02d7e2SAndroid Build Coastguard Worker`grpc::testing::TestEnvironment` can also be called from `main`, as it does some test initialization (install crash handler, seed RNG) that's not strictly required to run testcases on iOS.
6*cc02d7e2SAndroid Build Coastguard Worker
7*cc02d7e2SAndroid Build Coastguard Worker
8*cc02d7e2SAndroid Build Coastguard Worker## Porting exising C++ tests to run on iOS
9*cc02d7e2SAndroid Build Coastguard Worker
10*cc02d7e2SAndroid Build Coastguard WorkerPlease follow these guidelines when porting tests to run on iOS:
11*cc02d7e2SAndroid Build Coastguard Worker
12*cc02d7e2SAndroid Build Coastguard Worker- Tests need to use the googletest framework
13*cc02d7e2SAndroid Build Coastguard Worker- Any setup/teardown code in `main` needs to be moved to `SetUpTestCase`/`TearDownTestCase`, and `TEST` needs to be changed to `TEST_F`.
14*cc02d7e2SAndroid Build Coastguard Worker- [Death tests](https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#death-tests) are not supported on iOS, so use the `*_IF_SUPPORTED()` macros to ensure that your code compiles on iOS.
15*cc02d7e2SAndroid Build Coastguard Worker
16*cc02d7e2SAndroid Build Coastguard WorkerFor example, the following test
17*cc02d7e2SAndroid Build Coastguard Worker```c++
18*cc02d7e2SAndroid Build Coastguard WorkerTEST(MyTest, TestOne) {
19*cc02d7e2SAndroid Build Coastguard Worker  ASSERT_DEATH(ThisShouldDie(), "");
20*cc02d7e2SAndroid Build Coastguard Worker}
21*cc02d7e2SAndroid Build Coastguard Worker
22*cc02d7e2SAndroid Build Coastguard Workerint main(int argc, char** argv) {
23*cc02d7e2SAndroid Build Coastguard Workergrpc::testing::TestEnvironment env(&argc, argv);
24*cc02d7e2SAndroid Build Coastguard Worker  ::testing::InitGoogleTest(&argc, argv);
25*cc02d7e2SAndroid Build Coastguard Worker  grpc_init();
26*cc02d7e2SAndroid Build Coastguard Worker  return RUN_ALL_TESTS();
27*cc02d7e2SAndroid Build Coastguard Worker  grpc_shutdown();
28*cc02d7e2SAndroid Build Coastguard Worker}
29*cc02d7e2SAndroid Build Coastguard Worker```
30*cc02d7e2SAndroid Build Coastguard Worker
31*cc02d7e2SAndroid Build Coastguard Workershould be changed to
32*cc02d7e2SAndroid Build Coastguard Worker```c++
33*cc02d7e2SAndroid Build Coastguard Workerclass MyTest : public ::testing::Test {
34*cc02d7e2SAndroid Build Coastguard Worker protected:
35*cc02d7e2SAndroid Build Coastguard Worker  static void SetUpTestCase() { grpc_init(); }
36*cc02d7e2SAndroid Build Coastguard Worker  static void TearDownTestCase() { grpc_shutdown(); }
37*cc02d7e2SAndroid Build Coastguard Worker};
38*cc02d7e2SAndroid Build Coastguard Worker
39*cc02d7e2SAndroid Build Coastguard WorkerTEST_F(MyTest, TestOne) {
40*cc02d7e2SAndroid Build Coastguard Worker  ASSERT_DEATH_IF_SUPPORTED(ThisShouldDie(), "");
41*cc02d7e2SAndroid Build Coastguard Worker}
42*cc02d7e2SAndroid Build Coastguard Worker
43*cc02d7e2SAndroid Build Coastguard Workerint main(int argc, char** argv) {
44*cc02d7e2SAndroid Build Coastguard Workergrpc::testing::TestEnvironment env(&argc, argv);
45*cc02d7e2SAndroid Build Coastguard Worker  ::testing::InitGoogleTest(&argc, argv);
46*cc02d7e2SAndroid Build Coastguard Worker  return RUN_ALL_TESTS();
47*cc02d7e2SAndroid Build Coastguard Worker}
48*cc02d7e2SAndroid Build Coastguard Worker```
49*cc02d7e2SAndroid Build Coastguard Worker
50*cc02d7e2SAndroid Build Coastguard Worker## Limitations
51*cc02d7e2SAndroid Build Coastguard Worker
52*cc02d7e2SAndroid Build Coastguard WorkerDue to a [limitation](https://github.com/google/google-toolbox-for-mac/blob/master/UnitTesting/GTMGoogleTestRunner.mm#L48-L56) in GTMGoogleTestRunner, `SetUpTestCase`/`TeardownTestCase` will be called before/after *every* individual test case, similar to `SetUp`/`TearDown`.
53