summaryrefslogtreecommitdiff
path: root/tests/test_channel_feature_hooks.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2014-11-24 20:39:01 +0000
committerRichard Mudgett <rmudgett@digium.com>2014-11-24 20:39:01 +0000
commit3e08619faf5266c95fc7d5bb298547e3fc30009e (patch)
tree5cefc3f64443c7910a750ffd523ca64db4108485 /tests/test_channel_feature_hooks.c
parentc38ffca9a180d118a090c1234ca64d811c893713 (diff)
test_channel_feature_hooks.c: Fix unit test for DTMF hooks.
Fix the failing /channels/features/test_features_channel_dtmf unit test. DTMF emulation does not work without a stream of packets to prod the emulation code. Review: https://reviewboard.asterisk.org/r/4199/ ........ Merged revisions 428604 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@428605 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'tests/test_channel_feature_hooks.c')
-rw-r--r--tests/test_channel_feature_hooks.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/tests/test_channel_feature_hooks.c b/tests/test_channel_feature_hooks.c
index 2fc9765d4..478cf36cf 100644
--- a/tests/test_channel_feature_hooks.c
+++ b/tests/test_channel_feature_hooks.c
@@ -76,12 +76,10 @@ static void wait_for_bridged(struct ast_channel *channel)
/*! \brief Wait until a channel is not bridged */
static void wait_for_unbridged(struct ast_channel *channel)
{
- struct timespec short_sleep = {0, 1000000};
ast_channel_lock(channel);
while (ast_channel_is_bridged(channel)) {
ast_channel_unlock(channel);
- while ((nanosleep(&short_sleep, &short_sleep) == -1) && (errno == EINTR)) {
- }
+ test_nanosleep(0, 1000000);
ast_channel_lock(channel);
}
ast_channel_unlock(channel);
@@ -130,6 +128,29 @@ static int feature_callback(struct ast_bridge_channel *bridge_channel, void *obj
return 0;
}
+/* Need to post null frames periodically so DTMF emulation can work. */
+static void stream_periodic_frames(struct ast_channel *chan, int ms, int interval_ms)
+{
+ long nanosecs;
+
+ ast_assert(chan != NULL);
+ ast_assert(0 < ms);
+ ast_assert(0 < interval_ms);
+
+ nanosecs = interval_ms * 1000000L;
+ while (0 < ms) {
+ ast_queue_frame(chan, &ast_null_frame);
+
+ if (interval_ms < ms) {
+ ms -= interval_ms;
+ } else {
+ nanosecs = ms * 1000000L;
+ ms = 0;
+ }
+ test_nanosleep(0, nanosecs);
+ }
+}
+
AST_TEST_DEFINE(test_features_channel_dtmf)
{
RAII_VAR(struct ast_channel *, chan_alice, NULL, safe_channel_release);
@@ -185,7 +206,7 @@ AST_TEST_DEFINE(test_features_channel_dtmf)
ast_queue_frame(chan_alice, &f);
ast_queue_frame(chan_alice, &f);
- test_nanosleep(1, 0);
+ stream_periodic_frames(chan_alice, 1000, 20);
/* Remove the channels from the bridge */
ast_test_validate(test, !ast_bridge_depart(chan_alice));
@@ -208,7 +229,7 @@ AST_TEST_DEFINE(test_features_channel_dtmf)
ast_queue_frame(chan_alice, &f);
ast_queue_frame(chan_alice, &f);
- test_nanosleep(1, 0);
+ stream_periodic_frames(chan_alice, 1000, 20);
/* Remove the channels from the bridge */
ast_test_validate(test, !ast_bridge_depart(chan_alice));