Asterisk - The Open Source Telephony Project  GIT-master-4a4f1a5
Data Structures | Macros | Functions | Variables
test_linkedlists.c File Reference

Linked List Tests. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/test.h"
#include "asterisk/strings.h"
#include "asterisk/logger.h"
#include "asterisk/linkedlists.h"
#include "asterisk/dlinkedlists.h"

Go to the source code of this file.

Data Structures

struct  test_dbl_llist
 
struct  test_llist
 
struct  test_val
 

Macros

#define ELEM_OR_FAIL(x, y)
 
#define MATCH_OR_FAIL(list, val, retbuf)
 
#define MATCH_OR_FAIL_DBL(list, val, retbuf)
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
 AST_TEST_DEFINE (double_ll_tests)
 
 AST_TEST_DEFINE (single_ll_tests)
 
static int dbl_list_expect_forward (struct test_dbl_llist *test_list, const char *expect, struct ast_str **buf)
 
static int dbl_list_expect_reverse (struct test_dbl_llist *test_list, const char *expect, struct ast_str **buf)
 
static int list_expect (struct test_llist *test_list, const char *expect, struct ast_str **buf)
 
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 = "Test Linked Lists" , .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 struct test_val a = { "A" }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct test_val b = { "B" }
 
static struct test_val c = { "C" }
 
static struct test_val d = { "D" }
 

Detailed Description

Linked List Tests.

Author
Terry Wilson twils.nosp@m.on@d.nosp@m.igium.nosp@m..com

Definition in file test_linkedlists.c.

Macro Definition Documentation

◆ ELEM_OR_FAIL

#define ELEM_OR_FAIL (   x,
 
)
Value:
if ((x) != (y)) { \
ast_test_status_update(test, "Expected: %s, Got: %s\n", (x)->name, (y)->name); \
return AST_TEST_FAIL; \
}
static const char name[]
Definition: format_mp3.c:68
@ AST_TEST_FAIL
Definition: test.h:203

Definition at line 119 of file test_linkedlists.c.

◆ MATCH_OR_FAIL

#define MATCH_OR_FAIL (   list,
  val,
  retbuf 
)
Value:
if (list_expect(list, val, &retbuf)) { \
ast_test_status_update(test, "Expected: %s, Got: %s\n", val, ast_str_buffer(retbuf)); \
return AST_TEST_FAIL; \
}
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:727
Definition: ast_expr2.c:325
static int list_expect(struct test_llist *test_list, const char *expect, struct ast_str **buf)

Definition at line 103 of file test_linkedlists.c.

◆ MATCH_OR_FAIL_DBL

#define MATCH_OR_FAIL_DBL (   list,
  val,
  retbuf 
)

Definition at line 109 of file test_linkedlists.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 662 of file test_linkedlists.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 662 of file test_linkedlists.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 662 of file test_linkedlists.c.

◆ AST_TEST_DEFINE() [1/2]

AST_TEST_DEFINE ( double_ll_tests  )

Definition at line 337 of file test_linkedlists.c.

