1 /* 2 * Copyright (C) 2022 Huawei Technologies Co., Ltd. 3 * Licensed under the Mulan PSL v2. 4 * You can use this software according to the terms and conditions of the Mulan PSL v2. 5 * You may obtain a copy of Mulan PSL v2 at: 6 * http://license.coscl.org.cn/MulanPSL2 7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR 8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR 9 * PURPOSE. 10 * See the Mulan PSL v2 for more details. 11 */ 12 13 #include <gtest/gtest.h> 14 15 #include <public_test.h> 16 #include <test_log.h> 17 #include <securec.h> 18 #include <common_test.h> 19 #include <tee_client_api.h> 20 #include <tee_client_type.h> 21 #include <session_mgr/client_session_mgr.h> 22 23 using namespace testing::ext; 24 /** 25 * @testcase.name : GetSystemTime 26 * @testcase.desc : test TEE_GetSystemTime api 27 * @testcase.expect : return TEEC_SUCCESS 28 */ 29 TEE_TEST(TeeBasicTestFram, TEE_GetSystemTime, Function | MediumTest | Level0) 30 { 31 ClientSessionMgr sess; 32 uint32_t origin; 33 TEEC_UUID testId = TIME_API_UUID; 34 TEEC_Result ret = sess.Start(&testId); 35 ASSERT_EQ(ret, TEEC_SUCCESS); 36 37 TEEC_Operation operation = {0}; 38 operation.started = 1; 39 operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE); 40 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_GET_SYSTEM_TIME, &operation, &origin); 41 ASSERT_EQ(ret, TEEC_SUCCESS); 42 #ifndef TEST_STUB 43 uint32_t time1 = operation.params[1].value.a; 44 45 sleep(3); // wait for 3s 46 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_GET_SYSTEM_TIME, &operation, &origin); 47 ASSERT_EQ(ret, TEEC_SUCCESS); 48 49 uint32_t time2 = operation.params[1].value.a; 50 ASSERT_LT(time1, time2); 51 #endif 52 sess.Destroy(); 53 } 54 55 /** 56 * @testcase.name : TeeWait 57 * @testcase.desc : test TEE_Wait api 58 * @testcase.expect : return TEEC_SUCCESS 59 */ 60 TEE_TEST(TeeBasicTestFram, TeeWait, Function | MediumTest | Level0) 61 { 62 ClientSessionMgr sess; 63 uint32_t origin; 64 TEEC_UUID testId = TIME_API_UUID; 65 TEEC_Result ret = sess.Start(&testId); 66 ASSERT_EQ(ret, TEEC_SUCCESS); 67 68 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_TEE_WAIT, NULL, &origin); 69 #ifndef TEST_STUB 70 ASSERT_EQ(ret, TEEC_SUCCESS); 71 #else 72 ASSERT_EQ(ret, TEEC_ERROR_NOT_SUPPORTED); 73 #endif 74 sess.Destroy(); 75 } 76 77 /** 78 * @testcase.name : GetPersistentTime 79 * @testcase.desc : test get persistent time 80 * @testcase.expect : return TEEC_SUCCESS 81 */ 82 TEE_TEST(TeeBasicTestFram, GetPersistentTime, Function | MediumTest | Level0) 83 { 84 ClientSessionMgr sess; 85 uint32_t origin; 86 TEEC_UUID testId = TIME_API_UUID; 87 TEEC_Result ret = sess.Start(&testId); 88 ASSERT_EQ(ret, TEEC_SUCCESS); 89 90 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_GET_PERSISTENT_TIME, NULL, &origin); 91 #ifndef TEST_STUB 92 ASSERT_EQ(ret, TEEC_SUCCESS); 93 #else 94 ASSERT_EQ(ret, TEEC_ERROR_NOT_SUPPORTED); 95 #endif 96 sess.Destroy(); 97 } 98 99 /** 100 * @testcase.name : SetPersistentTime 101 * @testcase.desc : test set persistent time 102 * @testcase.expect : return TEEC_SUCCESS 103 */ 104 TEE_TEST(TeeBasicTestFram, SetPersistentTime, Function | MediumTest | Level0) 105 { 106 ClientSessionMgr sess; 107 uint32_t origin; 108 TEEC_UUID testId = TIME_API_UUID; 109 TEEC_Result ret = sess.Start(&testId); 110 ASSERT_EQ(ret, TEEC_SUCCESS); 111 112 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_SET_PERSISTENT_TIME, NULL, &origin); 113 #ifndef TEST_STUB 114 ASSERT_EQ(ret, TEEC_SUCCESS); 115 #else 116 ASSERT_EQ(ret, TEEC_ERROR_NOT_SUPPORTED); 117 #endif 118 sess.Destroy(); 119 } 120 121 /** 122 * @testcase.name : TestPersistentTimeWithException 123 * @testcase.desc : test set and get persistent time with exception 124 * @testcase.expect : return TEEC_SUCCESS 125 */ 126 TEE_TEST(TeeBasicTestFram, TestPersistentTimeWithException, Function | MediumTest | Level0) 127 { 128 ClientSessionMgr sess; 129 uint32_t origin; 130 TEEC_UUID testId = TIME_API_UUID; 131 TEEC_Result ret = sess.Start(&testId); 132 ASSERT_EQ(ret, TEEC_SUCCESS); 133 134 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_PERSISTENT_TIME_WITH_EXCEPTION, NULL, &origin); 135 #ifndef TEST_STUB 136 ASSERT_EQ(ret, TEEC_SUCCESS); 137 #else 138 ASSERT_EQ(ret, TEEC_ERROR_NOT_SUPPORTED); 139 #endif 140 sess.Destroy(); 141 } 142 143 /** 144 * @testcase.name : OnlyGetPersistentTime 145 * @testcase.desc : test only get persistent time 146 * @testcase.expect : return TEEC_SUCCESS 147 */ 148 TEE_TEST(TeeBasicTestFram, OnlyGetPersistentTime, Function | MediumTest | Level0) 149 { 150 ClientSessionMgr sess; 151 uint32_t origin; 152 TEEC_UUID testId = TIME_API_UUID; 153 TEEC_Result ret = sess.Start(&testId); 154 ASSERT_EQ(ret, TEEC_SUCCESS); 155 156 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_ONLY_GET_PERSISTENT_TIME, NULL, &origin); 157 ASSERT_EQ(ret, TEEC_SUCCESS); 158 sess.Destroy(); 159 } 160 161 /** 162 * @testcase.name : GetReeTime 163 * @testcase.desc : test TEE_GetREETime api 164 * @testcase.expect : return TEEC_SUCCESS 165 */ 166 TEE_TEST(TeeBasicTestFram, GetReeTime, Function | MediumTest | Level0) 167 { 168 ClientSessionMgr sess; 169 uint32_t origin; 170 TEEC_UUID testId = TIME_API_UUID; 171 TEEC_Result ret = sess.Start(&testId); 172 ASSERT_EQ(ret, TEEC_SUCCESS); 173 174 TEEC_Operation operation = {0}; 175 operation.started = 1; 176 operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE); 177 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_GET_REE_TIME, &operation, &origin); 178 ASSERT_EQ(ret, TEEC_SUCCESS); 179 #ifndef TEST_STUB 180 uint32_t time1 = operation.params[1].value.a; 181 182 sleep(3); // wait for 3s 183 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_GET_REE_TIME, &operation, &origin); 184 ASSERT_EQ(ret, TEEC_SUCCESS); 185 186 uint32_t time2 = operation.params[1].value.a; 187 188 ASSERT_LT(time1, time2); 189 #endif 190 sess.Destroy(); 191 } 192 193 /** 194 * @testcase.name : GetSecureRtcTime 195 * @testcase.desc : test tee_get_secure_rtc_time api 196 * @testcase.expect : return TEEC_SUCCESS 197 */ 198 TEE_TEST(TeeBasicTestFram, GetSecureRtcTime, Function | MediumTest | Level0) 199 { 200 ClientSessionMgr sess; 201 uint32_t origin; 202 TEEC_UUID testId = TIME_API_UUID; 203 TEEC_Result ret = sess.Start(&testId); 204 ASSERT_EQ(ret, TEEC_SUCCESS); 205 uint32_t time = 0; 206 207 TEEC_Operation operation = {0}; 208 operation.started = 1; 209 operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE); 210 operation.params[1].value.a = 0; 211 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_GET_SECURE_RTC_TIME, &operation, &origin); 212 ASSERT_EQ(ret, TEEC_SUCCESS); 213 time = operation.params[1].value.a; 214 #ifndef TEST_STUB 215 ASSERT_LT(0, time); 216 #endif 217 218 sess.Destroy(); 219 } 220 221 /** 222 * @testcase.name : CreateDestoryExpireRemainTimer 223 * @testcase.desc : test tee_ext_create_timer, tee_ext_destory_timer, tee_ext_get_timer_expire, 224 * tee_ext_get_timer_remain api 225 * @testcase.expect : return TEEC_SUCCESS 226 */ 227 TEE_TEST(TeeBasicTestFram, CreateDestoryExpireRemainTimer, Function | MediumTest | Level0) 228 { 229 ClientSessionMgr sess; 230 uint32_t origin; 231 TEEC_UUID testId = TIME_API_UUID; 232 TEEC_Result ret = sess.Start(&testId); 233 ASSERT_EQ(ret, TEEC_SUCCESS); 234 235 TEEC_Operation operation = { 0 }; 236 operation.started = 1; 237 operation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE); 238 operation.params[1].value.a = 0; 239 operation.params[1].value.b = 3; 240 ret = TEEC_InvokeCommand(&sess.session, CMD_ID_TEST_OPERATE_TIMER, &operation, &origin); 241 #ifndef TEST_STUB 242 ASSERT_EQ(ret, TEEC_SUCCESS); 243 ASSERT_EQ(operation.params[1].value.a, 3); 244 ASSERT_EQ(operation.params[1].value.b, 2); // get remain time 245 #else 246 ASSERT_EQ(ret, TEEC_ERROR_NOT_SUPPORTED); 247 #endif 248 249 sess.Destroy(); 250 }