Asterisk - The Open Source Telephony Project  18.5.0
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 <[email protected]>
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 <[email protected]>
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_* */
39 struct 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 
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];
106  ast_copy_string(buf, ast_sockaddr_stringify(&addr), sizeof(buf));
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 
184 static int unload_module(void)
185 {
188  return 0;
189 }
190 
191 static int load_module(void)
192 {
196 }
197 
AST_TEST_DEFINE(parsing)
Definition: test_netsock2.c:44
#define AST_MODULE_INFO_STANDARD(keystr, desc)
Definition: module.h:567
Asterisk main include file. File version handling, generic pbx functions.
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
Definition: netsock2.c:230
char * address
Definition: f2c.h:59
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static int tmp()
Definition: bt_open.c:389
Test Framework API.
#define AST_TEST_REGISTER(cb)
Definition: test.h:127
def split_hostport(addr)
Socket address structure.
Definition: netsock2.h:97
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
#define TEST_SPLIT_HOSTPORT(str, flags, expected_host, expected_port, expected_result)
Configuration File Parser.
static char host[256]
Definition: muted.c:77
#define ast_test_status_update(a, b, c...)
Definition: test.h:129
Network socket handling.
static int load_module(void)
const char * address
Definition: test_netsock2.c:40
#define AST_TEST_UNREGISTER(cb)
Definition: test.h:128
def info(msg)
int expected_result
Definition: test_netsock2.c:41
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition: netsock2.h:260
Support for logging to various files, console and syslog Configuration in file logger.conf.
static void parsing(int size, unsigned char *buf, struct unistimsession *pte, struct sockaddr_in *addr_from)
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
#define ASTERISK_GPL_KEY
The text the key() function should return.
Definition: module.h:46
Asterisk module definitions.
static int unload_module(void)