338 {
339  RAII_VAR(struct ast_str *, buf, NULL, ast_free);
340  struct test_dbl_llist test_list = { 0, };
341  struct test_dbl_llist other_list = { 0, };
342  struct test_val *bogus;
343 
344  switch (cmd) {
345  case TEST_INIT:
346  info->name = "double_ll_tests";
347  info->category = "/main/linkedlists/";
348  info->summary = "double linked list unit test";
349  info->description =
350  "Test the double linked list API";
351  return AST_TEST_NOT_RUN;
352  case TEST_EXECUTE:
353  break;
354  }
355 
356  if (!(buf = ast_str_create(16))) {
357  return AST_TEST_FAIL;
358  }
359 
360  bogus = ast_alloca(sizeof(*bogus));
361 
362  if (AST_DLLIST_REMOVE_VERIFY(&test_list, bogus, dbl_list)) {
363  ast_test_status_update(test, "AST_DLLIST_REMOVE_VERIFY should safely return NULL for missing element from empty list\n");
364  return AST_TEST_FAIL;
365  }
366 
367  /* INSERT_HEAD and REMOVE_HEAD tests */
368  AST_DLLIST_INSERT_HEAD(&test_list, &a, dbl_list);
369  MATCH_OR_FAIL_DBL(&test_list, "A", buf);
370  AST_DLLIST_INSERT_HEAD(&test_list, &b, dbl_list);
371  MATCH_OR_FAIL_DBL(&test_list, "BA", buf);
372  AST_DLLIST_REMOVE_HEAD(&test_list, dbl_list);
373  MATCH_OR_FAIL_DBL(&test_list, "A", buf);
374  AST_DLLIST_REMOVE_HEAD(&test_list, dbl_list);
375  MATCH_OR_FAIL_DBL(&test_list, "", buf);
376  if (AST_DLLIST_REMOVE_HEAD(&test_list, dbl_list)) {
377  ast_test_status_update(test, "Somehow removed an item from the head of a list that didn't exist\n");
378  return AST_TEST_FAIL;
379  }
380  MATCH_OR_FAIL_DBL(&test_list, "", buf);
381 
382  /* Check empty list test */
383 
384  if (!AST_DLLIST_EMPTY(&test_list)) {
385  ast_test_status_update(test, "List should be empty\n");
386  return AST_TEST_FAIL;
387  }
388 
389  /* Insert tail and remove specific item tests. */
390 
391  AST_DLLIST_INSERT_TAIL(&test_list, &a, dbl_list);
392  MATCH_OR_FAIL_DBL(&test_list, "A", buf);
393  AST_DLLIST_INSERT_TAIL(&test_list, &b, dbl_list);
394  MATCH_OR_FAIL_DBL(&test_list, "AB", buf);
395  AST_DLLIST_INSERT_TAIL(&test_list, &c, dbl_list);
396  MATCH_OR_FAIL_DBL(&test_list, "ABC", buf);
397  AST_DLLIST_INSERT_TAIL(&test_list, &d, dbl_list);
398  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
399  if (AST_DLLIST_REMOVE_VERIFY(&test_list, bogus, dbl_list)) {
400  ast_test_status_update(test, "AST_DLLIST_REMOVE_VERIFY should safely return NULL for missing element\n");
401  return AST_TEST_FAIL;
402  }
403  bogus = NULL;
404  if (AST_DLLIST_REMOVE_VERIFY(&test_list, bogus, dbl_list)) {
405  ast_test_status_update(test, "AST_DLLIST_REMOVE_VERIFY should safely return NULL for element set to NULL\n");
406  return AST_TEST_FAIL;
407  }
408  AST_DLLIST_REMOVE(&test_list, &b, dbl_list);
409  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
410  AST_DLLIST_REMOVE(&test_list, &d, dbl_list);
411  MATCH_OR_FAIL_DBL(&test_list, "AC", buf);
412  AST_DLLIST_REMOVE(&test_list, &a, dbl_list);
413  MATCH_OR_FAIL_DBL(&test_list, "C", buf);
414  AST_DLLIST_REMOVE(&test_list, &c, dbl_list);
415  MATCH_OR_FAIL_DBL(&test_list, "", buf);
416  if (!AST_DLLIST_EMPTY(&test_list)) {
417  ast_test_status_update(test, "List should be empty\n");
418  return AST_TEST_FAIL;
419  }
420  if (AST_DLLIST_REMOVE_VERIFY(&test_list, bogus, dbl_list)) {
421  ast_test_status_update(test, "AST_DLLIST_REMOVE_VERIFY should safely return NULL asked to remove a NULL pointer from an empty list\n");
422  return AST_TEST_FAIL;
423  }
424 
425  /* Insert item after and before specific item tests */
426 
427  AST_DLLIST_INSERT_HEAD(&test_list, &a, dbl_list);
428  MATCH_OR_FAIL_DBL(&test_list, "A", buf);
429  AST_DLLIST_INSERT_TAIL(&test_list, &c, dbl_list);
430  MATCH_OR_FAIL_DBL(&test_list, "AC", buf);
431  AST_DLLIST_INSERT_AFTER(&test_list, &a, &b, dbl_list);
432  MATCH_OR_FAIL_DBL(&test_list, "ABC", buf);
433  AST_DLLIST_INSERT_AFTER(&test_list, &c, &d, dbl_list);
434  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
435  AST_DLLIST_REMOVE_TAIL(&test_list, dbl_list);
436  MATCH_OR_FAIL_DBL(&test_list, "ABC", buf);
437  AST_DLLIST_REMOVE_TAIL(&test_list, dbl_list);
438  MATCH_OR_FAIL_DBL(&test_list, "AB", buf);
439  AST_DLLIST_INSERT_TAIL(&test_list, &d, dbl_list);
440  MATCH_OR_FAIL_DBL(&test_list, "ABD", buf);
441  AST_DLLIST_INSERT_BEFORE(&test_list, &d, &c, dbl_list);
442  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
443  AST_DLLIST_REMOVE_HEAD(&test_list, dbl_list);
444  MATCH_OR_FAIL_DBL(&test_list, "BCD", buf);
445  AST_DLLIST_INSERT_BEFORE(&test_list, &b, &a, dbl_list);
446  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
447 
448  ELEM_OR_FAIL(AST_DLLIST_FIRST(&test_list), &a);
449  ELEM_OR_FAIL(AST_DLLIST_LAST(&test_list), &d);
452 
453  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
455  }
457 
458  if (!AST_DLLIST_EMPTY(&test_list)) {
459  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
460  return AST_TEST_FAIL;
461  }
462 
463  /* Append list test */
464 
465  AST_DLLIST_INSERT_HEAD(&test_list, &a, dbl_list);
466  MATCH_OR_FAIL_DBL(&test_list, "A", buf);
467  AST_DLLIST_INSERT_TAIL(&test_list, &b, dbl_list);
468  MATCH_OR_FAIL_DBL(&test_list, "AB", buf);
469  AST_DLLIST_INSERT_HEAD(&other_list, &c, dbl_list);
470  MATCH_OR_FAIL_DBL(&other_list, "C", buf);
471  AST_DLLIST_INSERT_TAIL(&other_list, &d, dbl_list);
472  MATCH_OR_FAIL_DBL(&other_list, "CD", buf);
473  AST_DLLIST_APPEND_DLLIST(&test_list, &other_list, dbl_list);
474  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
475  MATCH_OR_FAIL_DBL(&other_list, "", buf);
476  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
478  }
480  if (!AST_DLLIST_EMPTY(&test_list)) {
481  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
482  return AST_TEST_FAIL;
483  }
484 
485  /*
486  * Safe traversal list modification tests
487  * Traverse starting from first element
488  */
489 
490  AST_DLLIST_INSERT_HEAD(&test_list, &a, dbl_list);
491  MATCH_OR_FAIL_DBL(&test_list, "A", buf);
492  AST_DLLIST_INSERT_TAIL(&test_list, &d, dbl_list);
493  MATCH_OR_FAIL_DBL(&test_list, "AD", buf);
494  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
495  if (bogus == &d) {
497  MATCH_OR_FAIL_DBL(&test_list, "ABD", buf);
499  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
501  MATCH_OR_FAIL_DBL(&test_list, "ABC", buf);
502  }
503  }
505  MATCH_OR_FAIL_DBL(&test_list, "ABC", buf);
506  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
508  }
510  if (!AST_DLLIST_EMPTY(&test_list)) {
511  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
512  return AST_TEST_FAIL;
513  }
514 
515  AST_DLLIST_INSERT_HEAD(&test_list, &b, dbl_list);
516  MATCH_OR_FAIL_DBL(&test_list, "B", buf);
517  AST_DLLIST_INSERT_TAIL(&test_list, &d, dbl_list);
518  MATCH_OR_FAIL_DBL(&test_list, "BD", buf);
519  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
520  if (bogus == &b) {
522  MATCH_OR_FAIL_DBL(&test_list, "ABD", buf);
524  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
526  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
527  }
528  }
530  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
531  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
533  }
535  if (!AST_DLLIST_EMPTY(&test_list)) {
536  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
537  return AST_TEST_FAIL;
538  }
539 
540  AST_DLLIST_INSERT_HEAD(&test_list, &b, dbl_list);
541  MATCH_OR_FAIL_DBL(&test_list, "B", buf);
542  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
543  if (bogus == &b) {
545  MATCH_OR_FAIL_DBL(&test_list, "AB", buf);
547  MATCH_OR_FAIL_DBL(&test_list, "ABD", buf);
549  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
551  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
552  }
553  }
555  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
556  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
558  }
560  if (!AST_DLLIST_EMPTY(&test_list)) {
561  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
562  return AST_TEST_FAIL;
563  }
564 
565  /*
566  * Safe traversal list modification tests
567  * Traverse starting from last element
568  */
569 
570  AST_DLLIST_INSERT_HEAD(&test_list, &a, dbl_list);
571  MATCH_OR_FAIL_DBL(&test_list, "A", buf);
572  AST_DLLIST_INSERT_TAIL(&test_list, &d, dbl_list);
573  MATCH_OR_FAIL_DBL(&test_list, "AD", buf);
575  if (bogus == &d) {
577  MATCH_OR_FAIL_DBL(&test_list, "ABD", buf);
579  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
581  MATCH_OR_FAIL_DBL(&test_list, "ABC", buf);
582  }
583  }
585  MATCH_OR_FAIL_DBL(&test_list, "ABC", buf);
588  }
590  if (!AST_DLLIST_EMPTY(&test_list)) {
591  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
592  return AST_TEST_FAIL;
593  }
594 
595  AST_DLLIST_INSERT_HEAD(&test_list, &b, dbl_list);
596  MATCH_OR_FAIL_DBL(&test_list, "B", buf);
597  AST_DLLIST_INSERT_TAIL(&test_list, &d, dbl_list);
598  MATCH_OR_FAIL_DBL(&test_list, "BD", buf);
600  if (bogus == &b) {
602  MATCH_OR_FAIL_DBL(&test_list, "ABD", buf);
604  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
606  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
607  }
608  }
610  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
611  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
613  }
615  if (!AST_DLLIST_EMPTY(&test_list)) {
616  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
617  return AST_TEST_FAIL;
618  }
619 
620  AST_DLLIST_INSERT_HEAD(&test_list, &b, dbl_list);
621  MATCH_OR_FAIL_DBL(&test_list, "B", buf);
623  if (bogus == &b) {
625  MATCH_OR_FAIL_DBL(&test_list, "AB", buf);
627  MATCH_OR_FAIL_DBL(&test_list, "ABD", buf);
629  MATCH_OR_FAIL_DBL(&test_list, "ABCD", buf);
631  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
632  }
633  }
635  MATCH_OR_FAIL_DBL(&test_list, "ACD", buf);
636  AST_DLLIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, dbl_list) {
638  }
640  if (!AST_DLLIST_EMPTY(&test_list)) {
641  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
642  return AST_TEST_FAIL;
643  }
644 
645  return AST_TEST_PASS;
646 }
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:290
#define ast_free(a)
Definition: astmm.h:182
#define AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: dlinkedlists.h:888
#define AST_DLLIST_INSERT_AFTER_CURRENT(elm, field)
Inserts a list node after the current node during a traversal.
Definition: dlinkedlists.h:723
#define AST_DLLIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: dlinkedlists.h:469
#define AST_DLLIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: dlinkedlists.h:446
#define AST_DLLIST_INSERT_AFTER(head, listelm, elm, field)
Inserts a list entry after a given entry.
#define AST_DLLIST_REMOVE_TAIL(head, field)
Removes and returns the tail node from a list.
#define AST_DLLIST_APPEND_DLLIST(head, list, field)
Appends a whole list to the tail of a list.
#define AST_DLLIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
#define AST_DLLIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_DLLIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: dlinkedlists.h:849
#define AST_DLLIST_PREV(elm, field)
Returns the previous entry in the list before the given entry.
Definition: dlinkedlists.h:457
#define AST_DLLIST_INSERT_BEFORE_CURRENT(elm, field)
Inserts a list node before the current node during a traversal.
Definition: dlinkedlists.h:696
#define AST_DLLIST_INSERT_BEFORE(head, listelm, elm, field)
Inserts a list entry before a given entry.
#define AST_DLLIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
#define AST_DLLIST_REMOVE_VERIFY(head, elm, field)
Removes a specific node from a list if it is in the list.
#define AST_DLLIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: dlinkedlists.h:753
#define AST_DLLIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
#define AST_DLLIST_FIRST(head)
Returns the first entry contained in a list.
Definition: dlinkedlists.h:422
#define AST_DLLIST_LAST(head)
Returns the last entry contained in a list.
Definition: dlinkedlists.h:431
#define AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_END
Closes a safe loop traversal block.
Definition: dlinkedlists.h:921
#define AST_DLLIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: dlinkedlists.h:913
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
def info(msg)
#define NULL
Definition: resample.c:96
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:633
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:597
struct test_val::@490 dbl_list
@ TEST_INIT
Definition: test.h:207
@ TEST_EXECUTE
Definition: test.h:208
#define ast_test_status_update(a, b, c...)
Definition: test.h:129
@ AST_TEST_PASS
Definition: test.h:202
@ AST_TEST_NOT_RUN
Definition: test.h:201
static struct test_val b
static struct test_val a
static struct test_val d
#define MATCH_OR_FAIL_DBL(list, val, retbuf)
static struct test_val c
#define ELEM_OR_FAIL(x, y)
#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:911

