[pulseaudio-discuss] [PATCH 12/12] tests: Add pstream/srbchannel test

David Henningsson david.henningsson at canonical.com
Fri May 30 04:59:31 PDT 2014


Runs four tests:
 1) Small packets, iochannel
 2) Big packets, iochannel
 3) Small packets, srbchannel
 4) Big packets, srbchannel

Signed-off-by: David Henningsson <david.henningsson at canonical.com>
---
 src/Makefile.am             |   6 ++
 src/tests/srbchannel-test.c | 138 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 144 insertions(+)
 create mode 100644 src/tests/srbchannel-test.c

diff --git a/src/Makefile.am b/src/Makefile.am
index b9a660e..bcd41d4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -271,6 +271,7 @@ TESTS_daemon = \
 
 if !OS_IS_WIN32
 TESTS_default += \
+		srbchannel-test \
 		sigbus-test \
 		usergroup-test
 endif
@@ -349,6 +350,11 @@ format_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS)
 format_test_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINOR@.la libpulse.la libpulsecommon- at PA_MAJORMINOR@.la
 format_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS)
 
+srbchannel_test_SOURCES = tests/srbchannel-test.c
+srbchannel_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS)
+srbchannel_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la
+srbchannel_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS)
+
 get_binary_name_test_SOURCES = tests/get-binary-name-test.c
 get_binary_name_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS)
 get_binary_name_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la
diff --git a/src/tests/srbchannel-test.c b/src/tests/srbchannel-test.c
new file mode 100644
index 0000000..78a401b
--- /dev/null
+++ b/src/tests/srbchannel-test.c
@@ -0,0 +1,138 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2014 David Henningsson, Canonical Ltd.
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <unistd.h>
+#include <check.h>
+
+#include <pulse/mainloop.h>
+#include <pulsecore/packet.h>
+#include <pulsecore/pstream.h>
+#include <pulsecore/iochannel.h>
+#include <pulsecore/memblock.h>
+
+int packets_received;
+int packets_checksum;
+int packets_length;
+
+static void packet_received(pa_pstream *p, pa_packet *packet, const pa_ancil *ancil, void *userdata) {
+    unsigned int i;
+    fail_unless(packets_length == (int) packet->length);
+    packets_received++;
+    for (i = 0; i < packet->length; i++)
+        packets_checksum += packet->data[i];
+}
+
+static void packet_test(int npackets, int plength, pa_mainloop *ml, pa_pstream *p1, pa_pstream *p2) {
+    pa_packet *packet = pa_packet_new(plength);
+    int i;
+    int psum = 0, totalsum = 0;
+    pa_log_info("Sending %d packets of length %d", npackets, plength);
+    packets_received = 0;
+    packets_checksum = 0;
+    packets_length = plength;
+    pa_pstream_set_receive_packet_callback(p2, packet_received, NULL);
+
+    for (i = 0; i < plength; i++) {
+        packet->data[i] = i;
+        psum += packet->data[i];
+    }
+
+    for (i = 0; i < npackets; i++) {
+        pa_pstream_send_packet(p1, packet, NULL);
+        totalsum += psum;
+        pa_mainloop_iterate(ml, 0, NULL);
+    }
+
+    while (packets_received < npackets)
+        pa_mainloop_iterate(ml, 1, NULL);
+
+    fail_unless(packets_checksum == totalsum);
+    pa_log_debug("Correct checksum received (%d)", packets_checksum);
+    pa_packet_unref(packet);
+}
+
+START_TEST (srbchannel_test) {
+
+    int pipefd[4];
+
+    pa_mainloop *ml = pa_mainloop_new();
+    pa_mempool *mp = pa_mempool_new(true, 0);
+    pa_iochannel *io1, *io2;
+    pa_pstream *p1, *p2;
+    pa_srbchannel *sr1, *sr2;
+    pa_srbchannel_template srt;
+
+    fail_unless(pipe(pipefd) == 0);
+    fail_unless(pipe(&pipefd[2]) == 0);
+    io1 = pa_iochannel_new(pa_mainloop_get_api(ml), pipefd[2], pipefd[1]);
+    io2 = pa_iochannel_new(pa_mainloop_get_api(ml), pipefd[0], pipefd[3]);
+    p1 = pa_pstream_new(pa_mainloop_get_api(ml), io1, mp);
+    p2 = pa_pstream_new(pa_mainloop_get_api(ml), io2, mp);
+
+    pa_log_debug("Pipes: fd %d -> %d, %d -> %d", pipefd[1], pipefd[0], pipefd[3], pipefd[2]);
+
+    packet_test(250, 5, ml, p1, p2);
+    packet_test(10, 1234567, ml, p1, p2);
+
+    pa_log_debug("And now the same thing with srbchannel...");
+
+    sr1 = pa_srbchannel_new(pa_mainloop_get_api(ml), mp);
+    pa_srbchannel_export(sr1, &srt);
+    pa_pstream_set_srbchannel(p1, sr1);
+    sr2 = pa_srbchannel_new_from_template(pa_mainloop_get_api(ml), &srt);
+    pa_pstream_set_srbchannel(p2, sr2);
+
+    packet_test(250, 5, ml, p1, p2);
+    packet_test(10, 1234567, ml, p1, p2);
+
+    pa_pstream_unref(p1);
+    pa_pstream_unref(p2);
+    pa_mempool_free(mp);
+    pa_mainloop_free(ml);
+}
+END_TEST
+
+
+int main(int argc, char *argv[]) {
+    int failed = 0;
+    Suite *s;
+    TCase *tc;
+    SRunner *sr;
+
+    if (!getenv("MAKE_CHECK"))
+        pa_log_set_level(PA_LOG_DEBUG);
+
+    s = suite_create("srbchannel");
+    tc = tcase_create("srbchannel");
+    tcase_add_test(tc, srbchannel_test);
+    suite_add_tcase(s, tc);
+
+    sr = srunner_create(s);
+    srunner_run_all(sr, CK_NORMAL);
+    failed = srunner_ntests_failed(sr);
+    srunner_free(sr);
+
+    return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
-- 
1.9.1



More information about the pulseaudio-discuss mailing list