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