|
Packit Service |
0057d1 |
/* GStreamer
|
|
Packit Service |
0057d1 |
*
|
|
Packit Service |
0057d1 |
* unit test for GstPromise
|
|
Packit Service |
0057d1 |
*
|
|
Packit Service |
0057d1 |
* Copyright (C) 2017 Matthew Waters <matthew@centricular.com>
|
|
Packit Service |
0057d1 |
*
|
|
Packit Service |
0057d1 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
0057d1 |
* modify it under the terms of the GNU Library General Public
|
|
Packit Service |
0057d1 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
0057d1 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit Service |
0057d1 |
*
|
|
Packit Service |
0057d1 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
0057d1 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
0057d1 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
0057d1 |
* Library General Public License for more details.
|
|
Packit Service |
0057d1 |
*
|
|
Packit Service |
0057d1 |
* You should have received a copy of the GNU Library General Public
|
|
Packit Service |
0057d1 |
* License along with this library; if not, write to the
|
|
Packit Service |
0057d1 |
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
Packit Service |
0057d1 |
* Boston, MA 02110-1301, USA.
|
|
Packit Service |
0057d1 |
*/
|
|
Packit Service |
0057d1 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
0057d1 |
#include "config.h"
|
|
Packit Service |
0057d1 |
#endif
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
#include <gst/check/gstcheck.h>
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
struct event_queue
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GMutex lock;
|
|
Packit Service |
0057d1 |
GCond cond;
|
|
Packit Service |
0057d1 |
GThread *thread;
|
|
Packit Service |
0057d1 |
GMainContext *main_context;
|
|
Packit Service |
0057d1 |
GMainLoop *main_loop;
|
|
Packit Service |
0057d1 |
gpointer user_data;
|
|
Packit Service |
0057d1 |
};
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static gboolean
|
|
Packit Service |
0057d1 |
_unlock_thread (GMutex * lock)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
g_mutex_unlock (lock);
|
|
Packit Service |
0057d1 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static gpointer
|
|
Packit Service |
0057d1 |
_promise_thread (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
g_mutex_lock (&q->lock);
|
|
Packit Service |
0057d1 |
q->main_context = g_main_context_new ();
|
|
Packit Service |
0057d1 |
q->main_loop = g_main_loop_new (q->main_context, FALSE);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_cond_broadcast (&q->cond);
|
|
Packit Service |
0057d1 |
g_main_context_invoke (q->main_context, (GSourceFunc) _unlock_thread,
|
|
Packit Service |
0057d1 |
&q->lock);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_main_loop_run (q->main_loop);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_mutex_lock (&q->lock);
|
|
Packit Service |
0057d1 |
g_main_context_unref (q->main_context);
|
|
Packit Service |
0057d1 |
q->main_context = NULL;
|
|
Packit Service |
0057d1 |
g_main_loop_unref (q->main_loop);
|
|
Packit Service |
0057d1 |
q->main_loop = NULL;
|
|
Packit Service |
0057d1 |
g_cond_broadcast (&q->cond);
|
|
Packit Service |
0057d1 |
g_mutex_unlock (&q->lock);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
return NULL;
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static void
|
|
Packit Service |
0057d1 |
event_queue_start (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
g_mutex_lock (&q->lock);
|
|
Packit Service |
0057d1 |
q->thread = g_thread_new ("promise-thread", (GThreadFunc) _promise_thread, q);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
while (!q->main_loop)
|
|
Packit Service |
0057d1 |
g_cond_wait (&q->cond, &q->lock);
|
|
Packit Service |
0057d1 |
g_mutex_unlock (&q->lock);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static void
|
|
Packit Service |
0057d1 |
event_queue_stop (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
g_mutex_lock (&q->lock);
|
|
Packit Service |
0057d1 |
if (q->main_loop)
|
|
Packit Service |
0057d1 |
g_main_loop_quit (q->main_loop);
|
|
Packit Service |
0057d1 |
g_mutex_unlock (&q->lock);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static void
|
|
Packit Service |
0057d1 |
event_queue_stop_wait (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
g_mutex_lock (&q->lock);
|
|
Packit Service |
0057d1 |
while (q->main_loop) {
|
|
Packit Service |
0057d1 |
g_main_loop_quit (q->main_loop);
|
|
Packit Service |
0057d1 |
g_cond_wait (&q->cond, &q->lock);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
g_mutex_unlock (&q->lock);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_thread_unref (q->thread);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static struct event_queue *
|
|
Packit Service |
0057d1 |
event_queue_new (void)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
struct event_queue *q = g_new0 (struct event_queue, 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_LOG ("starting event queue %p", q);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_mutex_init (&q->lock);
|
|
Packit Service |
0057d1 |
g_cond_init (&q->cond);
|
|
Packit Service |
0057d1 |
event_queue_start (q);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
return q;
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static void
|
|
Packit Service |
0057d1 |
event_queue_free (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
event_queue_stop_wait (q);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_mutex_clear (&q->lock);
|
|
Packit Service |
0057d1 |
g_cond_clear (&q->cond);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_LOG ("stopped event queue %p", q);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_free (q);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static void
|
|
Packit Service |
0057d1 |
_enqueue_task (struct event_queue *q, GSourceFunc func, gpointer data,
|
|
Packit Service |
0057d1 |
GDestroyNotify notify)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GSource *source;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
source = g_idle_source_new ();
|
|
Packit Service |
0057d1 |
g_source_set_priority (source, G_PRIORITY_DEFAULT);
|
|
Packit Service |
0057d1 |
g_source_set_callback (source, (GSourceFunc) func, data, notify);
|
|
Packit Service |
0057d1 |
g_source_attach (source, q->main_context);
|
|
Packit Service |
0057d1 |
g_source_unref (source);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_reply)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new ();
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, NULL);
|
|
Packit Service |
0057d1 |
fail_unless (gst_promise_wait (r) == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_reply_data)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
GstStructure *s;
|
|
Packit Service |
0057d1 |
const GstStructure *ret;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new ();
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
s = gst_structure_new ("promise", "test", G_TYPE_INT, 1, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, s);
|
|
Packit Service |
0057d1 |
fail_unless (gst_promise_wait (r) == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
ret = gst_promise_get_reply (r);
|
|
Packit Service |
0057d1 |
fail_unless (gst_structure_is_equal (ret, s));
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_reply_immutable)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
GstStructure *s, *ret;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new ();
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
s = gst_structure_new ("promise", "test", G_TYPE_INT, 1, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, s);
|
|
Packit Service |
0057d1 |
ret = (GstStructure *) gst_promise_get_reply (r);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
/* immutable result must not be able to modify the reply */
|
|
Packit Service |
0057d1 |
ASSERT_CRITICAL (gst_structure_set (ret, "foo", G_TYPE_STRING, "bar", NULL));
|
|
Packit Service |
0057d1 |
fail_unless (gst_structure_get_string (ret, "foo") == NULL);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_interrupt)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new ();
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_interrupt (r);
|
|
Packit Service |
0057d1 |
fail_unless (gst_promise_wait (r) == GST_PROMISE_RESULT_INTERRUPTED);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_expire)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new ();
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_expire (r);
|
|
Packit Service |
0057d1 |
fail_unless (gst_promise_wait (r) == GST_PROMISE_RESULT_EXPIRED);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
struct change_data
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
int change_count;
|
|
Packit Service |
0057d1 |
GstPromiseResult result;
|
|
Packit Service |
0057d1 |
};
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static void
|
|
Packit Service |
0057d1 |
on_change (GstPromise * promise, gpointer user_data)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
struct change_data *res = user_data;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
res->result = gst_promise_wait (promise);
|
|
Packit Service |
0057d1 |
res->change_count += 1;
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_change_func)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, NULL);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_reply_expire)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, NULL);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
gst_promise_expire (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_reply_discard)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
/* NULL promise => discard reply */
|
|
Packit Service |
0057d1 |
r = NULL;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
/* no-op, we don't want a reply */
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, NULL);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
if (r)
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_reply_interrupt)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, NULL);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
gst_promise_interrupt (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_reply_reply)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
GstStructure *s;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
const GstStructure *ret;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
s = gst_structure_new ("promise", "test", G_TYPE_INT, 1, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, s);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
ASSERT_CRITICAL (gst_promise_reply (r, NULL));
|
|
Packit Service |
0057d1 |
fail_unless (gst_promise_wait (r) == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
ret = gst_promise_get_reply (r);
|
|
Packit Service |
0057d1 |
fail_unless (gst_structure_is_equal (ret, s));
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_REPLIED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_interrupt_expire)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_interrupt (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_INTERRUPTED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
gst_promise_expire (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_INTERRUPTED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_interrupt_reply)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_interrupt (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_INTERRUPTED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
gst_promise_reply (r, NULL);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_INTERRUPTED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_interrupt_interrupt)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_interrupt (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_INTERRUPTED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
ASSERT_CRITICAL (gst_promise_interrupt (r));
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_INTERRUPTED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_expire_expire)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_expire (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_EXPIRED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
gst_promise_expire (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_EXPIRED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_expire_interrupt)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_expire (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_EXPIRED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
ASSERT_CRITICAL (gst_promise_interrupt (r));
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_EXPIRED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_expire_reply)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GstPromise *r;
|
|
Packit Service |
0057d1 |
struct change_data data = { 0, };
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
r = gst_promise_new_with_change_func (on_change, &data, NULL);
|
|
Packit Service |
0057d1 |
gst_promise_expire (r);
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_EXPIRED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
ASSERT_CRITICAL (gst_promise_reply (r, NULL));
|
|
Packit Service |
0057d1 |
fail_unless (data.result == GST_PROMISE_RESULT_EXPIRED);
|
|
Packit Service |
0057d1 |
fail_unless (data.change_count == 1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (r);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
struct stress_item
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
struct event_queue *q;
|
|
Packit Service |
0057d1 |
GstPromise *promise;
|
|
Packit Service |
0057d1 |
GstPromiseResult result;
|
|
Packit Service |
0057d1 |
};
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static void
|
|
Packit Service |
0057d1 |
stress_reply (struct stress_item *item)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
switch (item->result) {
|
|
Packit Service |
0057d1 |
case GST_PROMISE_RESULT_REPLIED:
|
|
Packit Service |
0057d1 |
gst_promise_reply (item->promise, NULL);
|
|
Packit Service |
0057d1 |
break;
|
|
Packit Service |
0057d1 |
case GST_PROMISE_RESULT_INTERRUPTED:
|
|
Packit Service |
0057d1 |
gst_promise_interrupt (item->promise);
|
|
Packit Service |
0057d1 |
break;
|
|
Packit Service |
0057d1 |
case GST_PROMISE_RESULT_EXPIRED:
|
|
Packit Service |
0057d1 |
gst_promise_expire (item->promise);
|
|
Packit Service |
0057d1 |
break;
|
|
Packit Service |
0057d1 |
default:
|
|
Packit Service |
0057d1 |
g_assert_not_reached ();
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
struct stress_queues
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
GAsyncQueue *push_queue;
|
|
Packit Service |
0057d1 |
GAsyncQueue *wait_queue;
|
|
Packit Service |
0057d1 |
guint64 push_count;
|
|
Packit Service |
0057d1 |
};
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static gboolean
|
|
Packit Service |
0057d1 |
_push_random_promise (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
struct stress_queues *s_q = q->user_data;
|
|
Packit Service |
0057d1 |
struct stress_item *item;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
item = g_new0 (struct stress_item, 1);
|
|
Packit Service |
0057d1 |
item->promise = gst_promise_new ();
|
|
Packit Service |
0057d1 |
while (item->result == GST_PROMISE_RESULT_PENDING)
|
|
Packit Service |
0057d1 |
item->result = g_random_int () % 4;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_async_queue_push (s_q->wait_queue, item);
|
|
Packit Service |
0057d1 |
g_async_queue_push (s_q->push_queue, item);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
s_q->push_count++;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
return G_SOURCE_CONTINUE;
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static void
|
|
Packit Service |
0057d1 |
_push_stop_promise (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
struct stress_queues *s_q = q->user_data;
|
|
Packit Service |
0057d1 |
gpointer item = GINT_TO_POINTER (1);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_async_queue_push (s_q->wait_queue, item);
|
|
Packit Service |
0057d1 |
g_async_queue_push (s_q->push_queue, item);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static gboolean
|
|
Packit Service |
0057d1 |
_pop_promise (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
struct stress_queues *s_q = q->user_data;
|
|
Packit Service |
0057d1 |
struct stress_item *item;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
item = g_async_queue_pop (s_q->push_queue);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
if (item == (void *) 1)
|
|
Packit Service |
0057d1 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
stress_reply (item);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
return G_SOURCE_CONTINUE;
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static gboolean
|
|
Packit Service |
0057d1 |
_wait_promise (struct event_queue *q)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
struct stress_queues *s_q = q->user_data;
|
|
Packit Service |
0057d1 |
struct stress_item *item;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
item = g_async_queue_pop (s_q->wait_queue);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
if (item == (void *) 1)
|
|
Packit Service |
0057d1 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
fail_unless (gst_promise_wait (item->promise) == item->result);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (item->promise);
|
|
Packit Service |
0057d1 |
g_free (item);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
return G_SOURCE_CONTINUE;
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_START_TEST (test_stress)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
#define N_QUEUES 3
|
|
Packit Service |
0057d1 |
struct event_queue *pushers[N_QUEUES];
|
|
Packit Service |
0057d1 |
struct event_queue *poppers[N_QUEUES];
|
|
Packit Service |
0057d1 |
struct event_queue *waiters[N_QUEUES];
|
|
Packit Service |
0057d1 |
struct stress_queues s_q = { 0, };
|
|
Packit Service |
0057d1 |
int i;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
s_q.push_queue = g_async_queue_new ();
|
|
Packit Service |
0057d1 |
s_q.wait_queue = g_async_queue_new ();
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
for (i = 0; i < N_QUEUES; i++) {
|
|
Packit Service |
0057d1 |
pushers[i] = event_queue_new ();
|
|
Packit Service |
0057d1 |
pushers[i]->user_data = &s_;;
|
|
Packit Service |
0057d1 |
_enqueue_task (pushers[i], (GSourceFunc) _push_random_promise, pushers[i],
|
|
Packit Service |
0057d1 |
NULL);
|
|
Packit Service |
0057d1 |
waiters[i] = event_queue_new ();
|
|
Packit Service |
0057d1 |
waiters[i]->user_data = &s_;;
|
|
Packit Service |
0057d1 |
_enqueue_task (waiters[i], (GSourceFunc) _wait_promise, waiters[i], NULL);
|
|
Packit Service |
0057d1 |
poppers[i] = event_queue_new ();
|
|
Packit Service |
0057d1 |
poppers[i]->user_data = &s_;;
|
|
Packit Service |
0057d1 |
_enqueue_task (poppers[i], (GSourceFunc) _pop_promise, poppers[i], NULL);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_INFO ("all set up, waiting.");
|
|
Packit Service |
0057d1 |
g_usleep (100000);
|
|
Packit Service |
0057d1 |
GST_INFO ("wait done, cleaning up the test.");
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
struct stress_item *item;
|
|
Packit Service |
0057d1 |
int push_size;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
for (i = 0; i < N_QUEUES; i++) {
|
|
Packit Service |
0057d1 |
event_queue_stop (pushers[i]);
|
|
Packit Service |
0057d1 |
event_queue_stop (poppers[i]);
|
|
Packit Service |
0057d1 |
event_queue_stop (waiters[i]);
|
|
Packit Service |
0057d1 |
_push_stop_promise (pushers[i]);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
for (i = 0; i < N_QUEUES; i++) {
|
|
Packit Service |
0057d1 |
event_queue_free (pushers[i]);
|
|
Packit Service |
0057d1 |
event_queue_free (poppers[i]);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
push_size = g_async_queue_length (s_q.push_queue);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
/* push through all the promises so all the waits will complete */
|
|
Packit Service |
0057d1 |
while ((item = g_async_queue_try_pop (s_q.push_queue))) {
|
|
Packit Service |
0057d1 |
if (item == (void *) 1)
|
|
Packit Service |
0057d1 |
continue;
|
|
Packit Service |
0057d1 |
stress_reply (item);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
for (i = 0; i < N_QUEUES; i++)
|
|
Packit Service |
0057d1 |
event_queue_free (waiters[i]);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_INFO ("pushed %" G_GUINT64_FORMAT ", %d leftover in push queue, "
|
|
Packit Service |
0057d1 |
"%d leftover in wait queue", s_q.push_count, push_size,
|
|
Packit Service |
0057d1 |
g_async_queue_length (s_q.wait_queue));
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
while ((item = g_async_queue_try_pop (s_q.wait_queue))) {
|
|
Packit Service |
0057d1 |
if (item == (void *) 1)
|
|
Packit Service |
0057d1 |
continue;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
fail_unless (gst_promise_wait (item->promise) == item->result);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
gst_promise_unref (item->promise);
|
|
Packit Service |
0057d1 |
g_free (item);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
g_async_queue_unref (s_q.push_queue);
|
|
Packit Service |
0057d1 |
g_async_queue_unref (s_q.wait_queue);
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_END_TEST;
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
static Suite *
|
|
Packit Service |
0057d1 |
gst_promise_suite (void)
|
|
Packit Service |
0057d1 |
{
|
|
Packit Service |
0057d1 |
Suite *s = suite_create ("GstPromise");
|
|
Packit Service |
0057d1 |
TCase *tc_chain = tcase_create ("general");
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
suite_add_tcase (s, tc_chain);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_reply);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_reply_data);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_reply_immutable);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_interrupt);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_expire);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_change_func);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_reply_expire);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_reply_discard);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_reply_interrupt);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_reply_reply);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_interrupt_reply);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_interrupt_expire);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_interrupt_interrupt);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_expire_expire);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_expire_interrupt);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_expire_reply);
|
|
Packit Service |
0057d1 |
tcase_add_test (tc_chain, test_stress);
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
return s;
|
|
Packit Service |
0057d1 |
}
|
|
Packit Service |
0057d1 |
|
|
Packit Service |
0057d1 |
GST_CHECK_MAIN (gst_promise);
|