References a, ast_alloca, AST_DLLIST_APPEND_DLLIST, AST_DLLIST_EMPTY, AST_DLLIST_FIRST, AST_DLLIST_INSERT_AFTER, AST_DLLIST_INSERT_AFTER_CURRENT, AST_DLLIST_INSERT_BEFORE, AST_DLLIST_INSERT_BEFORE_CURRENT, AST_DLLIST_INSERT_HEAD, AST_DLLIST_INSERT_TAIL, AST_DLLIST_LAST, AST_DLLIST_NEXT, AST_DLLIST_PREV, AST_DLLIST_REMOVE, AST_DLLIST_REMOVE_CURRENT, AST_DLLIST_REMOVE_HEAD, AST_DLLIST_REMOVE_TAIL, AST_DLLIST_REMOVE_VERIFY, AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_BEGIN, AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_END, AST_DLLIST_TRAVERSE_SAFE_BEGIN, AST_DLLIST_TRAVERSE_SAFE_END, ast_free, ast_str_create, AST_TEST_FAIL, AST_TEST_NOT_RUN, AST_TEST_PASS, ast_test_status_update, b, buf, c, d, test_val::dbl_list, ELEM_OR_FAIL, sip_to_pjsip::info(), MATCH_OR_FAIL_DBL, NULL, RAII_VAR, TEST_EXECUTE, and TEST_INIT.

◆ AST_TEST_DEFINE() [2/2]

AST_TEST_DEFINE ( single_ll_tests  )

Definition at line 125 of file test_linkedlists.c.

