51    const char *instance_name)
 
   55    storage_instance = storage_driver->
open_instance(instance_name);
 
   56    if (!storage_instance) {
 
   62    return storage_instance;
 
 
   73    const char *
context = (
const char *)arg;
 
 
   90    char *l_exten = (
char *) 
exten;
 
   91    char *l_context = (
char *) 
context;
 
 
   99    const char *
name = arg;
 
  100    size_t name_len = *(
size_t *) 
data;
 
 
  123    const char *
name, 
size_t name_len)
 
 
  162static void mock_channel_destructor(
void *obj)
 
  169    struct ast_test *
test;
 
  174static void *test_storage_thread(
void *data)
 
  176    struct test_info *test_info = data;
 
  177    struct ast_test *
test = test_info->test;
 
  182    struct timeval start;
 
  191    int CHANNEL_COUNT = 500;
 
  195    for (i = 0; i < cli_args->
argc; i++) {
 
  197            sscanf(cli_args->
argv[i], 
"channel-count=%d", &CHANNEL_COUNT);
 
  200    test_channels = 
ast_calloc(CHANNEL_COUNT, 
sizeof(*test_channels));
 
  204    for (i = 0; i < CHANNEL_COUNT; i++) {
 
  205        test_channels[i] = 
ao2_alloc(
sizeof(*mock_channel), mock_channel_destructor);
 
  206        ast_test_validate_cleanup(
test, test_channels[i], res, 
done);
 
  213        ast_test_validate_cleanup_custom(
test, rc == 0, res, 
done, 
"Unable to insert channel %s\n", test_channels[i]->
name);
 
  219    ast_test_validate_cleanup(
test, i == CHANNEL_COUNT, res, 
done);
 
  222    for (i = 0; i < CHANNEL_COUNT; i++) {
 
  223        sprintf(search1, 
"testchannel-%ld-%04d-something", rand, i);
 
  224        mock_channel = 
CHANNELSTORAGE_API(storage_instance, get_by_name_prefix_or_uniqueid, search1, 0);
 
  225        ast_test_validate_cleanup(
test, mock_channel, res, 
done);
 
  226        ast_test_validate_cleanup(
test, mock_channel == test_channels[i], res, 
done);
 
  227        ast_test_validate_cleanup(
test,
 
  236    for (i = 0; i < CHANNEL_COUNT; i++) {
 
  237        sprintf(search1, 
"TestUniqueid-%ld-%04d-something", rand, i);
 
  239        ast_test_validate_cleanup(
test, mock_channel, res, 
done);
 
  247    for (i = 0; i < CHANNEL_COUNT; i++) {
 
  248        sprintf(search1, 
"TestUniqueid-%ld-%04d-something", rand, i);
 
  249        mock_channel = 
CHANNELSTORAGE_API(storage_instance, get_by_name_prefix_or_uniqueid, search1, 0);
 
  250        ast_test_validate_cleanup(
test, mock_channel, res, 
done);
 
  258    for (i = 0; i < CHANNEL_COUNT; i++) {
 
  259        sprintf(search1, 
"TestChannel-%ld-%04d", rand, i);
 
  260        mock_channel = 
CHANNELSTORAGE_API(storage_instance, get_by_name_prefix_or_uniqueid, search1, strlen(search1));
 
  261        ast_test_validate_cleanup(
test, mock_channel, res, 
done);
 
  269    for (i = 0; i < CHANNEL_COUNT; i++) {
 
  270        sprintf(search1, 
"TestContext-%ld-%04d", rand, i % 100);
 
  271        sprintf(search2, 
"TestExten-%ld-%04d", rand, i % 10);
 
  273        ast_test_validate_cleanup(
test, mock_channel, res, 
done);
 
  291    ast_test_validate_cleanup_custom(
test, i == CHANNEL_COUNT, res, 
done,
 
  292        "Expected %d channels, got %d, in container: %d\n", CHANNEL_COUNT, i,
 
  297    sprintf(search1, 
"TestChannel-%ld-%03d", rand, (CHANNEL_COUNT - 11) / 10);
 
  299    ast_test_validate_cleanup(
test, iter != 
NULL, res, 
done);
 
  302        ast_test_validate_cleanup_custom(
test, strncmp(search1,
 
  311    ast_test_validate_cleanup_custom(
test, i == 10, res, 
done,
 
  312        "Expected %d channels, got %d, in container: %d\n", 10, i,
 
  317    sprintf(search1, 
"TestContext-%ld-%04d", rand, 50);
 
  318    sprintf(search2, 
"TestExten-%ld-%04d", rand, 0);
 
  320    ast_test_validate_cleanup(
test, iter != 
NULL, res, 
done);
 
  323        ast_test_validate_cleanup_custom(
test,
 
  324            (strcmp(search1, mock_channel->
context) == 0 &&
 
  325            strcmp(search2, mock_channel->
exten) == 0), res, 
done, 
"Expected %s-%s got %s-%s\n",
 
  326            search1, search2, mock_channel->
context, mock_channel->
exten);
 
  333    ast_test_validate_cleanup_custom(
test, i == (CHANNEL_COUNT / 100), res, 
done,
 
  334        "Expected %d channels, got %d, in container: %d\n", (CHANNEL_COUNT / 100), i,
 
  341    for (i = 0; i < CHANNEL_COUNT; i++) {
 
  342        if (test_channels[i]) {
 
  345            test_channels[i] = 
NULL;
 
  351    ast_test_validate_cleanup(
test, i == CHANNEL_COUNT, res, 
done);
 
  353    ast_test_validate_cleanup_custom(
test, rc == 0, res, 
final,
 
  354        "There are still %d channels in the container\n", rc);
 
  356    test_info->res = res;
 
  368    test_info->res = res;
 
  374    const char *storage_name, 
const char *summary)
 
  377    struct test_info ti = {
 
  379        .storage_instance = 
NULL,
 
  387        info->name = storage_name;
 
  388        info->category = 
"/main/channelstorage/";
 
  389        info->summary = summary;
 
  397    if (!storage_driver) {
 
  402    ast_test_validate(
test, ti.storage_instance, res);
 
  416#define DEFINE_STORAGE_TEST(_name) \ 
  417AST_TEST_DEFINE(_name) \ 
  419    return test_storage(info, cmd, test, #_name, "Channel Storage test for " #_name); \ 
  422DEFINE_STORAGE_TEST(ao2_legacy)
 
  424DEFINE_STORAGE_TEST(cpp_map_name_id)
 
  426#define REGISTER_STORAGE_TEST(_name) \ 
  428    if (ast_channelstorage_get_driver(#_name)) { \ 
  429        AST_TEST_REGISTER(_name); \ 
  447    REGISTER_STORAGE_TEST(cpp_map_name_id);
 
 
Asterisk main include file. File version handling, generic pbx functions.
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
#define ast_calloc(num, len)
A wrapper for calloc()
#define ao2_alloc(data_size, destructor_fn)
const char * ast_channel_name(const struct ast_channel *chan)
const char * ast_channel_uniqueid(const struct ast_channel *chan)
const char * ast_channel_context(const struct ast_channel *chan)
#define ast_channel_unref(c)
Decrease channel reference count.
const char * ast_channel_exten(const struct ast_channel *chan)
#define AST_MAX_EXTENSION
struct ast_channelstorage_instance * ast_channelstorage_open(const struct ast_channelstorage_driver *storage_driver, const char *instance_name)
int ast_channelstorage_init(void)
int channelstorage_exten_cb(void *obj, void *arg, void *data, int flags)
int channelstorage_name_cb(void *obj, void *arg, void *data, int flags)
int channelstorage_uniqueid_cb(void *obj, void *arg, void *data, int flags)
int ast_channelstorage_register_driver(const struct ast_channelstorage_driver *driver_type)
const struct ast_channelstorage_driver * ast_channelstorage_get_driver(const char *driver_name)
static void channelstorage_shutdown(void)
struct ast_channel * channelstorage_by_name_prefix_or_uniqueid(struct ast_channelstorage_instance *driver, const char *name, size_t name_len)
struct ast_channel * channelstorage_by_name_or_uniqueid(struct ast_channelstorage_instance *driver, const char *name)
void ast_channelstorage_close(struct ast_channelstorage_instance *storage_instance)
static struct @354 storage_drivers
struct ast_channel * channelstorage_by_exten(struct ast_channelstorage_instance *driver, const char *exten, const char *context)
struct ast_channel * channelstorage_by_uniqueid(struct ast_channelstorage_instance *driver, const char *uniqueid)
#define CHANNELSTORAGE_API(_instance, _func,...)
static struct ast_channel * get_by_uniqueid(struct ast_channelstorage_instance *driver, const char *uniqueid)
static struct ast_channelstorage_driver driver_type
static struct ast_channel_iterator * iterator_by_exten_new(struct ast_channelstorage_instance *driver, const char *exten, const char *context)
static void close_instance(struct ast_channelstorage_instance *driver)
static struct ast_channel * get_by_name_prefix(struct ast_channelstorage_instance *driver, const char *name, size_t name_len)
static struct ast_channel * iterator_next(struct ast_channelstorage_instance *driver, struct ast_channel_iterator *i)
static int active_channels(struct ast_channelstorage_instance *driver)
returns number of active/allocated channels
static struct ast_channel_iterator * iterator_destroy(struct ast_channelstorage_instance *driver, struct ast_channel_iterator *i)
static struct ast_channel_iterator * iterator_by_name_new(struct ast_channelstorage_instance *driver, const char *name, size_t name_len)
static struct ast_channel * get_by_exten(struct ast_channelstorage_instance *driver, const char *exten, const char *context)
static struct ast_channel_iterator * iterator_all_new(struct ast_channelstorage_instance *driver)
static struct ast_channel * callback(struct ast_channelstorage_instance *driver, ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Options provided by main asterisk program.
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
#define ast_string_field_build(x, field, fmt, args...)
Set a field to a complex (built) value.
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Checks whether a string begins with another.
char unique_id[AST_MAX_UNIQUEID]
Main Channel structure associated with a channel.
struct ast_channel_id uniqueid
char exten[AST_MAX_EXTENSION]
char context[AST_MAX_CONTEXT]
struct ast_channelstorage_instance *(* open_instance)(const char *instance_name)
Contains all the initialization information required to store a new test definition.
#define AST_TEST_REGISTER(cb)
#define ast_test_status_update(a, b, c...)
#define AST_TEST_UNREGISTER(cb)
int64_t ast_tvdiff_us(struct timeval end, struct timeval start)
Computes the difference (in microseconds) between two struct timeval instances.
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
#define ast_pthread_create(a, b, c, d)
long int ast_random(void)
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
#define AST_VECTOR(name, type)
Define a vector structure.
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.