Asterisk - The Open Source Telephony Project GIT-master-b023714
Loading...
Searching...
No Matches
Data Structures | Macros | Functions | Variables
test_netsock2.c File Reference

Netsock2 Unit Tests. More...

#include "asterisk.h"
#include "asterisk/test.h"
#include "asterisk/module.h"
#include "asterisk/netsock2.h"
#include "asterisk/logger.h"
#include "asterisk/config.h"
Include dependency graph for test_netsock2.c:

Go to the source code of this file.

Data Structures

struct  parse_test
 

Macros

#define TEST_SPLIT_HOSTPORT(str, flags, expected_host, expected_port, expected_result)
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
 AST_TEST_DEFINE (parsing)
 
 AST_TEST_DEFINE (split_hostport)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Netsock2 test module" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 

Detailed Description

Netsock2 Unit Tests.

Author
Terry Wilson twils.nosp@m.on@d.nosp@m.igium.nosp@m..com

Definition in file test_netsock2.c.

Macro Definition Documentation

◆ TEST_SPLIT_HOSTPORT

#define TEST_SPLIT_HOSTPORT (   str,
  flags,
  expected_host,
  expected_port,
  expected_result 
)

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 198 of file test_netsock2.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 198 of file test_netsock2.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 198 of file test_netsock2.c.

◆ AST_TEST_DEFINE() [1/2]

AST_TEST_DEFINE ( parsing  )

Definition at line 44 of file test_netsock2.c.