126 {
127  RAII_VAR(struct ast_str *, buf, NULL, ast_free);
128  struct test_llist test_list = { 0, };
129  struct test_llist other_list = { 0, };
130  struct test_val *bogus;
131 
132  switch (cmd) {
133  case TEST_INIT:
134  info->name = "ll_tests";
135  info->category = "/main/linkedlists/";
136  info->summary = "single linked list unit test";
137  info->description =
138  "Test the single linked list API";
139  return AST_TEST_NOT_RUN;
140  case TEST_EXECUTE:
141  break;
142  }
143 
144  if (!(buf = ast_str_create(16))) {
145  return AST_TEST_FAIL;
146  }
147 
148  if (!(bogus = ast_alloca(sizeof(*bogus)))) {
149  return AST_TEST_FAIL;
150  }
151  memset(bogus, 0, sizeof(*bogus));
152 
153  if (AST_LIST_REMOVE(&test_list, bogus, list)) {
154  ast_test_status_update(test, "AST_LIST_REMOVE should safely return NULL for missing element from empty list\n");
155  return AST_TEST_FAIL;
156  }
157 
158  /* INSERT_HEAD and REMOVE_HEAD tests */
159  AST_LIST_INSERT_HEAD(&test_list, &a, list);
160  MATCH_OR_FAIL(&test_list, "A", buf);
161  AST_LIST_INSERT_HEAD(&test_list, &b, list);
162  MATCH_OR_FAIL(&test_list, "BA", buf);
163  AST_LIST_REMOVE_HEAD(&test_list, list);
164  MATCH_OR_FAIL(&test_list, "A", buf);
165  AST_LIST_REMOVE_HEAD(&test_list, list);
166  MATCH_OR_FAIL(&test_list, "", buf);
167  if (AST_LIST_REMOVE_HEAD(&test_list, list)) {
168  ast_test_status_update(test, "Somehow removed an item from the head of a list that didn't exist\n");
169  return AST_TEST_FAIL;
170  }
171  MATCH_OR_FAIL(&test_list, "", buf);
172 
173  /* Check empty list test */
174 
175  if (!AST_LIST_EMPTY(&test_list)) {
176  ast_test_status_update(test, "List should be empty\n");
177  return AST_TEST_FAIL;
178  }
179 
180  /* Insert tail and remove specific item tests. */
181 
182  AST_LIST_INSERT_TAIL(&test_list, &a, list);
183  MATCH_OR_FAIL(&test_list, "A", buf);
184  AST_LIST_INSERT_TAIL(&test_list, &b, list);
185  MATCH_OR_FAIL(&test_list, "AB", buf);
186  AST_LIST_INSERT_TAIL(&test_list, &c, list);
187  MATCH_OR_FAIL(&test_list, "ABC", buf);
188  AST_LIST_INSERT_TAIL(&test_list, &d, list);
189  MATCH_OR_FAIL(&test_list, "ABCD", buf);
190  if (AST_LIST_REMOVE(&test_list, bogus, list)) {
191  ast_test_status_update(test, "AST_LIST_REMOVE should safely return NULL for missing element\n");
192  return AST_TEST_FAIL;
193  }
194  bogus = NULL;
195  if (AST_LIST_REMOVE(&test_list, bogus, list)) {
196  ast_test_status_update(test, "AST_LIST_REMOVE should safely return NULL for element set to NULL\n");
197  return AST_TEST_FAIL;
198  }
199  AST_LIST_REMOVE(&test_list, &b, list);
200  MATCH_OR_FAIL(&test_list, "ACD", buf);
201  AST_LIST_REMOVE(&test_list, &d, list);
202  MATCH_OR_FAIL(&test_list, "AC", buf);
203  AST_LIST_REMOVE(&test_list, &a, list);
204  MATCH_OR_FAIL(&test_list, "C", buf);
205  AST_LIST_REMOVE(&test_list, &c, list);
206  MATCH_OR_FAIL(&test_list, "", buf);
207  if (!AST_LIST_EMPTY(&test_list)) {
208  ast_test_status_update(test, "List should be empty\n");
209  return AST_TEST_FAIL;
210  }
211  if (AST_LIST_REMOVE(&test_list, bogus, list)) {
212  ast_test_status_update(test, "AST_LIST_REMOVE should safely return NULL asked to remove a NULL pointer from an empty list\n");
213  return AST_TEST_FAIL;
214  }
215 
216  /* Insert item after specific item tests */
217 
218  AST_LIST_INSERT_HEAD(&test_list, &a, list);
219  MATCH_OR_FAIL(&test_list, "A", buf);
220  AST_LIST_INSERT_TAIL(&test_list, &c, list);
221  MATCH_OR_FAIL(&test_list, "AC", buf);
222  AST_LIST_INSERT_AFTER(&test_list, &a, &b, list);
223  MATCH_OR_FAIL(&test_list, "ABC", buf);
224  AST_LIST_INSERT_AFTER(&test_list, &c, &d, list);
225  MATCH_OR_FAIL(&test_list, "ABCD", buf);
226 
227  ELEM_OR_FAIL(AST_LIST_FIRST(&test_list), &a);
228  ELEM_OR_FAIL(AST_LIST_LAST(&test_list), &d);
230 
231  AST_LIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, list) {
233  }
235 
236  if (!AST_LIST_EMPTY(&test_list)) {
237  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
238  return AST_TEST_FAIL;
239  }
240 
241  /* Append list test */
242 
243  AST_LIST_INSERT_HEAD(&test_list, &a, list);
244  MATCH_OR_FAIL(&test_list, "A", buf);
245  AST_LIST_INSERT_TAIL(&test_list, &b, list);
246  MATCH_OR_FAIL(&test_list, "AB", buf);
247  AST_LIST_INSERT_HEAD(&other_list, &c, list);
248  MATCH_OR_FAIL(&other_list, "C", buf);
249  AST_LIST_INSERT_TAIL(&other_list, &d, list);
250  MATCH_OR_FAIL(&other_list, "CD", buf);
251  AST_LIST_APPEND_LIST(&test_list, &other_list, list);
252  MATCH_OR_FAIL(&test_list, "ABCD", buf);
253  MATCH_OR_FAIL(&other_list, "", buf);
254  AST_LIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, list) {
256  }
258  if (!AST_LIST_EMPTY(&test_list)) {
259  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
260  return AST_TEST_FAIL;
261  }
262 
263  /* Insert list after specific item in middle test */
264 
265  AST_LIST_INSERT_HEAD(&test_list, &a, list);
266  MATCH_OR_FAIL(&test_list, "A", buf);
267  AST_LIST_INSERT_TAIL(&test_list, &d, list);
268  MATCH_OR_FAIL(&test_list, "AD", buf);
269  AST_LIST_INSERT_HEAD(&other_list, &b, list);
270  MATCH_OR_FAIL(&other_list, "B", buf);
271  AST_LIST_INSERT_TAIL(&other_list, &c, list);
272  MATCH_OR_FAIL(&other_list, "BC", buf);
273  AST_LIST_INSERT_LIST_AFTER(&test_list, &other_list, &a, list);
274  MATCH_OR_FAIL(&test_list, "ABCD", buf);
275  MATCH_OR_FAIL(&other_list, "", buf);
276  AST_LIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, list) {
278  }
280  if (!AST_LIST_EMPTY(&test_list)) {
281  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
282  return AST_TEST_FAIL;
283  }
284 
285  /* Insert list after specific item on end test */
286 
287  AST_LIST_INSERT_HEAD(&test_list, &a, list);
288  MATCH_OR_FAIL(&test_list, "A", buf);
289  AST_LIST_INSERT_TAIL(&test_list, &b, list);
290  MATCH_OR_FAIL(&test_list, "AB", buf);
291  AST_LIST_INSERT_HEAD(&other_list, &c, list);
292  MATCH_OR_FAIL(&other_list, "C", buf);
293  AST_LIST_INSERT_TAIL(&other_list, &d, list);
294  MATCH_OR_FAIL(&other_list, "CD", buf);
295  AST_LIST_INSERT_LIST_AFTER(&test_list, &other_list, &b, list);
296  MATCH_OR_FAIL(&test_list, "ABCD", buf);
297  MATCH_OR_FAIL(&other_list, "", buf);
298  AST_LIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, list) {
300  }
302  if (!AST_LIST_EMPTY(&test_list)) {
303  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
304  return AST_TEST_FAIL;
305  }
306 
307  /* Safe traversal list modification tests */
308 
309  AST_LIST_INSERT_HEAD(&test_list, &a, list);
310  MATCH_OR_FAIL(&test_list, "A", buf);
311  AST_LIST_INSERT_TAIL(&test_list, &d, list);
312  MATCH_OR_FAIL(&test_list, "AD", buf);
313  AST_LIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, list) {
314  if (bogus == &d) {
316  MATCH_OR_FAIL(&test_list, "ABD", buf);
318  MATCH_OR_FAIL(&test_list, "ABCD", buf);
320  MATCH_OR_FAIL(&test_list, "ABC", buf);
321  }
322  }
324  MATCH_OR_FAIL(&test_list, "ABC", buf);
325  AST_LIST_TRAVERSE_SAFE_BEGIN(&test_list, bogus, list) {
327  }
329  if (!AST_LIST_EMPTY(&test_list)) {
330  ast_test_status_update(test, "List should be empty after traversing and removal. It wasn't.\n");
331  return AST_TEST_FAIL;
332  }
333 
334  return AST_TEST_PASS;
335 }
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
Definition: linkedlists.h:429
#define AST_LIST_INSERT_LIST_AFTER(head, list, elm, field)
Inserts a whole list after a specific entry in a list.
Definition: linkedlists.h:812
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:450
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:615
#define AST_LIST_INSERT_BEFORE_CURRENT(elm, field)
Inserts a list entry before the current entry during a traversal.
Definition: linkedlists.h:599
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:711
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
Definition: linkedlists.h:856
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:529
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:557
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:833
#define AST_LIST_INSERT_AFTER(head, listelm, elm, field)
Inserts a list entry after a given entry.
Definition: linkedlists.h:695
#define AST_LIST_APPEND_LIST(head, list, field)
Appends a whole list to the tail of a list.
Definition: linkedlists.h:783
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:421
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:439
struct test_val::@489 list
#define MATCH_OR_FAIL(list, val, retbuf)

References a, ast_alloca, ast_free, AST_LIST_APPEND_LIST, AST_LIST_EMPTY, AST_LIST_FIRST, AST_LIST_INSERT_AFTER, AST_LIST_INSERT_BEFORE_CURRENT, AST_LIST_INSERT_HEAD, AST_LIST_INSERT_LIST_AFTER, AST_LIST_INSERT_TAIL, AST_LIST_LAST, AST_LIST_NEXT, AST_LIST_REMOVE, AST_LIST_REMOVE_CURRENT, AST_LIST_REMOVE_HEAD, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_str_create, AST_TEST_FAIL, AST_TEST_NOT_RUN, AST_TEST_PASS, ast_test_status_update, b, buf, c, d, ELEM_OR_FAIL, sip_to_pjsip::info(), test_val::list, MATCH_OR_FAIL, NULL, RAII_VAR, TEST_EXECUTE, and TEST_INIT.

◆ dbl_list_expect_forward()

static int dbl_list_expect_forward ( struct test_dbl_llist test_list,
const char *  expect,
struct ast_str **  buf 
)
static

Definition at line 66 of file test_linkedlists.c.

67 {
68  struct test_val *i;
69 
71  AST_DLLIST_TRAVERSE(test_list, i, dbl_list) {
72  ast_str_append(buf, 0, "%s", i->name);
73  }
74 
75  return strcmp(expect, ast_str_buffer(*buf));
76 }
#define AST_DLLIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: dlinkedlists.h:576
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1104
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
Definition: strings.h:666
const char * name

References AST_DLLIST_TRAVERSE, ast_str_append(), ast_str_buffer(), ast_str_reset(), buf, test_val::dbl_list, and test_val::name.

◆ dbl_list_expect_reverse()

static int dbl_list_expect_reverse ( struct test_dbl_llist test_list,
const char *  expect,
struct ast_str **  buf 
)
static

Definition at line 78 of file test_linkedlists.c.

