* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved.
* gazelle is licensed under the Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#include <stdlib.h>
#include <CUnit/Basic.h>
#include <CUnit/Automated.h>
#include <CUnit/Console.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <securec.h>
#include "lstack_cfg.h"
#define MAX_CMD_LEN 1024
int parse_conf_file(const char *path);
static int execute_cmd(const char *cmd)
{
int result;
result = system(cmd);
if (result < 0) {
printf("Executing cmd: %s error!!!\n", cmd);
}
return result;
}
static int lstack_bad_param(const char *conf_file_filed)
{
int ret;
const char *conf_file_path = "../lstack/config/lstack_tmp.conf";
char cmd[MAX_CMD_LEN];
execute_cmd("rm -rf ../lstack/config/lstack_tmp.conf");
execute_cmd("cp -f ../lstack/config/lstack.conf ../lstack/config/lstack_tmp.conf");
ret = sprintf_s(cmd, MAX_CMD_LEN, "sed -i '%s' %s", conf_file_filed, conf_file_path);
if (ret < 0) {
printf("sprintf_s cmd error %s %s!!!\n", conf_file_filed, conf_file_path);
return ret;
}
execute_cmd(cmd);
ret = parse_conf_file(conf_file_path);
return ret;
}
void test_lstack_bad_params_lowpower(void)
{
CU_ASSERT(lstack_bad_param("/^low_power_mode/clow_power_mode=/") != 0);
CU_ASSERT(lstack_bad_param("/low_power_mode/d") == 0);
CU_ASSERT(lstack_bad_param("/^low_power_mode/clow_power_mode=aaa/") != 0);
}
void test_lstack_bad_params_num_cpus(void)
{
CU_ASSERT(lstack_bad_param("/^num_cpus/cnum_cpus=/") != 0);
CU_ASSERT(lstack_bad_param("/num_cpus/d") != 0);
CU_ASSERT(lstack_bad_param("/^num_cpus/cnum_cpus=aaa/") != 0);
}
void test_lstack_bad_params_host_addr(void)
{
CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=/") != 0);
CU_ASSERT(lstack_bad_param("/^host_addr/d") != 0);
CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=\"aaa\"/") != 0);
CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=\"192.168.1.256\"/") != 0);
}
void test_lstack_bad_params_mask_addr(void)
{
CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=/") != 0);
CU_ASSERT(lstack_bad_param("/^mask_addr/d") != 0);
CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"aaa\"/") != 0);
CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"256.255.255.0\"/") != 0);
CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"255.254.255.0\"/") != 0);
}
void test_lstack_bad_params_gateway_addr(void)
{
CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=/") != 0);
CU_ASSERT(lstack_bad_param("/^gateway_addr/d") != 0);
CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=\"aaa\"/") != 0);
CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=\"192.168.1.256\"/") != 0);
}
void test_lstack_bad_params_devices(void)
{
CU_ASSERT(lstack_bad_param("/^devices/cdevices=/") != 0);
CU_ASSERT(lstack_bad_param("/^devices/d") != 0);
CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"aaa\"/") != 0);
CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff:ff:ff\"/") != 0);
CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff-ff\"/") != 0);
CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff:fg\"/") != 0);
}
void test_lstack_normal_param(void)
{
int ret;
char ip_str[16] = {0};
char str[18] = {0};
const char *config_file_path = "../lstack/config/lstack.conf";
ret = parse_conf_file(config_file_path);
CU_ASSERT(ret == 0);
struct cfg_params *global_params = get_global_cfg_params();
for (int i =0; i< global_params->dpdk_argc; i++)
printf("arcv is %s\n", global_params->dpdk_argv[i]);
CU_ASSERT(global_params->dpdk_argc == 9);
CU_ASSERT(strcmp(global_params->dpdk_argv[0], "lstack") == 0);
CU_ASSERT(strcmp(global_params->dpdk_argv[1], "--socket-mem") == 0);
CU_ASSERT(strcmp(global_params->dpdk_argv[2], "2048,0,0,0") == 0);
CU_ASSERT(strcmp(global_params->dpdk_argv[3], "--huge-dir") == 0);
CU_ASSERT(strcmp(global_params->dpdk_argv[4], "/mnt/hugepages-2M") == 0);
CU_ASSERT(strcmp(global_params->dpdk_argv[5], "--proc-type") == 0);
CU_ASSERT(strcmp(global_params->dpdk_argv[6], "primary") == 0);
CU_ASSERT(strcmp(global_params->dpdk_argv[7], "-l") == 0);
CU_ASSERT(strcmp(global_params->dpdk_argv[8], "0,2,4") == 0);
struct in_addr tmp_subnet;
tmp_subnet.s_addr = global_params->host_addr.addr;
char *subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str)));
CU_ASSERT(subnet_str != NULL);
CU_ASSERT(strcmp(subnet_str, "192.168.1.10") == 0);
free(subnet_str);
tmp_subnet.s_addr = global_params->netmask.addr;
subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str)));
CU_ASSERT(subnet_str != NULL);
CU_ASSERT(strcmp(subnet_str, "255.255.255.0") == 0);
free(subnet_str);
tmp_subnet.s_addr = global_params->gateway_addr.addr;
subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str)));
CU_ASSERT(subnet_str != NULL);
CU_ASSERT(strcmp(subnet_str, "192.168.1.1") == 0);
free(subnet_str);
ret = sprintf_s(str, sizeof(str), "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", global_params->mac_addr[0],
global_params->mac_addr[1],
global_params->mac_addr[2],
global_params->mac_addr[3],
global_params->mac_addr[4],
global_params->mac_addr[5]);
CU_ASSERT(ret > 0);
CU_ASSERT(strcmp(str, "aa:bb:cc:dd:ee:ff") == 0);
}