45{
46 int res = AST_TEST_PASS;
47 struct parse_test test_vals[] = {
48 { "192.168.1.0", 1 },
49 { "10.255.255.254", 1 },
50 { "172.18.5.4", 1 },
51 { "8.8.4.4", 1 },
52 { "0.0.0.0", 1 },
53 { "127.0.0.1", 1 },
54 { "1.256.3.4", 0 },
55 { "256.0.0.1", 0 },
56 { "1.2.3.4:5060", 1 },
57 { "::ffff:5.6.7.8", 1 },
58 { "fdf8:f53b:82e4::53", 1 },
59 { "fe80::200:5aee:feaa:20a2", 1 },
60 { "2001::1", 1 },
61 { "2001:0000:4136:e378:8000:63bf:3fff:fdd2", 1 },
62 { "2001:0002:6c::430", 1 },
63 { "2001:10:240:ab::a", 1 },
64 { "2002:cb0a:3cdd:1::1", 1 },
65 { "2001:db8:8:4::2", 1 }, /* Documentation only, should never be used */
66 { "ff01:0:0:0:0:0:0:2", 1 }, /* Multicast */
67 { "[fdf8:f53b:82e4::53]", 1 },
68 { "[fe80::200:5aee:feaa:20a2]", 1 },
69 { "[2001::1]", 1 },
70 { "[2001:0000:4136:e378:8000:63bf:3fff:fdd2]:5060", 1 },
71 { "2001:0000:4136:e378:8000:63bf:3fff:fdd2:5060", 0 }, /* port, but no brackets */
72 { "fe80::200::abcd", 0 }, /* multiple zero expansions */
73 };
74
75 size_t x;
76 struct ast_sockaddr addr;
77 int parse_result;
78
79 switch (cmd) {
80 case TEST_INIT:
81 info->name = "parsing";
82 info->category = "/main/netsock2/";
83 info->summary = "netsock2 parsing unit test";
84 info->description =
85 "Test parsing of IPv4 and IPv6 network addresses";
86 return AST_TEST_NOT_RUN;
87 case TEST_EXECUTE:
88 break;
89 }
90
91 for (x = 0; x < ARRAY_LEN(test_vals); x++) {
92 memset(&addr, 0, sizeof(addr));
93 if ((parse_result = ast_sockaddr_parse(&addr, test_vals[x].address, 0)) != test_vals[x].expected_result) {
94 ast_test_status_update(test, "On '%s' expected %d but got %d\n", test_vals[x].address, test_vals[x].expected_result, parse_result);
95 res = AST_TEST_FAIL;
96 }
97 if (parse_result) {
98 struct ast_sockaddr tmp_addr;
99 const char *tmp;
100
101 tmp = ast_sockaddr_stringify(&addr);
102 memset(&tmp_addr, 0, sizeof(tmp_addr));
103 ast_sockaddr_parse(&tmp_addr, tmp, 0);
104 if (ast_sockaddr_cmp_addr(&addr, &tmp_addr)) {
105 char buf[64];
107 ast_test_status_update(test, "Re-parsed stringification of '%s' did not match: '%s' vs '%s'\n", test_vals[x].address, buf, ast_sockaddr_stringify(&tmp_addr));
108 res = AST_TEST_FAIL;
109 }
110 }
111 }
112
113 return res;
114}
char buf[BUFSIZE]
Definition eagi_proxy.c:66
char * address
Definition f2c.h:59
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition netsock2.h:256
int ast_sockaddr_cmp_addr(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares the addresses of two ast_sockaddr structures.
Definition netsock2.c:413
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
Definition netsock2.c:230
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
Socket address structure.
Definition netsock2.h:97
@ TEST_INIT
Definition test.h:200
@ TEST_EXECUTE
Definition test.h:201
#define ast_test_status_update(a, b, c...)
Definition test.h:129
@ AST_TEST_PASS
Definition test.h:195
@ AST_TEST_FAIL
Definition test.h:196
@ AST_TEST_NOT_RUN
Definition test.h:194
#define ARRAY_LEN(a)
Definition utils.h:703

References ARRAY_LEN, ast_copy_string(), ast_sockaddr_cmp_addr(), ast_sockaddr_parse(), ast_sockaddr_stringify(), AST_TEST_FAIL, AST_TEST_NOT_RUN, AST_TEST_PASS, ast_test_status_update, buf, TEST_EXECUTE, and TEST_INIT.

◆ AST_TEST_DEFINE() [2/2]

AST_TEST_DEFINE ( split_hostport  )

Definition at line 116 of file test_netsock2.c.

117{
118 int res = AST_TEST_PASS;
119 char *host, *port, buf[128];
120
121 switch (cmd) {
122 case TEST_INIT:
123 info->name = "split_hostport";
124 info->category = "/main/netsock2/";
125 info->summary = "netsock2 ast_sockaddr_split_hostport() unit test";
126 info->description =
127 "Test splitting of IPv4 and IPv6 host:port strings";
128 return AST_TEST_NOT_RUN;
129 case TEST_EXECUTE:
130 break;
131 }
132
133/* Assumes res, host, and port variables */
134#define TEST_SPLIT_HOSTPORT(str, flags, expected_host, expected_port, expected_result) { \
135 int __res; \
136 ast_copy_string(buf, str, sizeof(buf)); \
137 if ((__res = ast_sockaddr_split_hostport(buf, &host, &port, flags)) != expected_result || ( \
138 expected_result && ( \
139 strcmp(host, expected_host) || ( \
140 ast_strlen_zero(expected_port) ? !ast_strlen_zero(port) : (!ast_strlen_zero(port) && strcmp(port, expected_port)) \
141 ) \
142 ) \
143 ) \
144 ) { \
145 res = AST_TEST_FAIL; \
146 if (__res != expected_result) { \
147 ast_test_status_update(test, "Expected %d, got %d\n", expected_result, __res); \
148 } else { \
149 ast_test_status_update(test, "Failed parsing '%s' into expected host '%s' (got '%s') and port '%s' (got '%s')\n", \
150 str, S_OR(expected_host, ""), host, expected_port, S_OR(port, "")); \
151 } \
152 } \
153}
154
155 /* Test various situations with flags = 0 */
156 TEST_SPLIT_HOSTPORT("192.168.1.1", 0, "192.168.1.1", "", 1);
157 TEST_SPLIT_HOSTPORT("192.168.1.1:5060", 0, "192.168.1.1", "5060", 1);
158 TEST_SPLIT_HOSTPORT("::ffff:5.6.7.8", 0, "::ffff:5.6.7.8", "", 1);
159 TEST_SPLIT_HOSTPORT("[::ffff:5.6.7.8]:5060", 0, "::ffff:5.6.7.8", "5060", 1);
160 TEST_SPLIT_HOSTPORT("fdf8:f53b:82e4::53", 0, "fdf8:f53b:82e4::53", "", 1);
161 TEST_SPLIT_HOSTPORT("fe80::200:5aee:feaa:20a2", 0, "fe80::200:5aee:feaa:20a2", "", 1);
162 TEST_SPLIT_HOSTPORT("[fdf8:f53b:82e4::53]", 0, "fdf8:f53b:82e4::53", "", 1);
163 TEST_SPLIT_HOSTPORT("[fe80::200:5aee:feaa:20a2]:5060", 0, "fe80::200:5aee:feaa:20a2", "5060", 1);
164 TEST_SPLIT_HOSTPORT("host:port", 0, "host", "port", 1);
165 TEST_SPLIT_HOSTPORT("host", 0, "host", "", 1);
166
167 /* Make sure that flag conditions work when they should */
168 TEST_SPLIT_HOSTPORT("192.168.1.1:5060", PARSE_PORT_IGNORE, "192.168.1.1", "", 1);
169 TEST_SPLIT_HOSTPORT("192.168.1.1:5060", PARSE_PORT_REQUIRE, "192.168.1.1", "5060", 1);
170 TEST_SPLIT_HOSTPORT("192.168.1.1", PARSE_PORT_FORBID, "192.168.1.1", "", 1);
171 TEST_SPLIT_HOSTPORT("[::ffff:5.6.7.8]:5060", PARSE_PORT_IGNORE, "::ffff:5.6.7.8", "", 1);
172 TEST_SPLIT_HOSTPORT("[::ffff:5.6.7.8]:5060", PARSE_PORT_REQUIRE, "::ffff:5.6.7.8", "5060", 1);
173 TEST_SPLIT_HOSTPORT("::ffff:5.6.7.8", PARSE_PORT_FORBID, "::ffff:5.6.7.8", "", 1);
174
175 /* Make sure it fails when flag requirements are not met */
176 TEST_SPLIT_HOSTPORT("192.168.1.1", PARSE_PORT_REQUIRE, "<undefined>", "<undefined>", 0);
177 TEST_SPLIT_HOSTPORT("192.168.1.1:5060", PARSE_PORT_FORBID, "<undefined>", "<undefined>", 0);
178 TEST_SPLIT_HOSTPORT("::ffff:5.6.7.8", PARSE_PORT_REQUIRE, "<undefined>", "<undefined>", 0);
179 TEST_SPLIT_HOSTPORT("[::ffff:5.6.7.8]:5060", PARSE_PORT_FORBID, "<undefined>", "<undefined>", 0);
180
181 return res;
182}
#define TEST_SPLIT_HOSTPORT(str, flags, expected_host, expected_port, expected_result)

References AST_TEST_NOT_RUN, AST_TEST_PASS, buf, PARSE_PORT_FORBID, PARSE_PORT_IGNORE, PARSE_PORT_REQUIRE, TEST_EXECUTE, TEST_INIT, and TEST_SPLIT_HOSTPORT.

◆ load_module()

static int load_module ( void  )
static

Definition at line 191 of file test_netsock2.c.

192{
194 AST_TEST_REGISTER(split_hostport);
196}
static void parsing(int size, unsigned char *buf, struct unistimsession *pte, struct sockaddr_in *addr_from)
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
#define AST_TEST_REGISTER(cb)
Definition test.h:127

References AST_MODULE_LOAD_SUCCESS, AST_TEST_REGISTER, and parsing().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 184 of file test_netsock2.c.

185{
187 AST_TEST_UNREGISTER(split_hostport);
188 return 0;
189}
#define AST_TEST_UNREGISTER(cb)
Definition test.h:128

References AST_TEST_UNREGISTER, and parsing().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Netsock2 test module" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
static

Definition at line 198 of file test_netsock2.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 198 of file test_netsock2.c.