Asterisk - The Open Source Telephony Project  18.5.0
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 = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .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 
)

Referenced by AST_TEST_DEFINE().

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.

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, parse_test::expected_result, sip_to_pjsip::info(), TEST_EXECUTE, TEST_INIT, and tmp().

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 }
#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
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 ast_test_status_update(a, b, c...)
Definition: test.h:129
def info(msg)
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition: netsock2.h:260
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401

◆ AST_TEST_DEFINE() [2/2]

AST_TEST_DEFINE ( split_hostport  )

Definition at line 116 of file test_netsock2.c.

References AST_TEST_NOT_RUN, AST_TEST_PASS, buf, host, sip_to_pjsip::info(), PARSE_PORT_FORBID, PARSE_PORT_IGNORE, PARSE_PORT_REQUIRE, TEST_EXECUTE, TEST_INIT, and TEST_SPLIT_HOSTPORT.

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 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define TEST_SPLIT_HOSTPORT(str, flags, expected_host, expected_port, expected_result)
static char host[256]
Definition: muted.c:77
def info(msg)

◆ load_module()

static int load_module ( void  )
static

Definition at line 191 of file test_netsock2.c.

References AST_MODULE_LOAD_SUCCESS, AST_TEST_REGISTER, parsing(), and sip_to_pjsip::split_hostport().

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

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 184 of file test_netsock2.c.

References AST_TEST_UNREGISTER, parsing(), and sip_to_pjsip::split_hostport().

185 {
188  return 0;
189 }
def split_hostport(addr)
#define AST_TEST_UNREGISTER(cb)
Definition: test.h:128
static void parsing(int size, unsigned char *buf, struct unistimsession *pte, struct sockaddr_in *addr_from)

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Netsock2 test module" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .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.