51 const char *instance_name)
55 storage_instance = storage_driver->
open(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);
282 for (i = 0; i < CHANNEL_COUNT; i++) {
283 sprintf(search1,
"TestChannel-%ld-%04d-something", rand, i);
284 mock_channel =
CHANNELSTORAGE_API(storage_instance, get_by_name_or_uniqueid, search1);
285 ast_test_validate_cleanup(
test, mock_channel, res,
done);
289 sprintf(mock_channel->
context,
"TestXXContext-%ld-%04d", rand, i);
290 sprintf(search1,
"TestContext-%ld-%04d", rand, i);
293 AST_CHANNELSTORAGE_UPDATE_CONTEXT, search1, mock_channel->
context, 0);
294 ast_test_validate_cleanup(
test, rc == 0, res,
done);
296 sprintf(mock_channel->
exten,
"TestXXExten-%ld-%04d", rand, i);
297 sprintf(search2,
"TestExten-%ld-%04d", rand, i);
300 AST_CHANNELSTORAGE_UPDATE_EXTEN, search2, mock_channel->
exten, 0);
303 ast_test_validate_cleanup(
test, rc == 0, res,
done);
312 for (i = 0; i < CHANNEL_COUNT; i++) {
313 sprintf(search1,
"TestXXContext-%ld-%04d", rand, i);
314 sprintf(search2,
"TestXXExten-%ld-%04d", rand, i);
316 ast_test_validate_cleanup(
test, mock_channel, res,
done);
324 for (i = 0; i < CHANNEL_COUNT; i++) {
325 sprintf(search1,
"TestChannel-%ld-%04d-something", rand, i);
326 mock_channel =
CHANNELSTORAGE_API(storage_instance, get_by_name_or_uniqueid, search1);
327 ast_test_validate_cleanup(
test, mock_channel, res,
done);
328 sprintf(search2,
"TestXXChannel-%ld-%04d", rand, i);
330 AST_CHANNELSTORAGE_UPDATE_NAME, search1, search2, 1);
332 ast_test_validate_cleanup(
test, rc == 0, res,
done);
339 for (i = 0; i < CHANNEL_COUNT; i++) {
340 sprintf(search1,
"TestXXChannel-%ld-%04d", rand, i);
341 mock_channel =
CHANNELSTORAGE_API(storage_instance, get_by_name_or_uniqueid, search1);
342 ast_test_validate_cleanup_custom(
test, mock_channel, res,
done,
"Channel %s not found\n", search1);
361 ast_test_validate_cleanup_custom(
test, i == CHANNEL_COUNT, res,
done,
362 "Expected %d channels, got %d, in container: %d\n", CHANNEL_COUNT, i,
367 sprintf(search1,
"TestChannel-%ld-%03d", rand, (CHANNEL_COUNT - 11) / 10);
369 ast_test_validate_cleanup(
test, iter !=
NULL, res,
done);
372 ast_test_validate_cleanup_custom(
test, strncmp(search1,
381 ast_test_validate_cleanup_custom(
test, i == 10, res,
done,
382 "Expected %d channels, got %d, in container: %d\n", 10, i,
387 sprintf(search1,
"TestContext-%ld-%04d", rand, 50);
388 sprintf(search2,
"TestExten-%ld-%04d", rand, 0);
390 ast_test_validate_cleanup(
test, iter !=
NULL, res,
done);
393 ast_test_validate_cleanup_custom(
test,
394 (strcmp(search1, mock_channel->
context) == 0 &&
395 strcmp(search2, mock_channel->
exten) == 0), res,
done,
"Expected %s-%s got %s-%s\n",
396 search1, search2, mock_channel->
context, mock_channel->
exten);
403 ast_test_validate_cleanup_custom(
test, i == (CHANNEL_COUNT / 100), res,
done,
404 "Expected %d channels, got %d, in container: %d\n", (CHANNEL_COUNT / 100), i,
411 for (i = 0; i < CHANNEL_COUNT; i++) {
412 if (test_channels[i]) {
415 test_channels[i] =
NULL;
421 ast_test_validate_cleanup(
test, i == CHANNEL_COUNT, res,
done);
423 ast_test_validate_cleanup_custom(
test, rc == 0, res,
final,
424 "There are still %d channels in the container\n", rc);
426 test_info->res = res;
438 test_info->res = res;
444 const char *storage_name,
const char *summary)
447 struct test_info ti = {
449 .storage_instance =
NULL,
457 info->name = storage_name;
458 info->category =
"/main/channelstorage/";
459 info->summary = summary;
467 if (!storage_driver) {
472 ast_test_validate(
test, ti.storage_instance, res);
486#define DEFINE_STORAGE_TEST(_name) \
487AST_TEST_DEFINE(_name) \
489 return test_storage(info, cmd, test, #_name, "Channel Storage test for " #_name); \
492DEFINE_STORAGE_TEST(ao2_legacy)
494DEFINE_STORAGE_TEST(cpp_map_name_id)
496#define REGISTER_STORAGE_TEST(_name) \
498 if (ast_channelstorage_get_driver(#_name)) { \
499 AST_TEST_REGISTER(_name); \
517 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)
struct ast_channel * channelstorage_by_exten(struct ast_channelstorage_instance *driver, const char *exten, const char *context)
static struct @333 storage_drivers
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 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)
static void update(int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, struct g726_state *state_ptr)
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)(const char *instance_name)
void(* close)(struct ast_channelstorage_instance *driver)
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.