#ifndef _DEMO_API_H_ #include "demo_api.h" #endif #include #include #include #include "demo_xn.c" static pthread_mutex_t g_mutex; static float g_allflow[300] = {0}; static unsigned long g_threadnum = 0; typedef struct { int datalen; int cmd; }XN_INFO; int connect_test() { int ret = 0, i = 0; void *hHandle = NULL; const char *iplist[5] = {0}; int port[5] = {0}; iplist[0] = DEV_IP; port[0] = DEV_PORT; iplist[1] = DEV_IP; port[1] = DEV_PORT; for(i = 0; i < 10; i++) { ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return -1; } ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return -1; } LOG("短连接正常测试|线程数:0|单个连接|成功"); } for(i = 0; i < 10; i++) { ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return -1; } ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return -1; } LOG("短连接正常测试|线程数:0|2个连接|成功"); } for(i = 0; i < 10; i++) { ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return -1; } ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return -1; } LOG("短连接正常测试|线程数:5|单个连接|成功"); } for(i = 0; i < 10; i++) { ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return -1; } ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return -1; } LOG("短连接正常测试|线程数:5|2个连接|成功"); } return 0; } int CMD(void *hHandle, int cmd) { int ret = 0; switch(cmd) { case 0: ret = SM4_ShortData_Test(hHandle); break; case 1: ret = SM4_BatchData_Test(hHandle); break; case 2: ret = SM4_LongData_Test_Special(hHandle); if(ret != 0) { return ret; } ret = SM4_LongData_Test(hHandle); if(ret != 0) { return ret; } break; case 3: ret = SM3_ShortHash_Test(hHandle); break; case 4: ret = SM3_LongHash_Test_Special(hHandle); if(ret != 0) { return ret; } ret = SM3_LongHash_Test(hHandle); if(ret != 0) { return ret; } break; case 5: ret = SM4Mac_ShortData(hHandle); break; case 6: ret = SM4Mac_BatchData(hHandle); break; case 7: ret = SM4Mac_LongData_Special(hHandle); if(ret != 0) { return ret; } ret = SM4Mac_LongData(hHandle); if(ret != 0) { return ret; } break; case 8: ret = SM4_ShortData_CheckValue(hHandle); break; case 9: ret = SM4_BatchData_CheckValue(hHandle); break; case 10: ret = SM4_LongData_CheckValue(hHandle); break; default: LOG("cmd not exit"); ret = 1; } return ret; } void short_connect_test() { int ret = 0, cmd = 0, i = 0; void *hHandle = NULL; const char *iplist[2] = {0}; int port[2] = {0}; iplist[0] = DEV_IP; port[0] = DEV_PORT; iplist[1] = DEV2_IP; port[1] = DEV2_PORT; for(i = 0; i < 10; i++) { ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return; } for(cmd = 0; cmd <= 9; cmd++) { ret = CMD(hHandle, cmd); if(ret != 0) goto END; } ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return; } LOG("遍历所有指令|总循环次数:10|已执行次数:%d|成功", i+1); } END: ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return; } } void threadpool_connect_test() { int ret = 0, i = 0, cmd = 0; void *hHandle = NULL; const char *iplist[2] = {0}; int port[2] = {0}; iplist[0] = DEV_IP; port[0] = DEV_PORT; iplist[1] = DEV2_IP; port[1] = DEV2_PORT; for(i = 0; i < 10; i++) { ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return; } for(cmd = 0; cmd <= 9; cmd++) { ret = CMD(hHandle, cmd); if(ret != 0) goto END; } ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return; } LOG("遍历所有指令|总循环次数:10|已执行次数:%d|成功", i+1); } END: ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return; } } void choose_cmd_test() { int ret = 0, i = 0; int cmd = 0; void *hHandle = NULL; const char *iplist[2] = {0}; int port[2] = {0}; iplist[0] = DEV_IP; port[0] = DEV_PORT; iplist[1] = DEV2_IP; port[1] = DEV2_PORT; while (1) { LOG_MSG("/----功能正确性测试-----/"); LOG_MSG("0:SM4短数据"); LOG_MSG("1:SM4批量数据"); LOG_MSG("2:SM4长数据"); LOG_MSG("3:SM3短数据"); LOG_MSG("4:SM3长数据"); LOG_MSG("5:SM4-MAC短数据"); LOG_MSG("6:SM4-MAC批量数据"); LOG_MSG("7:SM4-MAC长数据"); LOG_MSG("8:SM4短数据+密文校验"); LOG_MSG("9:SM4批量数据+密文校验"); LOG_MSG("10:SM4长数据+密文校验"); LOG_MSG("100:退出"); LOG_MSG("请选择测试指令:"); scanf("%d", &cmd); if(cmd == 100) return; ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return; } ret = CMD(hHandle, cmd); if(ret == 1) goto END; ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return; } } END: ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return; } } void* CMD_XN(void *p) { XN_INFO* arg = (XN_INFO *)p; int ret = 0; float flow = 0; long difftime = 0; struct timeval start_time; struct timeval local_time; const char *iplist[5] = {0}; int port[5] = {0}; iplist[0] = DEV_IP; port[0] = DEV_PORT; void *hHandle = NULL; ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, 1000, 0, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return NULL; } gettimeofday(&start_time, NULL); switch(arg->cmd) { case 0: ret = XN_SM4_Enc_LongData_Test(hHandle, arg->datalen); break; case 1: ret = XN_SM4_Dec_LongData_Test(hHandle, arg->datalen); break; case 2: ret = XN_SM4Mac_LongData_Test(hHandle, arg->datalen); break; case 3: ret = XN_SM3_LongHash_Test(hHandle, arg->datalen); break; case 4: ret = XN_SM4EncMac_LongData_Test(hHandle, arg->datalen); break; case 5: ret = XN_SM4DecMac_LongData_Test(hHandle, arg->datalen); break; default: LOG("cmd not exist"); return NULL; } gettimeofday(&local_time, NULL); ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return NULL; } pthread_mutex_lock(&g_mutex); difftime = us_difftime(start_time, local_time); flow = (arg->datalen / (difftime * 0.000001)) / (1024 * 1024); g_allflow[g_threadnum] = flow; LOG_MSG("线程:%ld|用时%ld(us)|数据长度:%d(bytes)|吞吐量:%f(MB/S)", g_threadnum, difftime, arg->datalen, flow); g_threadnum++; pthread_mutex_unlock(&g_mutex); return NULL; } void xn_throughput_test() { int ret = 0, i = 0, cmd = 0; long alldatalen = 0; int run_conut = 0; float all_flow = 0; long thread_count = 0; pthread_t pthid[1000]; XN_INFO arg = {0}; pthread_mutex_init(&g_mutex, NULL); while (1) { LOG_MSG("/------吞吐量测试------/"); LOG_MSG("0:SM4加密长数据"); LOG_MSG("1:SM4解密长数据"); LOG_MSG("2:SM4-MAC长数据"); LOG_MSG("3:SM3长数据"); LOG_MSG("4:SM4加密+MAC长数据"); LOG_MSG("5:SM4解密+MAC长数据"); LOG_MSG("100:退出"); LOG_MSG("请选择测试指令:"); scanf("%d", &cmd); if(cmd == 100) goto END; LOG_MSG("请输出数据的总长度(MB):"); scanf("%ld", &alldatalen); alldatalen = alldatalen * 1024 * 1024; LOG_MSG("请输入线程数:"); scanf("%ld", &thread_count); g_threadnum = 0; memset(g_allflow, 0, sizeof(g_allflow)); arg.cmd = cmd; arg.datalen = alldatalen / thread_count; for(i = 0; i < thread_count; i++) { ret = pthread_create(&pthid[i], NULL, CMD_XN, (void *)&arg); if(ret) { printf("Fail to create thread %d\n", (int)pthid[i]); goto END; } } for (i = 0; i < thread_count; i++) { ret = pthread_join(pthid[i],NULL); if(ret) { printf("Thread %d join failed\n", (int)pthid[i]); goto END; } } all_flow = 0; for (i = 0; i < thread_count; i++) { all_flow += g_allflow[i]; } LOG_MSG("命令:%d|线程数:%ld|总吞吐量:%f(MB/S)", arg.cmd, thread_count, all_flow); } END: pthread_mutex_destroy(&g_mutex); } int stability_test() { int ret = 0, cmd = 0; long long i = 0, count = 0; void *hHandle = NULL; const char *iplist[2] = {0}; int port[5] = {0}; iplist[0] = DEV_IP; port[0] = DEV_PORT; ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, 5000, 0, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return 0; } LOG_MSG("请输入循环次数:"); scanf("%lld", &count); for(i = 0; i < count; i++) { for(cmd = 0; cmd <= 10; cmd++) { ret = CMD(hHandle, cmd); if(ret != 0) { LOG("命令:%d|当前循环次数:%lld|错误!", cmd, i); goto END; } } } END: ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return 0; } } int main() { int ret = 0, mode = 0; void *hHandle = NULL; char version[256] = {0}; int version_len = sizeof(version); const char *iplist[5] = {0}; int port[5] = {0}; iplist[0] = DEV_IP; port[0] = DEV_PORT; ret = SYD_SetLogConfig("./Log", 6, 2); if(ret != 0) { LOG("SYD_SetLogConfig ret=%08x", ret); return 0; } ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle); if(ret != 0) { LOG("SYD_Connect_Ex ret=%08x", ret); return 0; } ret = SYD_GetVersionInfo(hHandle, version, &version_len); if(ret != 0) { LOG("SYD_GetVersionInfo ret=%08x", ret); return 0; } printf("%s\n", version); ret = SYD_DisConnect_Ex(hHandle); if(ret != 0) { LOG("SYD_DisConnect_Ex ret=%08x", ret); return 0; } /* *注意:该测试需要提前手动合成密钥,密钥合成方式如下 *机构号16字节0 类型:ZEK(00A) 索引:8字节0 方案:X 不变种 分量个数:2 *这里用的密钥分量为 分量1:31313131313131313131313131313131 分量2:32323232323232323232323232323232 合成后的分量:03030303030303030303030303030303 */ while (1) { LOG_MSG("/---功能测试---/"); LOG_MSG("0:连接正确性测试"); LOG_MSG("1:金交所业务场景1:循环多次(短连接-遍历所有功能-断开连接)"); LOG_MSG("2:金交所业务场景2:循环多次(连接池-遍历所有功能-断开连接)"); LOG_MSG("3:功能正确性测试"); LOG_MSG("4:吞吐量测试"); LOG_MSG("5:TPS性能测试"); LOG_MSG("6:稳定性测试"); LOG_MSG("100:退出"); LOG_MSG("请选择测试类型:"); scanf("%d", &mode); switch (mode) { case 0: connect_test(); break; case 1: short_connect_test(); break; case 2: threadpool_connect_test(); break; case 3: choose_cmd_test(); break; case 4: xn_throughput_test(); break; case 5: xn_cmd_tps(); break; case 6: stability_test(); break; case 100: return 0; default: LOG("mode not exist!"); break; } } return 0; }