579 lines
14 KiB
C
579 lines
14 KiB
C
#ifndef _DEMO_API_H_
|
|
#include "demo_api.h"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#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;
|
|
} |