Asterisk - The Open Source Telephony Project GIT-master-f36a736
test_netsock2.c
Go to the documentation of this file.
1/*
2 * Asterisk -- An open source telephony toolkit.
3 *
4 * Copyright (C) 2011, Digium, Inc.
5 *
6 * Terry Wilson <twilson@digium.com>
7 *
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
13 *
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
17 */
18
19/*!
20 * \file
21 * \brief Netsock2 Unit Tests
22 *
23 * \author Terry Wilson <twilson@digium.com>
24 *
25 */
26
27/*** MODULEINFO
28 <depend>TEST_FRAMEWORK</depend>
29 <support_level>core</support_level>
30 ***/
31
32#include "asterisk.h"
33
34#include "asterisk/test.h"
35#include "asterisk/module.h"
36#include "asterisk/netsock2.h"
37#include "asterisk/logger.h"
38#include "asterisk/config.h" /* PARSE_PORT_* */
39struct parse_test {
40 const char *address;
42};
43
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
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}
115
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}
183
184static int unload_module(void)
185{
188 return 0;
189}
190
191static int load_module(void)
192{
196}
197
Asterisk main include file. File version handling, generic pbx functions.
static int tmp()
Definition: bt_open.c:389
static void parsing(int size, unsigned char *buf, struct unistimsession *pte, struct sockaddr_in *addr_from)
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
char * address
Definition: f2c.h:59
Configuration File Parser.
@ PARSE_PORT_REQUIRE
Support for logging to various files, console and syslog Configuration in file logger....
Asterisk module definitions.
#define AST_MODULE_INFO_STANDARD(keystr, desc)
Definition: module.h:581
#define ASTERISK_GPL_KEY
The text the key() function should return.
Definition: module.h:46
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
def info(msg)
def split_hostport(addr)
Network socket handling.
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
const char * address
Definition: test_netsock2.c:40
int expected_result
Definition: test_netsock2.c:41
Test Framework API.
@ TEST_INIT
Definition: test.h:200
@ TEST_EXECUTE
Definition: test.h:201
#define AST_TEST_REGISTER(cb)
Definition: test.h:127
#define ast_test_status_update(a, b, c...)
Definition: test.h:129
#define AST_TEST_UNREGISTER(cb)
Definition: test.h:128
@ AST_TEST_PASS
Definition: test.h:195
@ AST_TEST_FAIL
Definition: test.h:196
@ AST_TEST_NOT_RUN
Definition: test.h:194
AST_TEST_DEFINE(parsing)
Definition: test_netsock2.c:44
#define TEST_SPLIT_HOSTPORT(str, flags, expected_host, expected_port, expected_result)
static int load_module(void)
static int unload_module(void)
#define ARRAY_LEN(a)
Definition: utils.h:666