79 {
80  struct test_val *i;
81  char *str;
82  int len = strlen(expect);
83  int idx;
84 
87  ast_str_append(buf, 0, "%s", i->name);
88  }
89 
90  /* Check reverse string. */
92  if (len != strlen(str)) {
93  return 1;
94  }
95  for (idx = 0; idx < len; ++idx) {
96  if (expect[idx] != str[len - idx - 1]) {
97  return 1;
98  }
99  }
100  return 0;
101 }
const char * str
Definition: app_jack.c:147
#define AST_DLLIST_TRAVERSE_BACKWARDS(head, var, field)
Loops over (traverses) the entries in a list in reverse order, starting at the end.
Definition: dlinkedlists.h:618
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)

References AST_DLLIST_TRAVERSE_BACKWARDS, ast_str_append(), ast_str_buffer(), ast_str_reset(), buf, test_val::dbl_list, len(), test_val::name, and str.

◆ list_expect()

static int list_expect ( struct test_llist test_list,
const char *  expect,
struct ast_str **  buf 
)
static

Definition at line 54 of file test_linkedlists.c.

55 {
56  struct test_val *i;
57 
59  AST_LIST_TRAVERSE(test_list, i, list) {
60  ast_str_append(buf, 0, "%s", i->name);
61  }
62 
63  return strcmp(expect, ast_str_buffer(*buf));
64 }
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:491

References AST_LIST_TRAVERSE, ast_str_append(), ast_str_buffer(), ast_str_reset(), buf, test_val::list, and test_val::name.

◆ load_module()

static int load_module ( void  )
static

Definition at line 655 of file test_linkedlists.c.

656 {
657  AST_TEST_REGISTER(single_ll_tests);
658  AST_TEST_REGISTER(double_ll_tests);
660 }
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
#define AST_TEST_REGISTER(cb)
Definition: test.h:127

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 648 of file test_linkedlists.c.

649 {
650  AST_TEST_UNREGISTER(single_ll_tests);
651  AST_TEST_UNREGISTER(double_ll_tests);
652  return 0;
653 }
#define AST_TEST_UNREGISTER(cb)
Definition: test.h:128

References AST_TEST_UNREGISTER.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Test Linked Lists" , .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 655 of file test_linkedlists.c.

◆ a

struct test_val a = { "A" }
static
Examples
app_skel.c.

Definition at line 1 of file test_linkedlists.c.

