| 81 | } |
| 82 | |
| 83 | TEST(CEnvAPI, TVMFFIHandleInitDeinitOnce) { |
| 84 | // Test 1: Successful initialization |
| 85 | void* handle = nullptr; |
| 86 | int ret = TVMFFIHandleInitOnce(&handle, InitSuccess); |
| 87 | EXPECT_EQ(ret, 0); |
| 88 | EXPECT_NE(handle, nullptr); |
| 89 | EXPECT_EQ(*static_cast<int*>(handle), 42); |
| 90 | |
| 91 | // Test 2: Multiple init calls should not re-initialize (idempotent) |
| 92 | void* original_handle = handle; |
| 93 | ret = TVMFFIHandleInitOnce(&handle, InitShouldNotBeCalled); |
| 94 | EXPECT_EQ(ret, 0); |
| 95 | EXPECT_EQ(handle, original_handle); // Handle should remain unchanged |
| 96 | EXPECT_EQ(*static_cast<int*>(handle), 42); // Value should still be 42 |
| 97 | |
| 98 | // Test 3: Successful deinitialization |
| 99 | ret = TVMFFIHandleDeinitOnce(&handle, DeinitSuccess); |
| 100 | EXPECT_EQ(ret, 0); |
| 101 | EXPECT_EQ(handle, nullptr); |
| 102 | |
| 103 | // Test 4: Multiple deinit calls should be safe (idempotent) |
| 104 | ret = TVMFFIHandleDeinitOnce(&handle, DeinitShouldNotBeCalled); |
| 105 | EXPECT_EQ(ret, 0); |
| 106 | EXPECT_EQ(handle, nullptr); |
| 107 | |
| 108 | // Test 5: Init error - init_func returns error code |
| 109 | void* handle2 = nullptr; |
| 110 | ret = TVMFFIHandleInitOnce(&handle2, InitWithError); |
| 111 | EXPECT_NE(ret, 0); |
| 112 | EXPECT_EQ(handle2, nullptr); |
| 113 | |
| 114 | // Test 6: Init error - init_func returns nullptr (invalid) |
| 115 | void* handle3 = nullptr; |
| 116 | ret = TVMFFIHandleInitOnce(&handle3, InitReturnsNull); |
| 117 | EXPECT_NE(ret, 0); |
| 118 | EXPECT_EQ(handle3, nullptr); |
| 119 | |
| 120 | // Test 7: Deinit error - deinit_func returns error |
| 121 | void* handle4 = nullptr; |
| 122 | ret = TVMFFIHandleInitOnce(&handle4, InitForDeinitError); |
| 123 | EXPECT_EQ(ret, 0); |
| 124 | EXPECT_NE(handle4, nullptr); |
| 125 | |
| 126 | ret = TVMFFIHandleDeinitOnce(&handle4, DeinitWithError); |
| 127 | EXPECT_NE(ret, 0); |
| 128 | EXPECT_EQ(handle4, nullptr); // Handle should still be set to nullptr |
| 129 | |
| 130 | // Test 8: Init-deinit lifecycle |
| 131 | void* handle5 = nullptr; |
| 132 | ret = TVMFFIHandleInitOnce(&handle5, InitValue123); |
| 133 | EXPECT_EQ(ret, 0); |
| 134 | EXPECT_NE(handle5, nullptr); |
| 135 | EXPECT_EQ(*static_cast<int*>(handle5), 123); |
| 136 | |
| 137 | ret = TVMFFIHandleDeinitOnce(&handle5, DeinitSuccess); |
| 138 | EXPECT_EQ(ret, 0); |
| 139 | EXPECT_EQ(handle5, nullptr); |
| 140 |
nothing calls this directly
no test coverage detected