53 static int invocation_count;
59 static void handler(
const char *name,
76 for (; get_params != NULL; get_params = get_params->
next) {
80 for (; path_vars != NULL; path_vars = path_vars->
next) {
84 for (; headers != NULL; headers = headers->
next) {
97 #define HANDLER(name, response_code) \
98 static void name(struct ast_tcptls_session_instance *ser, \
99 struct ast_variable *get_params, \
100 struct ast_variable *path_vars, \
101 struct ast_variable *headers, \
102 struct ast_json *body, \
103 struct ast_ari_response *response) \
105 handler(#name, response_code, get_params, path_vars, headers, body, response); \
108 HANDLER(bang_get, 200)
109 HANDLER(bang_post, 200)
110 HANDLER(bang_delete, 204)
111 HANDLER(bar_get, 200)
112 HANDLER(bar_post, 200)
113 HANDLER(bam_get, 200)
114 HANDLER(foo_get, 200)
119 [AST_HTTP_GET] = bang_get,
120 [AST_HTTP_POST] = bang_post,
121 [AST_HTTP_DELETE] = bang_delete,
128 [AST_HTTP_GET] = bar_get,
129 [AST_HTTP_POST] = bar_post,
137 [AST_HTTP_GET] = bam_get,
140 .children = { &bang }
145 [AST_HTTP_GET] = foo_get,
148 .children = { &bar, &bam, &bang }
183 invocation_count = 0;
186 return &invocation_count;
206 const char *basePath;
210 info->name = __func__;
211 info->category =
"/res/ari/";
212 info->summary =
"Test simple API get.";
213 info->description =
"Test ARI binding logic.";
214 return AST_TEST_NOT_RUN;
219 response = response_alloc();
220 headers = ast_variable_new(
"Host",
"stasis.asterisk.org", __FILE__);
221 ast_ari_get_docs(
"resources.json",
"", headers, response);
226 ast_test_validate(
test, NULL != basePathJson);
228 ast_test_validate(
test, 0 == strcmp(
"http://stasis.asterisk.org/ari", basePath));
230 return AST_TEST_PASS;
241 info->name = __func__;
242 info->category =
"/res/ari/";
243 info->summary =
"Test API get without a Host header";
244 info->description =
"Test ARI binding logic.";
245 return AST_TEST_NOT_RUN;
250 response = response_alloc();
251 ast_ari_get_docs(
"resources.json",
"", headers, response);
256 ast_test_validate(
test, NULL == basePathJson);
258 return AST_TEST_PASS;
268 info->name = __func__;
269 info->category =
"/res/ari/";
270 info->summary =
"Test API get for invalid resource";
271 info->description =
"Test ARI binding logic.";
272 return AST_TEST_NOT_RUN;
277 response = response_alloc();
278 ast_ari_get_docs(
"i-am-not-a-resource.json",
"", headers, response);
281 return AST_TEST_PASS;
291 info->name = __func__;
292 info->category =
"/res/ari/";
293 info->summary =
"Test API get for a file outside the rest-api path";
294 info->description =
"Test ARI binding logic.";
295 return AST_TEST_NOT_RUN;
300 response = response_alloc();
301 ast_ari_get_docs(
"../../../../sbin/asterisk",
"", headers, response);
304 return AST_TEST_PASS;
317 info->name = __func__;
318 info->category =
"/res/ari/";
319 info->summary =
"Test simple GET of an HTTP resource.";
320 info->description =
"Test ARI binding logic.";
321 return AST_TEST_NOT_RUN;
327 response = response_alloc();
328 get_params = ast_variable_new(
"get1",
"get-one", __FILE__);
329 ast_assert(get_params != NULL);
330 get_params->
next = ast_variable_new(
"get2",
"get-two", __FILE__);
331 ast_assert(get_params->
next != NULL);
333 headers = ast_variable_new(
"head1",
"head-one", __FILE__);
334 ast_assert(headers != NULL);
335 headers->
next = ast_variable_new(
"head2",
"head-two", __FILE__);
336 ast_assert(headers->
next != NULL);
338 expected =
ast_json_pack(
"{s: s, s: {s: s, s: s}, s: {s: s, s: s}, s: {}}",
348 ast_ari_invoke(NULL,
"foo", AST_HTTP_GET, get_params, headers,
351 ast_test_validate(
test, 1 == invocation_count);
355 return AST_TEST_PASS;
368 info->name = __func__;
369 info->category =
"/res/ari/";
370 info->summary =
"Test GET of a wildcard resource.";
371 info->description =
"Test ARI binding logic.";
372 return AST_TEST_NOT_RUN;
378 response = response_alloc();
386 ast_ari_invoke(NULL,
"foo/foshizzle", AST_HTTP_GET, get_params, headers,
389 ast_test_validate(
test, 1 == invocation_count);
393 return AST_TEST_PASS;
406 info->name = __func__;
407 info->category =
"/res/ari/";
408 info->summary =
"Test DELETE of an HTTP resource.";
409 info->description =
"Test ARI binding logic.";
410 return AST_TEST_NOT_RUN;
416 response = response_alloc();
418 "name",
"bang_delete",
424 ast_ari_invoke(NULL,
"foo/foshizzle/bang", AST_HTTP_DELETE, get_params, headers,
427 ast_test_validate(
test, 1 == invocation_count);
431 return AST_TEST_PASS;
444 info->name = __func__;
445 info->category =
"/res/ari/";
446 info->summary =
"Test POST of an HTTP resource.";
447 info->description =
"Test ARI binding logic.";
448 return AST_TEST_NOT_RUN;
454 response = response_alloc();
455 get_params = ast_variable_new(
"get1",
"get-one", __FILE__);
456 ast_assert(get_params != NULL);
457 get_params->
next = ast_variable_new(
"get2",
"get-two", __FILE__);
458 ast_assert(get_params->
next != NULL);
460 headers = ast_variable_new(
"head1",
"head-one", __FILE__);
461 ast_assert(headers != NULL);
462 headers->
next = ast_variable_new(
"head2",
"head-two", __FILE__);
463 ast_assert(headers->
next != NULL);
465 expected =
ast_json_pack(
"{s: s, s: {s: s, s: s}, s: {s: s, s: s}, s: {}}",
475 ast_ari_invoke(NULL,
"foo/bar", AST_HTTP_POST, get_params, headers,
478 ast_test_validate(
test, 1 == invocation_count);
482 return AST_TEST_PASS;
494 info->name = __func__;
495 info->category =
"/res/ari/";
496 info->summary =
"Test POST on a resource that doesn't support it.";
497 info->description =
"Test ARI binding logic.";
498 return AST_TEST_NOT_RUN;
504 response = response_alloc();
505 ast_ari_invoke(NULL,
"foo", AST_HTTP_POST, get_params, headers,
508 ast_test_validate(
test, 0 == invocation_count);
511 return AST_TEST_PASS;
523 info->name = __func__;
524 info->category =
"/res/ari/";
525 info->summary =
"Test GET on a resource that does not exist.";
526 info->description =
"Test ARI binding logic.";
527 return AST_TEST_NOT_RUN;
533 response = response_alloc();
534 ast_ari_invoke(NULL,
"foo/fizzle/i-am-not-a-resource", AST_HTTP_GET, get_params, headers,
537 ast_test_validate(
test, 0 == invocation_count);
540 return AST_TEST_PASS;
543 static int unload_module(
void)
545 AST_TEST_UNREGISTER(get_docs);
546 AST_TEST_UNREGISTER(get_docs_nohost);
547 AST_TEST_UNREGISTER(get_docs_notfound);
548 AST_TEST_UNREGISTER(get_docs_hackerz);
549 AST_TEST_UNREGISTER(invoke_get);
550 AST_TEST_UNREGISTER(invoke_wildcard);
551 AST_TEST_UNREGISTER(invoke_delete);
552 AST_TEST_UNREGISTER(invoke_post);
553 AST_TEST_UNREGISTER(invoke_bad_post);
554 AST_TEST_UNREGISTER(invoke_not_found);
558 static int load_module(
void)
560 AST_TEST_REGISTER(get_docs);
561 AST_TEST_REGISTER(get_docs_nohost);
562 AST_TEST_REGISTER(get_docs_notfound);
563 AST_TEST_REGISTER(get_docs_hackerz);
564 AST_TEST_REGISTER(invoke_get);
565 AST_TEST_REGISTER(invoke_wildcard);
566 AST_TEST_REGISTER(invoke_delete);
567 AST_TEST_REGISTER(invoke_post);
568 AST_TEST_REGISTER(invoke_bad_post);
569 AST_TEST_REGISTER(invoke_not_found);
574 .support_level = AST_MODULE_SUPPORT_CORE,
576 .unload = unload_module,
577 .requires =
"res_ari",
struct ast_variable * next
Asterisk main include file. File version handling, generic pbx functions.
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Structure for variables, used for configurations and for channel variables.
Asterisk RESTful API hooks.
static void tear_down_invocation_test(void *ignore)
int ast_json_object_set(struct ast_json *object, const char *key, struct ast_json *value)
Set a field in a JSON object.
struct ast_json * ast_json_null(void)
Get the JSON null value.
static void * setup_invocation_test(void)
struct ast_json * ast_json_string_create(const char *value)
Construct a JSON string from value.
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
int ast_ari_add_handler(struct stasis_rest_handlers *handler)
int ast_ari_remove_handler(struct stasis_rest_handlers *handler)
#define ast_calloc(num, len)
A wrapper for calloc()
struct ast_json * message
const char * path_segment
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
int ast_json_equal(const struct ast_json *lhs, const struct ast_json *rhs)
Compare two JSON objects.
#define AST_TEST_DEFINE(hdr)
Abstract JSON element (object, array, string, int, ...).
#define ASTERISK_GPL_KEY
The text the key() function should return.
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.
Handler for a single RESTful path segment.
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.