seg-database-c/demo/demo.c
2026-07-10 17:53:18 +08:00

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;
}