Referenced by __ast_cli_generator(), __ast_cli_register(), __ast_format_def_register(), __ast_register_translator(), __bt_defcmp(), __bt_defpfx(), __bt_split(), __say_cli_init(), a2lsf(), add_sdp(), aeap_cli_show(), aeap_server_show(), age_cmp(), agent_handle_logoff_cmd(), agent_handle_show_all(), agent_handle_show_online(), agent_handle_show_specific(), agent_show_requested(), alias_show(), anaFilter(), analog_swap_subs(), aoc_cli_debug_enable(), ari_mkpasswd(), ari_set_debug(), ari_show(), ari_show_app(), ari_show_apps(), ari_show_user(), ari_show_users(), ast_cel_str_to_event_type(), ast_channel_internal_oldest_linkedid(), ast_channel_internal_swap_endpoint_forward(), ast_channel_internal_swap_snapshots(), ast_channel_internal_swap_topics(), ast_channel_internal_swap_uniqueid_and_linkedid(), ast_cli_command_full(), ast_extension_cmp(), ast_hashtab_compare_ints(), ast_hashtab_compare_shorts(), ast_hashtab_compare_strings(), ast_hashtab_compare_strings_nocase(), ast_namedgroups_intersect(), ast_prod(), ast_pthread_create_stack(), ast_sip_cli_traverse_objects(), ast_sockaddr_cmp(), ast_sockaddr_cmp_addr(), AST_TEST_DEFINE(), ast_xml_doc_item_cmp_fn(), bridge_show_specific_print_channel(), build_expression_queue(), check_switch_expr(), chk_div(), chk_minus(), chk_plus(), chk_times(), cli_alias_passthrough(), cli_complete_show(), cli_complete_subscription_callid(), cli_console_answer(), cli_console_autoanswer(), cli_console_dial(), cli_console_flash(), cli_console_hangup(), cli_console_mute(), cli_console_sendtext(), cli_dump_endpt(), cli_fax_set_debug(), cli_fax_show_capabilities(), cli_fax_show_session(), cli_fax_show_sessions(), cli_fax_show_settings(), cli_fax_show_stats(), cli_fax_show_version(), cli_list_available(), cli_list_devices(), cli_mute_unmute_helper(), cli_notify(), cli_odbc_read(), cli_qualify(), cli_realtime_load(), cli_realtime_store(), cli_realtime_update(), cli_realtime_update2(), cli_register(), cli_reload_qualify_aor(), cli_reload_qualify_endpoint(), cli_show_channel(), cli_show_channels(), cli_show_endpoint_identifiers(), cli_show_module_options(), cli_show_module_type(), cli_show_module_types(), cli_show_modules(), cli_show_qualify_aor(), cli_show_qualify_endpoint(), cli_show_subscription_inout(), cli_show_subscriptions_inout(), cli_subsystem_alert_report(), cli_tps_ping(), cli_tps_report(), cli_tps_reset_stats(), cli_tps_reset_stats_all(), cli_unregister(), compare_categories(), compare_char(), complete_ari_app(), complete_ari_show_user(), complete_ari_user(), complete_channeltypes(), complete_country(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_context(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_indications(), complete_ulimit(), config_parse_variables(), console_answer(), console_autoanswer(), console_dial(), console_hangup(), console_sendtext(), contact_transport_monitor_matcher(), convshort(), corosync_ping(), corosync_show_members(), dahdi_create_channels(), dahdi_destroy_channels(), dahdi_restart_cmd(), dahdi_set_hwgain(), dahdi_set_swgain(), dahdi_show_channel(), dahdi_show_channels(), dahdi_show_status(), dahdi_show_version(), delete_devices(), dialog_dump_func(), display_entry_list(), display_results(), display_single_entry(), dll_tests(), do_alignment_detection(), do_cli_dump_endpt(), do_say(), dummy_start(), dundi_do_lookup(), dundi_do_precache(), dundi_do_query(), dundi_flush(), dundi_set_debug(), dundi_show_cache(), dundi_show_entityid(), dundi_show_mappings(), dundi_show_peer(), dundi_show_peers(), dundi_show_precache(), dundi_show_requests(), dundi_show_trans(), dundi_store_history(), ext_cmp(), fax_session_tab_complete(), filter_history(), fsk_serial(), function_realtime_store(), gen_events(), get_also_info(), get_button_template(), get_domain(), group_show_channels(), GSM_ADD(), GSM_SUB(), handle_abort_shutdown(), handle_bridge_kick_channel(), handle_bridge_show_all(), handle_bridge_show_specific(), handle_bridge_technology_show(), handle_cc_status(), handle_cdr_pgsql_status(), handle_chanlist(), handle_cli_ael_set_debug(), handle_cli_agi_add_cmd(), handle_cli_agi_debug(), handle_cli_agi_dump_html(), handle_cli_agi_show(), handle_cli_check_permissions(), handle_cli_confbridge_kick(), handle_cli_confbridge_list(), handle_cli_confbridge_list_item(), handle_cli_confbridge_lock(), handle_cli_confbridge_mute(), handle_cli_confbridge_show_bridge_profile(), handle_cli_confbridge_show_bridge_profiles(), handle_cli_confbridge_show_menus(), handle_cli_confbridge_show_user_profile(), handle_cli_confbridge_show_user_profiles(), handle_cli_confbridge_start_record(), handle_cli_confbridge_unlock(), handle_cli_confbridge_unmute(), handle_cli_config_reload(), handle_cli_core_show_channeltypes(), handle_cli_core_show_config_mappings(), handle_cli_core_show_file_formats(), handle_cli_database_del(), handle_cli_database_deltree(), handle_cli_database_get(), handle_cli_database_put(), handle_cli_database_show(), handle_cli_database_showkey(), handle_cli_debug(), handle_cli_devstate_list(), handle_cli_dialplan_add_extension(), handle_cli_dialplan_add_ignorepat(), handle_cli_dialplan_add_include(), handle_cli_dialplan_remove_context(), handle_cli_dialplan_remove_extension(), handle_cli_dialplan_remove_ignorepat(), handle_cli_dialplan_remove_include(), handle_cli_dialplan_save(), handle_cli_dynamic_level_test(), handle_cli_iax2_provision(), handle_cli_iax2_prune_realtime(), handle_cli_iax2_set_debug(), handle_cli_iax2_set_debug_jb(), handle_cli_iax2_set_debug_trunk(), handle_cli_iax2_set_mtu(), handle_cli_iax2_show_cache(), handle_cli_iax2_show_callno_limits(), handle_cli_iax2_show_channels(), handle_cli_iax2_show_firmware(), handle_cli_iax2_show_netstats(), handle_cli_iax2_show_peer(), handle_cli_iax2_show_peers(), handle_cli_iax2_show_registry(), handle_cli_iax2_show_stats(), handle_cli_iax2_show_threads(), handle_cli_iax2_show_users(), handle_cli_iax2_test_losspct(), handle_cli_iax2_unregister(), handle_cli_indication_add(), handle_cli_indication_remove(), handle_cli_indication_show(), handle_cli_keys_show(), handle_cli_malloc_trim(), handle_cli_mixmonitor(), handle_cli_mobile_cusd(), handle_cli_mobile_rfcomm(), handle_cli_mobile_search(), handle_cli_mobile_show_devices(), handle_cli_moh_reload(), handle_cli_moh_show_files(), handle_cli_moh_unregister_class(), handle_cli_ooh323_reload(), handle_cli_ooh323_set_debug(), handle_cli_ooh323_show_gk(), handle_cli_ooh323_show_peer(), handle_cli_ooh323_show_peers(), handle_cli_ooh323_show_user(), handle_cli_ooh323_show_users(), handle_cli_osp_show(), handle_cli_performance_test(), handle_cli_presencestate_list(), handle_cli_realtime_mysql_cache(), handle_cli_realtime_pgsql_cache(), handle_cli_recalc(), handle_cli_refresh(), handle_cli_reload(), handle_cli_rtcp_set_debug(), handle_cli_rtp_set_debug(), handle_cli_rtp_settings(), handle_cli_show(), handle_cli_show_permissions(), handle_cli_sounds_show(), handle_cli_status(), handle_cli_transcoder_show(), handle_cli_udptl_set_debug(), handle_cli_wait_fullybooted(), handle_commandmatchesarray(), handle_core_reload(), handle_core_set_debug_channel(), handle_dahdi_show_cadences(), handle_debug(), handle_debug_category(), handle_debug_or_trace(), handle_help(), handle_load(), handle_logger_add_channel(), handle_logger_mute(), handle_logger_reload(), handle_logger_rotate(), handle_logger_set_level(), handle_logger_show_channels(), handle_logger_show_levels(), handle_manager_reload(), handle_manager_show_events(), handle_manager_show_settings(), handle_mandebug(), handle_mgcp_show_endpoints(), handle_minivm_list_templates(), handle_minivm_reload(), handle_minivm_show_settings(), handle_minivm_show_stats(), handle_minivm_show_users(), handle_minivm_show_zones(), handle_modlist(), handle_nodebugchan_deprecated(), handle_orig(), handle_pjproject_set_log_level(), handle_pjproject_show_buildopts(), handle_pjproject_show_log_level(), handle_pjproject_show_log_mappings(), handle_pjsip_show_version(), handle_queue_add_member(), handle_redirect(), handle_reload(), handle_remb_set(), handle_restart_gracefully(), handle_restart_now(), handle_restart_when_convenient(), handle_set_chanvar(), handle_set_global(), handle_show_application(), handle_show_applications(), handle_show_calendar(), handle_show_calendars(), handle_show_calendars_types(), handle_show_chanvar(), handle_show_dialplan(), handle_show_function(), handle_show_functions(), handle_show_globals(), handle_show_hangup_channel(), handle_show_hint(), handle_show_hints(), handle_show_http(), handle_show_profile(), handle_show_routes(), handle_show_settings(), handle_show_switches(), handle_show_sysinfo(), handle_show_threads(), handle_show_translation_path(), handle_show_translation_table(), handle_showcalls(), handle_showchan(), handle_showmanager(), handle_showmanagers(), handle_showmancmd(), handle_showmancmds(), handle_showmanconn(), handle_showmaneventq(), handle_showuptime(), handle_skel_show_config(), handle_skel_show_games(), handle_skel_show_levels(), handle_skinny_message_set(), handle_skinny_reload(), handle_skinny_reset(), handle_skinny_show_device(), handle_skinny_show_devices(), handle_skinny_show_line(), handle_skinny_show_lines(), handle_skinny_show_settings(), handle_softhangup(), handle_stop_gracefully(), handle_stop_now(), handle_stop_when_convenient(), handle_trace(), handle_unload(), handle_verbose(), handle_version(), handle_voicemail_show_aliases(), handle_voicemail_show_users(), handle_voicemail_show_zones(), has_state_changed(), hashtab_compare_strings(), inner_product_single(), interpolate_product_single(), interval_hook_time_cmp(), levdurb(), load_pktccops_config(), lsf2a(), LSFinterpolate2a_dec(), LSFinterpolate2a_enc(), lua_extension_cmp(), main(), manager_iax2_show_peers(), manager_sip_qualify_peer(), manager_sip_show_peer(), manager_sip_show_peers(), manager_skinny_show_device(), manager_skinny_show_devices(), manager_skinny_show_line(), manager_skinny_show_lines(), MD5Transform(), media_cache_handle_delete_item(), media_cache_handle_refresh_item(), media_cache_handle_show_all(), media_cache_handle_show_item(), media_cache_prnt_summary(), meetme_cmd_helper(), meetme_kick_cmd(), meetme_lock_cmd(), meetme_mute_cmd(), meetme_show_cmd(), mgcp_reload(), module_vector_cmp(), module_vector_strcasecmp(), moh_filename_strcasecmp(), monitor_matcher(), my_swap_subchannels(), op_and(), op_colon(), op_compl(), op_cond(), op_div(), op_eq(), op_eqtilde(), op_ge(), op_gt(), op_le(), op_lt(), op_minus(), op_ne(), op_negate(), op_or(), op_plus(), op_rem(), op_times(), P1(), P2(), peer_dump_func(), peercomparefunc(), pjsip_set_history(), pjsip_show_history(), pktccops_gatedel(), pktccops_show_cmtses(), pktccops_show_gates(), pktccops_show_pools(), print_applicationmap(), print_event_instance(), print_featuregroup(), print_featuregroups(), process_crypto(), process_sdp(), process_sdp_a_audio(), process_sdp_a_dtls(), process_sdp_a_ice(), process_sdp_a_image(), process_sdp_a_rtcp_mux(), process_sdp_a_sendonly(), process_sdp_a_text(), process_sdp_a_video(), prometheus_show_metrics(), ptr_matcher(), queue_show(), r_sign(), realtime_exec(), rescomp(), rtcp_do_debug_ip(), rtp_do_debug_ip(), rtp_transport_wide_cc_packet_statistics_cmp(), s_streamwait3(), say_date_generic(), say_enumeration_full(), say_full(), say_number_full(), sched_time_cmp(), search_directory_sub(), send_dtmf(), show_codecs(), show_sound_info_cb(), show_sounds_cb(), show_users_cb(), show_warranty(), sip_cli_notify(), sip_do_debug(), sip_prune_realtime(), sip_qualify_peer(), sip_reload(), sip_set_history(), sip_show_channel(), sip_show_channels(), sip_show_channelstats(), sip_show_domains(), sip_show_history(), sip_show_inuse(), sip_show_mwi(), sip_show_objects(), sip_show_peer(), sip_show_peers(), sip_show_registry(), sip_show_sched(), sip_show_settings(), sip_show_tcp(), sip_show_user(), sip_show_users(), sip_unregister(), skinny_reload(), sla_show_trunks(), sorcery_memory_cache_dump(), sorcery_memory_cache_expire(), sorcery_memory_cache_show(), sorcery_memory_cache_stale(), stasis_app_to_cli(), stasis_show_topics(), status_debug_verbose(), stir_shaken_certificate_show(), stir_shaken_cli_show(), str_appender(), subsystem_cmp(), swap_subs(), syntFilter(), tps_taskprocessor_tab_complete(), unistim_do_debug(), unistim_show_devices(), unistim_show_info(), unistim_sp(), wakeup_sub(), xmpp_cli_create_collection(), xmpp_cli_create_leafnode(), xmpp_cli_delete_pubsub_node(), xmpp_cli_list_pubsub_nodes(), xmpp_cli_purge_pubsub_nodes(), xmpp_do_set_debug(), and xmpp_show_clients().

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 662 of file test_linkedlists.c.

◆ b

struct test_val b = { "B" }
static

Definition at line 1 of file test_linkedlists.c.

Referenced by __ast_format_def_register(), __ast_register_translator(), __bt_defcmp(), __bt_defpfx(), __bt_open(), __bt_split(), _ast_hashtab_dup(), _ast_hashtab_insert_immediate_bucket(), _ast_hashtab_resize(), ael_yy_create_buffer(), ael_yy_delete_buffer(), ael_yy_flush_buffer(), ael_yy_init_buffer(), ael_yy_scan_buffer(), ael_yy_scan_bytes(), age_cmp(), analog_swap_subs(), ast_channel_internal_oldest_linkedid(), ast_channel_internal_swap_endpoint_forward(), ast_channel_internal_swap_snapshots(), ast_channel_internal_swap_topics(), ast_channel_internal_swap_uniqueid_and_linkedid(), ast_extension_cmp(), ast_hashtab_compare_ints(), ast_hashtab_compare_shorts(), ast_hashtab_compare_strings(), ast_hashtab_compare_strings_nocase(), ast_hashtab_lookup_internal(), ast_hashtab_remove_object_internal(), ast_hashtab_remove_object_via_lookup_nolock(), ast_hashtab_remove_this_object_nolock(), ast_namedgroups_intersect(), ast_sockaddr_cmp(), ast_sockaddr_cmp_addr(), AST_TEST_DEFINE(), ast_xml_doc_item_cmp_fn(), ast_yy_create_buffer(), ast_yy_delete_buffer(), ast_yy_flush_buffer(), ast_yy_init_buffer(), ast_yy_scan_buffer(), ast_yy_scan_bytes(), callerid_feed(), callerid_feed_jp(), chk_div(), chk_minus(), chk_plus(), chk_times(), compare_categories(), compare_char(), contact_transport_monitor_matcher(), convshort(), dll_tests(), ext_cmp(), fbuf_append(), ffmpeg_decode(), ffmpeg_encode(), GSM_ADD(), GSM_SUB(), h261_encap(), h263_encap(), h263p_decap(), h263p_encap(), h264_encap(), has_state_changed(), hashtab_compare_strings(), inner_product_single(), interpolate_product_single(), interval_hook_time_cmp(), load_pktccops_config(), lsf2a(), lua_extension_cmp(), MD5Transform(), module_vector_cmp(), module_vector_strcasecmp(), moh_filename_strcasecmp(), monitor_matcher(), mpeg4_decap(), mpeg4_encap(), my_swap_subchannels(), op_and(), op_colon(), op_cond(), op_div(), op_eq(), op_eqtilde(), op_ge(), op_gt(), op_le(), op_lt(), op_minus(), op_ne(), op_or(), op_plus(), op_rem(), op_times(), P2(), packsms7(), peercomparefunc(), powiedz(), ptr_matcher(), r_sign(), rescomp(), rtp_transport_wide_cc_packet_statistics_cmp(), sched_time_cmp(), subsystem_cmp(), swap_subs(), tdd_feed(), unpacksms7(), and yy_get_next_buffer().

◆ c

struct test_val c = { "C" }
static

Definition at line 1 of file test_linkedlists.c.

Referenced by __analog_handle_event(), __ao2_callback(), __ao2_callback_data(), __ao2_find(), __ao2_unlink(), __ao2_weakproxy_find(), __ast_pbx_run(), __bt_curdel(), __bt_delete(), __bt_seqadv(), __bt_stkacq(), __has_voicemail(), _ast_hashtab_insert_immediate_bucket(), _ast_hashtab_resize(), _macro_exec(), action_getvar(), action_hangup(), action_sendtext(), action_setvar(), action_timeout(), add_email_attachment(), add_sdp(), alsa_answer(), alsa_hangup(), analog_call(), analog_my_getsigstr(), analog_new_ast_channel(), ao2_container_count(), append_history_va(), ast_app_getdata_full(), ast_canmatch_extension(), ast_compile_ael2(), ast_context_add_include2(), ast_context_ignorepats_count(), ast_context_includes_count(), ast_context_lockmacro(), ast_context_remove_extension_callerid(), ast_context_remove_include(), ast_context_remove_switch(), ast_context_switches_count(), ast_context_unlockmacro(), ast_devstate_to_extenstate(), ast_el_read_char(), ast_escape(), ast_escape_c(), ast_exists_extension(), ast_extension_state(), ast_extension_state_extended(), ast_findlabel_extension(), ast_findlabel_extension2(), ast_get_group(), ast_get_hint(), ast_get_namedgroups(), ast_hashtab_hash_string_sax(), ast_hint_extension_nolock(), ast_hint_presence_state(), ast_matchmore_extension(), ast_parse_digest(), ast_pbx_run(), ast_readstring(), ast_readstring_full(), ast_recvchar(), ast_settimeout(), ast_settimeout_full(), ast_smdi_interface_find(), ast_spawn_extension(), ast_str_get_hint(), ast_str_retrieve_variable(), ast_str_substitute_variables_full(), AST_TEST_DEFINE(), ast_unescape_c(), ast_waitfor(), ast_waitfor_n(), ast_waitfor_nandfds(), ast_waitfordigit(), ast_waitfordigit_full(), ast_waitstream(), ast_waitstream_exten(), ast_waitstream_fr(), ast_waitstream_fr_w_cb(), ast_waitstream_full(), ast_writefile(), ast_xmldoc_printable(), b64_ochar(), base_encode(), bt_psplit(), build_bits(), build_channels(), c_prevword(), change_monitor_action(), check_auth(), check_day(), check_dow(), check_month(), check_peer_ok(), check_switch_expr(), chunked_atoh(), cli_complete_notify(), common_exec(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_context(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_mohclass_realtime(), complete_show_dialplan_context(), complete_sip_notify(), complete_sipch(), compress_char(), conf_add(), conf_del(), conf_run(), console_answer(), console_call(), console_hangup(), console_print(), container_destruct(), context_included(), conv65(), conv66(), create_addr(), dahdi_call(), dahdi_handle_event(), dahdi_read(), dahdi_sendtext(), destroy_cts(), dll_tests(), do_forward(), do_pause_or_unpause(), dtmf_info_incoming_request(), ebl_callback(), enum_callback(), ext_cmp1(), ext_cmp_pattern_pos(), extract_bits(), extract_uri(), fileexists_test(), find_cache(), find_context_locked(), find_matching_endwhile(), find_matching_priority(), find_ringing_channel(), find_subchannel_and_lock(), generate_filenames_string(), generic_fax_exec(), get_also_info(), get_comma(), get_csv(), get_device_state_causing_channels(), get_event(), getnum(), getqzname(), getzname(), handle_call_outgoing(), handle_callforward_button(), handle_cli_dialplan_remove_extension(), handle_cli_dialplan_save(), handle_core_set_debug_channel(), handle_enbloc_call_message(), handle_hangup(), handle_hd_hf(), handle_invite_replaces(), handle_offhook_message(), handle_request_bye(), handle_request_info(), handle_request_invite(), handle_request_notify(), handle_response(), handle_soft_key_event_message(), handle_softhangup(), handle_stimulus_message(), handle_transfer_button(), handle_uri(), headers_to_vars(), htonll(), httpd_process_request(), iax2_answer(), iax2_call(), iax2_digit_begin(), iax2_digit_end(), iax2_hangup(), iax2_indicate(), iax2_predestroy(), iax2_queryoption(), iax2_request(), iax2_sendhtml(), iax2_sendimage(), iax2_sendtext(), iax2_setoption(), iax2_transfer(), iax2_write(), iax_prov_complete_template(), include_alloc(), increase_call_count(), input(), internal_extension_state_extended(), isourconf(), ivr_dispatch(), load_dlopen(), load_dlopen_missing(), load_pktccops_config(), lookup_c_ip(), lookup_ci(), lua_find_extension(), main(), manager_mixmonitor(), manager_mute_mixmonitor(), manager_mutestream(), manager_stop_mixmonitor(), MD5Transform(), moh_rescan_files(), my_getsigstr(), ntohll(), ochar(), onAlerting(), onCallEstablished(), onProgress(), ooh323_onReceivedSetup(), ooh323c_call_thread(), ooh323c_start_call_thread(), op_cond(), P3(), parse(), parse_line(), parse_ok_contact(), parse_request(), parse_uri_full(), parse_via(), parseintarg(), pbcwhere(), pbx_extension_helper(), pbx_load_users(), pbx_retrieve_variable(), pbx_substitute_variables_helper(), pbx_substitute_variables_helper_full(), populate_addr(), process_dahdi(), process_sdp(), process_sdp_c(), process_text_line(), read_some(), rebuild_channels(), reply_digest(), reqprep(), request_channel(), rfcomm_append_buf(), rfcomm_read(), rfcomm_read_and_append_char(), rfcomm_read_and_expect_char(), rfcomm_read_command(), rfcomm_read_result(), rfcomm_read_until_crlf(), rfcomm_read_until_ok(), rotate_file(), safe_mkdir(), save_conference(), send_waveform_to_fd(), sendfax_exec(), serialize_showchan(), set_ext_pri(), set_message_vars_from_req(), setsubstate(), setup_dahdi_int(), show_chanstats_cb(), show_debug_helper(), show_dialplan_helper(), sip_report_security_event(), skinny_dialer(), skinny_newcall(), smdi_read(), sms_messagetx(), socket_process_helper(), socket_receive_file_to_buff(), softhangup_exec(), speex_get_wb_sz_at(), speex_samples(), split_ec(), srv_callback(), start_monitor_action(), stop_monitor_action(), store_tone_zone_ring_cadence(), strbetween(), t30_phase_e_handler(), table_config_for_table_name(), table_configs_free(), tdd_feed(), tdd_generate(), test_2way_function(), transmit_fake_auth_response(), transmit_refer(), transmit_state_notify(), try_hangup(), try_load_key(), try_redirect(), txt_callback(), unistim_sp(), update_connectedline(), verify_key(), wait_for_answer(), waitstream_control(), waitstream_core(), while(), write_entry_history(), write_history(), xmldoc_setpostbr(), xmpp_client_receive(), and yyunput().

◆ d

struct test_val d = { "D" }
static

Definition at line 1 of file test_linkedlists.c.

Referenced by __ast_play_and_record(), _skinny_message_clear(), _skinny_message_set(), _skinny_show_device(), _skinny_show_devices(), _skinny_show_line(), _transmit_displayprinotify(), _transmit_displayprinotifyvar(), add_sip_domain(), ast_mwi_state_callback_all(), ast_mwi_state_callback_subscribed(), ast_parse_digest(), ast_play_and_wait(), ast_playtones_start(), ast_readstring_full(), AST_TEST_DEFINE(), ast_tonepair_start(), auth_http_callback(), block4(), build_device(), calc_rxstamp(), change_favorite_icon(), check_sip_domain(), clear_sip_domains(), complete_skinny_devices(), complete_skinny_show_line(), config_device(), config_parse_variables(), console_dial(), conv65(), conv66(), datastore_destroy_cb(), delete_device(), delete_devices(), destroy_session_details(), dialandactivatesub(), dll_tests(), dumpsub(), find_line_by_instance(), find_line_by_name(), find_line_by_number(), find_speeddial_by_instance(), find_subchannel_by_instance_reference(), find_subchannel_by_name(), find_subchannel_by_reference(), find_subline_by_callid(), find_subline_by_name(), finish_bookmark(), g726_encode(), get_button_template(), get_folder(), get_folder_ja(), get_unaligned_uint16(), get_unaligned_uint32(), get_unaligned_uint64(), h261_encap(), h263_encap(), h263p_encap(), h264_encap(), handle_button_template_req_message(), handle_call_outgoing(), handle_callforward_button(), handle_capabilities_res_message(), handle_enbloc_call_message(), handle_keypad_button_message(), handle_message(), handle_mwi_state(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_skinny_reset(), handle_soft_key_event_message(), handle_stimulus_message(), handle_transfer_button(), hash_test_count(), hash_test_grow(), hash_test_lookup(), hash_test_shrink(), initreqprep(), is_key_favorite(), is_key_line(), key_select_extension(), lintog726aal2_framein(), load_pktccops_config(), main(), MD5Transform(), mpeg4_encap(), mwi_event_cb(), numcpy(), P4(), P7(), parse_bookmark(), parse_naptr(), printdigest(), push_callinfo(), put_unaligned_uint16(), put_unaligned_uint32(), put_unaligned_uint64(), quantize(), rcv_mac_addr(), readdirqueue(), reload_config(), rxqcheck(), say_and_wait(), send_callinfo(), send_displayprinotify(), send_displaypromptstatus(), setsubstate(), sip_show_domains(), sip_show_settings(), skinny_call(), skinny_device_alloc(), skinny_device_destroy(), skinny_dialer(), skinny_extensionstate_cb(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_reload(), skinny_senddigit_end(), skinny_session_cleanup(), sms_exec(), sms_nextoutgoing(), sms_readfile(), soft_key_visible(), start_monitor_action(), start_rtp(), tdd_decode_baudot(), transfer_call_step1(), transfer_cancel_step2(), transmit_activatecallplane(), transmit_backspace(), transmit_callinfo(), transmit_callinfo_variable(), transmit_callstate(), transmit_capabilitiesreq(), transmit_cfwdstate(), transmit_clear_display_message(), transmit_clearprinotify(), transmit_clearpromptmessage(), transmit_closereceivechannel(), transmit_connect(), transmit_definetimedate(), transmit_dialednumber(), transmit_displaynotify(), transmit_displaypromptstatus(), transmit_displaypromptstatusvar(), transmit_keepaliveack(), transmit_lamp_indication(), transmit_linestatres(), transmit_microphone_mode(), transmit_registerack(), transmit_reset(), transmit_response(), transmit_ringer_mode(), transmit_selectsoftkeys(), transmit_serverres(), transmit_serviceurlstat(), transmit_softkeysetres(), transmit_softkeytemplateres(), transmit_speaker_mode(), transmit_speeddialstatres(), transmit_start_tone(), transmit_startmediatransmission(), transmit_stop_tone(), transmit_stopmediatransmission(), transmit_versionres(), transtime(), txqcheck(), unistim_alloc_sub(), unistim_answer(), unistim_hangup(), unistim_register(), unistim_request(), unistim_unalloc_sub(), unload_module(), and update_connectedline().