|
|
|
@ -31,50 +31,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "lt_net_netdb.h"
|
|
|
|
|
// 引入头文件,可能包含了网络数据库相关的函数声明和宏定义。
|
|
|
|
|
|
|
|
|
|
static int GetServByPortRTest(void)
|
|
|
|
|
{
|
|
|
|
|
// refer to the `/etc/services' file.
|
|
|
|
|
char serv_file[] = "ssh 22/tcp\n";
|
|
|
|
|
// 定义一个模拟的services文件内容,包含ssh服务的条目。
|
|
|
|
|
char *pathList[] = {"/etc/services"};
|
|
|
|
|
// 定义services文件的路径列表,这里只有一个路径指向系统的services文件。
|
|
|
|
|
char *streamList[] = {static_cast<char *>(serv_file)};
|
|
|
|
|
// 定义模拟的services文件流列表,这里将模拟的services文件内容转换为char*类型。
|
|
|
|
|
int streamLen[] = {sizeof(serv_file)};
|
|
|
|
|
// 定义模拟的services文件流长度列表。
|
|
|
|
|
const int file_number = 1;
|
|
|
|
|
// 定义文件数量。
|
|
|
|
|
int flag = PrepareFileEnv(pathList, streamList, streamLen, file_number);
|
|
|
|
|
// 调用PrepareFileEnv函数准备文件环境,模拟services文件。
|
|
|
|
|
if (flag != 0) {
|
|
|
|
|
RecoveryFileEnv(pathList, file_number);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
// 如果准备文件环境失败,则恢复原始文件环境并返回错误码。
|
|
|
|
|
|
|
|
|
|
struct servent se, *result = NULL;
|
|
|
|
|
// 定义servent结构体变量se,用于存储getservbyport_r函数的结果。
|
|
|
|
|
char buf[1024];
|
|
|
|
|
// 定义一个足够大的缓冲区buf,用于getservbyport_r函数。
|
|
|
|
|
char buf1[2];
|
|
|
|
|
// 定义一个非常小的缓冲区buf1,用于测试getservbyport_r函数的边界条件。
|
|
|
|
|
|
|
|
|
|
const int test_port_no = 22; // ssh port number is 22
|
|
|
|
|
// 定义测试的端口号,这里是22,即SSH服务的标准端口号。
|
|
|
|
|
int ret = getservbyport_r(htons(test_port_no), "tcp", &se, buf, sizeof buf, &result);
|
|
|
|
|
// 使用getservbyport_r函数根据端口号和协议名("tcp")获取servent结构体指针。
|
|
|
|
|
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
|
|
|
|
|
// 断言返回值ret为0,表示getservbyport_r函数调用成功。
|
|
|
|
|
ICUNIT_ASSERT_NOT_EQUAL(result, NULL, -1);
|
|
|
|
|
// 断言result不为空,即getservbyport_r成功。
|
|
|
|
|
ICUNIT_ASSERT_STRING_EQUAL(se.s_name, "ssh", -1);
|
|
|
|
|
// 断言返回的服务名称与"ssh"相同。
|
|
|
|
|
ICUNIT_ASSERT_STRING_EQUAL(se.s_proto, "tcp", -1);
|
|
|
|
|
// 断言返回的服务协议与"tcp"相同。
|
|
|
|
|
ICUNIT_ASSERT_STRING_EQUAL(se.s_aliases[0], "ssh", -1);
|
|
|
|
|
// 断言返回的服务别名与"ssh"相同。
|
|
|
|
|
ICUNIT_ASSERT_STRING_EQUAL(result->s_name, "ssh", -1);
|
|
|
|
|
// 断言result结构体中的服务名称与"ssh"相同。
|
|
|
|
|
ICUNIT_ASSERT_STRING_EQUAL(result->s_proto, "tcp", -1);
|
|
|
|
|
// 断言result结构体中的服务协议与"tcp"相同。
|
|
|
|
|
ICUNIT_ASSERT_STRING_EQUAL(result->s_aliases[0], "ssh", -1);
|
|
|
|
|
// 断言result结构体中的服务别名与"ssh"相同。
|
|
|
|
|
|
|
|
|
|
ret = getservbyport_r(htons(test_port_no), "udp", &se, buf, sizeof buf, &result);
|
|
|
|
|
// 尝试使用getservbyport_r函数根据端口号和协议名("udp")获取servent结构体指针,预期失败。
|
|
|
|
|
ICUNIT_ASSERT_EQUAL(ret, ENOENT, -1);
|
|
|
|
|
// 断言返回值ret为ENOENT,表示未找到对应服务。
|
|
|
|
|
|
|
|
|
|
ret = getservbyport_r(htons(test_port_no), "udp", &se, buf1, sizeof buf1, &result);
|
|
|
|
|
// 测试getservbyport_r函数的边界条件,传入的缓冲区太小。
|
|
|
|
|
ICUNIT_ASSERT_EQUAL(ret, ERANGE, ret);
|
|
|
|
|
// 断言返回值ret为ERANGE,表示缓冲区太小。
|
|
|
|
|
|
|
|
|
|
ret = getservbyport_r(htons(test_port_no), "ud", &se, buf, sizeof buf, &result);
|
|
|
|
|
// 尝试使用getservbyport_r函数根据端口号和不完整的协议名("ud")获取servent结构体指针,预期失败。
|
|
|
|
|
ICUNIT_ASSERT_EQUAL(ret, EINVAL, ret);
|
|
|
|
|
// 断言返回值ret为EINVAL,表示提供的协议名不合法。
|
|
|
|
|
|
|
|
|
|
RecoveryFileEnv(pathList, file_number);
|
|
|
|
|
// 恢复原始文件环境。
|
|
|
|
|
return ICUNIT_SUCCESS;
|
|
|
|
|
// 返回测试成功。
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetNetDbTest012(void)
|
|
|
|
|
{
|
|
|
|
|
TEST_ADD_CASE(__FUNCTION__, GetServByPortRTest, TEST_POSIX, TEST_TCP, TEST_LEVEL0, TEST_FUNCTION);
|
|
|
|
|
}
|
|
|
|
|
// 定义测试用例,将GetServByPortRTest函数注册为一个测试案例。
|