Asterisk - The Open Source Telephony Project  21.4.1
test_aeap_transport.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2021, Sangoma Technologies Corporation
5  *
6  * Kevin Harwell <kharwell@sangoma.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 /*** MODULEINFO
20  <depend>TEST_FRAMEWORK</depend>
21  <depend>res_aeap</depend>
22  <support_level>core</support_level>
23  ***/
24 
25 #include "asterisk.h"
26 
27 #include "asterisk/http.h"
28 #include "asterisk/test.h"
29 #include "asterisk/module.h"
30 
31 #include "../res/res_aeap/transport.h"
32 
33 #define CATEGORY "/res/aeap/transport/"
34 
35 #define ADDR "127.0.0.1:8088"
36 #define TRANSPORT_URL "ws://" ADDR "/ws"
37 #define TRANSPORT_URL_INVALID "ws://" ADDR "/invalid"
38 #define TRANSPORT_PROTOCOL "echo"
39 #define TRANSPORT_PROTOCOL_INVALID "invalid"
40 #define TRANSPORT_TIMEOUT 2000
41 
42 AST_TEST_DEFINE(transport_create_invalid)
43 {
44  RAII_VAR(struct aeap_transport *, transport, NULL, aeap_transport_destroy);
45 
46  switch (cmd) {
47  case TEST_INIT:
48  info->name = __func__;
49  info->explicit_only = 0;
50  info->category = CATEGORY;
51  info->summary = "test creating an AEAP invalid transport type";
52  info->description = info->summary;
53  return AST_TEST_NOT_RUN;
54  case TEST_EXECUTE:
55  break;
56  }
57 
58  /* Transport is expected to be NULL here */
59  ast_test_validate(test, !(transport = aeap_transport_create("invalid")));
60 
61  return AST_TEST_PASS;
62 }
63 
64 AST_TEST_DEFINE(transport_create)
65 {
66  RAII_VAR(struct aeap_transport *, transport, NULL, aeap_transport_destroy);
67 
68  switch (cmd) {
69  case TEST_INIT:
70  info->name = __func__;
71  info->explicit_only = 0;
72  info->category = CATEGORY;
73  info->summary = "test creating an AEAP transport";
74  info->description = info->summary;
75  return AST_TEST_NOT_RUN;
76  case TEST_EXECUTE:
77  break;
78  }
79 
80  /* Type is based off the scheme, so just pass in the URL here */
81  ast_test_validate(test, (transport = aeap_transport_create(TRANSPORT_URL)));
82 
83  return AST_TEST_PASS;
84 }
85 
86 AST_TEST_DEFINE(transport_connect)
87 {
88  RAII_VAR(struct aeap_transport *, transport, NULL, aeap_transport_destroy);
89 
90  switch (cmd) {
91  case TEST_INIT:
92  info->name = __func__;
93  info->explicit_only = 0;
94  info->category = CATEGORY;
95  info->summary = "test connecting to an AEAP transport";
96  info->description = info->summary;
97  return AST_TEST_NOT_RUN;
98  case TEST_EXECUTE:
99  break;
100  }
101 
102  /* Type is based off the scheme, so just pass in the URL for the type */
103  ast_test_validate(test, (transport = aeap_transport_create_and_connect(
104  TRANSPORT_URL, TRANSPORT_URL, TRANSPORT_PROTOCOL, TRANSPORT_TIMEOUT)));
105 
106  ast_test_validate(test, aeap_transport_is_connected(transport));
107  ast_test_validate(test, !aeap_transport_disconnect(transport));
108  ast_test_validate(test, !aeap_transport_is_connected(transport));
109 
110  return AST_TEST_PASS;
111 }
112 
113 AST_TEST_DEFINE(transport_connect_fail)
114 {
115  RAII_VAR(struct aeap_transport *, transport, NULL, aeap_transport_destroy);
116 
117  switch (cmd) {
118  case TEST_INIT:
119  info->name = __func__;
120  info->explicit_only = 0;
121  info->category = CATEGORY;
122  info->summary = "test connecting failure for an AEAP transport";
123  info->description = info->summary;
124  return AST_TEST_NOT_RUN;
125  case TEST_EXECUTE:
126  break;
127  }
128 
129  /* Test invalid address */
130  ast_test_validate(test, (transport = aeap_transport_create(TRANSPORT_URL)));
131 
132  ast_test_validate(test, aeap_transport_connect(transport,
133  TRANSPORT_URL_INVALID, TRANSPORT_PROTOCOL, TRANSPORT_TIMEOUT));
134 
135  ast_test_validate(test, !aeap_transport_is_connected(transport));
136 
137  aeap_transport_destroy(transport);
138 
139  /* /\* Test invalid protocol *\/ */
140  ast_test_validate(test, (transport = aeap_transport_create(TRANSPORT_URL)));
141 
142  ast_test_validate(test, aeap_transport_connect(transport,
143  TRANSPORT_URL, TRANSPORT_PROTOCOL_INVALID, TRANSPORT_TIMEOUT));
144 
145  ast_test_validate(test, !aeap_transport_is_connected(transport));
146 
147  return AST_TEST_PASS;
148 }
149 
150 AST_TEST_DEFINE(transport_binary)
151 {
152  RAII_VAR(struct aeap_transport *, transport, NULL, aeap_transport_destroy);
153  int num = 38;
154  enum AST_AEAP_DATA_TYPE rtype;
155 
156  switch (cmd) {
157  case TEST_INIT:
158  info->name = __func__;
159  info->explicit_only = 0;
160  info->category = CATEGORY;
161  info->summary = "test binary I/O from an AEAP transport";
162  info->description = info->summary;
163  return AST_TEST_NOT_RUN;
164  case TEST_EXECUTE:
165  break;
166  }
167 
168  ast_test_validate(test, (transport = aeap_transport_create_and_connect(
169  TRANSPORT_URL, TRANSPORT_URL, TRANSPORT_PROTOCOL, TRANSPORT_TIMEOUT)));
170 
171  ast_test_validate(test, aeap_transport_write(transport, &num, sizeof(num),
172  AST_AEAP_DATA_TYPE_BINARY) == sizeof(num));
173  ast_test_validate(test, aeap_transport_read(transport, &num,
174  sizeof(num), &rtype) == sizeof(num));
175  ast_test_validate(test, rtype == AST_AEAP_DATA_TYPE_BINARY);
176  ast_test_validate(test, num == 38);
177 
178  return AST_TEST_PASS;
179 }
180 
181 AST_TEST_DEFINE(transport_string)
182 {
183  RAII_VAR(struct aeap_transport *, transport, NULL, aeap_transport_destroy);
184  char buf[16];
185  enum AST_AEAP_DATA_TYPE rtype;
186 
187  switch (cmd) {
188  case TEST_INIT:
189  info->name = __func__;
190  info->explicit_only = 0;
191  info->category = CATEGORY;
192  info->summary = "test string I/O from an AEAP transport";
193  info->description = info->summary;
194  return AST_TEST_NOT_RUN;
195  case TEST_EXECUTE:
196  break;
197  }
198 
199  ast_test_validate(test, (transport = aeap_transport_create_and_connect(
200  TRANSPORT_URL, TRANSPORT_URL, TRANSPORT_PROTOCOL, TRANSPORT_TIMEOUT)));
201 
202  ast_test_validate(test, aeap_transport_write(transport, "foo bar baz", 11,
203  AST_AEAP_DATA_TYPE_STRING) == 11);
204  ast_test_validate(test, aeap_transport_read(transport, buf,
205  sizeof(buf) / sizeof(char), &rtype) == 11);
206  ast_test_validate(test, rtype == AST_AEAP_DATA_TYPE_STRING);
207  ast_test_validate(test, !strcmp(buf, "foo bar baz"));
208 
209  return AST_TEST_PASS;
210 }
211 
212 static struct ast_http_server *http_server;
213 
214 static int load_module(void)
215 {
216  if (!(http_server = ast_http_test_server_get("aeap transport http server", NULL))) {
218  }
219 
220  AST_TEST_REGISTER(transport_string);
221  AST_TEST_REGISTER(transport_binary);
222  AST_TEST_REGISTER(transport_connect_fail);
223  AST_TEST_REGISTER(transport_connect);
224  AST_TEST_REGISTER(transport_create);
225  AST_TEST_REGISTER(transport_create_invalid);
226 
228 }
229 
230 static int unload_module(void)
231 {
232  AST_TEST_UNREGISTER(transport_string);
233  AST_TEST_UNREGISTER(transport_binary);
234  AST_TEST_UNREGISTER(transport_connect_fail);
235  AST_TEST_UNREGISTER(transport_connect);
236  AST_TEST_UNREGISTER(transport_create);
237  AST_TEST_UNREGISTER(transport_create_invalid);
238 
239  ast_http_test_server_discard(http_server);
240 
241  return 0;
242 }
243 
244 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Asterisk External Application Protocol Transport Tests",
245  .support_level = AST_MODULE_SUPPORT_CORE,
246  .load = load_module,
247  .unload = unload_module,
248  .requires = "res_aeap",
249 );
Asterisk main include file. File version handling, generic pbx functions.
Test Framework API.
Support for Private Asterisk HTTP Servers.
#define CATEGORY
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
AST_AEAP_DATA_TYPE
Supported Asterisk external application data types.
Definition: res_aeap.h:135
Asterisk external application transport structure to be "derived" by specific transport implementatio...
Definition: transport.h:98
#define AST_TEST_DEFINE(hdr)
Definition: test.h:126
#define ASTERISK_GPL_KEY
The text the key() function should return.
Definition: module.h:46
Asterisk module definitions.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:941