153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 553a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 653a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 753a5a1b3Sopenharmony_ci or (at your option) any later version. 853a5a1b3Sopenharmony_ci 953a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1053a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1153a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1253a5a1b3Sopenharmony_ci General Public License for more details. 1353a5a1b3Sopenharmony_ci 1453a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1553a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1653a5a1b3Sopenharmony_ci***/ 1753a5a1b3Sopenharmony_ci 1853a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 1953a5a1b3Sopenharmony_ci#include <config.h> 2053a5a1b3Sopenharmony_ci#endif 2153a5a1b3Sopenharmony_ci 2253a5a1b3Sopenharmony_ci#include <stdlib.h> 2353a5a1b3Sopenharmony_ci#include <stdio.h> 2453a5a1b3Sopenharmony_ci#include <signal.h> 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <check.h> 2753a5a1b3Sopenharmony_ci 2853a5a1b3Sopenharmony_ci#include <pulsecore/memblockq.h> 2953a5a1b3Sopenharmony_ci#include <pulsecore/log.h> 3053a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3153a5a1b3Sopenharmony_ci#include <pulsecore/strbuf.h> 3253a5a1b3Sopenharmony_ci#include <pulsecore/core-util.h> 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_ci#include <pulse/xmalloc.h> 3553a5a1b3Sopenharmony_ci 3653a5a1b3Sopenharmony_cistatic const char *fixed[] = { 3753a5a1b3Sopenharmony_ci "1122444411441144__22__11______3333______________________________", 3853a5a1b3Sopenharmony_ci "__________________3333__________________________________________" 3953a5a1b3Sopenharmony_ci}; 4053a5a1b3Sopenharmony_cistatic const char *manual[] = { 4153a5a1b3Sopenharmony_ci "1122444411441144__22__11______3333______________________________", 4253a5a1b3Sopenharmony_ci "__________________3333______________________________" 4353a5a1b3Sopenharmony_ci}; 4453a5a1b3Sopenharmony_ci 4553a5a1b3Sopenharmony_ci/* 4653a5a1b3Sopenharmony_ci * utility function to create a memchunk 4753a5a1b3Sopenharmony_ci */ 4853a5a1b3Sopenharmony_cistatic pa_memchunk memchunk_from_str(pa_mempool *p, const char* data) 4953a5a1b3Sopenharmony_ci{ 5053a5a1b3Sopenharmony_ci pa_memchunk res; 5153a5a1b3Sopenharmony_ci size_t size = strlen(data); 5253a5a1b3Sopenharmony_ci 5353a5a1b3Sopenharmony_ci res.memblock = pa_memblock_new_fixed(p, (void*)data, size, true); 5453a5a1b3Sopenharmony_ci ck_assert_ptr_ne(res.memblock, NULL); 5553a5a1b3Sopenharmony_ci 5653a5a1b3Sopenharmony_ci res.index = 0; 5753a5a1b3Sopenharmony_ci res.length = pa_memblock_get_length(res.memblock); 5853a5a1b3Sopenharmony_ci 5953a5a1b3Sopenharmony_ci return res; 6053a5a1b3Sopenharmony_ci} 6153a5a1b3Sopenharmony_ci 6253a5a1b3Sopenharmony_cistatic void dump_chunk(const pa_memchunk *chunk, pa_strbuf *buf) { 6353a5a1b3Sopenharmony_ci size_t n; 6453a5a1b3Sopenharmony_ci void *q; 6553a5a1b3Sopenharmony_ci char *e; 6653a5a1b3Sopenharmony_ci 6753a5a1b3Sopenharmony_ci fail_unless(chunk != NULL); 6853a5a1b3Sopenharmony_ci 6953a5a1b3Sopenharmony_ci q = pa_memblock_acquire(chunk->memblock); 7053a5a1b3Sopenharmony_ci for (e = (char*) q + chunk->index, n = 0; n < chunk->length; n++, e++) { 7153a5a1b3Sopenharmony_ci fprintf(stderr, "%c", *e); 7253a5a1b3Sopenharmony_ci pa_strbuf_putc(buf, *e); 7353a5a1b3Sopenharmony_ci } 7453a5a1b3Sopenharmony_ci pa_memblock_release(chunk->memblock); 7553a5a1b3Sopenharmony_ci} 7653a5a1b3Sopenharmony_ci 7753a5a1b3Sopenharmony_cistatic void dump(pa_memblockq *bq, int n) { 7853a5a1b3Sopenharmony_ci pa_memchunk out; 7953a5a1b3Sopenharmony_ci pa_strbuf *buf; 8053a5a1b3Sopenharmony_ci char *str; 8153a5a1b3Sopenharmony_ci 8253a5a1b3Sopenharmony_ci pa_assert(bq); 8353a5a1b3Sopenharmony_ci 8453a5a1b3Sopenharmony_ci /* First let's dump this as fixed block */ 8553a5a1b3Sopenharmony_ci fprintf(stderr, "FIXED >"); 8653a5a1b3Sopenharmony_ci pa_memblockq_peek_fixed_size(bq, 64, &out); 8753a5a1b3Sopenharmony_ci buf = pa_strbuf_new(); 8853a5a1b3Sopenharmony_ci dump_chunk(&out, buf); 8953a5a1b3Sopenharmony_ci pa_memblock_unref(out.memblock); 9053a5a1b3Sopenharmony_ci str = pa_strbuf_to_string_free(buf); 9153a5a1b3Sopenharmony_ci fail_unless(pa_streq(str, fixed[n])); 9253a5a1b3Sopenharmony_ci pa_xfree(str); 9353a5a1b3Sopenharmony_ci fprintf(stderr, "<\n"); 9453a5a1b3Sopenharmony_ci 9553a5a1b3Sopenharmony_ci /* Then let's dump the queue manually */ 9653a5a1b3Sopenharmony_ci fprintf(stderr, "MANUAL>"); 9753a5a1b3Sopenharmony_ci 9853a5a1b3Sopenharmony_ci buf = pa_strbuf_new(); 9953a5a1b3Sopenharmony_ci for (;;) { 10053a5a1b3Sopenharmony_ci if (pa_memblockq_peek(bq, &out) < 0) 10153a5a1b3Sopenharmony_ci break; 10253a5a1b3Sopenharmony_ci 10353a5a1b3Sopenharmony_ci dump_chunk(&out, buf); 10453a5a1b3Sopenharmony_ci pa_memblock_unref(out.memblock); 10553a5a1b3Sopenharmony_ci pa_memblockq_drop(bq, out.length); 10653a5a1b3Sopenharmony_ci } 10753a5a1b3Sopenharmony_ci str = pa_strbuf_to_string_free(buf); 10853a5a1b3Sopenharmony_ci fail_unless(pa_streq(str, manual[n])); 10953a5a1b3Sopenharmony_ci pa_xfree(str); 11053a5a1b3Sopenharmony_ci fprintf(stderr, "<\n"); 11153a5a1b3Sopenharmony_ci} 11253a5a1b3Sopenharmony_ci 11353a5a1b3Sopenharmony_ci/* 11453a5a1b3Sopenharmony_ci * utility function to validate invariants 11553a5a1b3Sopenharmony_ci * 11653a5a1b3Sopenharmony_ci * The different values like base, maxlength etc follow certain rules. 11753a5a1b3Sopenharmony_ci * This convenience function makes sure that changes don't violate 11853a5a1b3Sopenharmony_ci * these rules. 11953a5a1b3Sopenharmony_ci */ 12053a5a1b3Sopenharmony_cistatic void check_queue_invariants(pa_memblockq *bq) { 12153a5a1b3Sopenharmony_ci size_t base = pa_memblockq_get_base(bq); 12253a5a1b3Sopenharmony_ci size_t maxlength = pa_memblockq_get_maxlength(bq); 12353a5a1b3Sopenharmony_ci size_t tlength = pa_memblockq_get_tlength(bq); 12453a5a1b3Sopenharmony_ci size_t minreq = pa_memblockq_get_minreq(bq); 12553a5a1b3Sopenharmony_ci size_t prebuf = pa_memblockq_get_prebuf(bq); 12653a5a1b3Sopenharmony_ci size_t length = pa_memblockq_get_length(bq); 12753a5a1b3Sopenharmony_ci 12853a5a1b3Sopenharmony_ci /* base > zero */ 12953a5a1b3Sopenharmony_ci ck_assert_int_gt(base, 0); 13053a5a1b3Sopenharmony_ci 13153a5a1b3Sopenharmony_ci /* maxlength multiple of base 13253a5a1b3Sopenharmony_ci * maxlength >= base */ 13353a5a1b3Sopenharmony_ci ck_assert_int_eq(maxlength % base, 0); 13453a5a1b3Sopenharmony_ci ck_assert_int_ge(maxlength, base); 13553a5a1b3Sopenharmony_ci 13653a5a1b3Sopenharmony_ci /* tlength multiple of base 13753a5a1b3Sopenharmony_ci * tlength >= base 13853a5a1b3Sopenharmony_ci * tlength <= maxlength */ 13953a5a1b3Sopenharmony_ci ck_assert_int_eq(tlength % base, 0); 14053a5a1b3Sopenharmony_ci ck_assert_int_ge(tlength, base); 14153a5a1b3Sopenharmony_ci ck_assert_int_le(tlength, maxlength); 14253a5a1b3Sopenharmony_ci 14353a5a1b3Sopenharmony_ci /* minreq multiple of base 14453a5a1b3Sopenharmony_ci * minreq >= base 14553a5a1b3Sopenharmony_ci * minreq <= tlength */ 14653a5a1b3Sopenharmony_ci ck_assert_int_eq(minreq % base, 0); 14753a5a1b3Sopenharmony_ci ck_assert_int_ge(minreq, base); 14853a5a1b3Sopenharmony_ci ck_assert_int_le(minreq, tlength); 14953a5a1b3Sopenharmony_ci 15053a5a1b3Sopenharmony_ci /* prebuf multiple of base 15153a5a1b3Sopenharmony_ci * prebuf >= 0 15253a5a1b3Sopenharmony_ci * prebuf <= tlength + base - minreq 15353a5a1b3Sopenharmony_ci * prebuf <= tlength (because minreq >= base) */ 15453a5a1b3Sopenharmony_ci ck_assert_int_eq(prebuf % base, 0); 15553a5a1b3Sopenharmony_ci ck_assert_int_ge(prebuf, 0); 15653a5a1b3Sopenharmony_ci ck_assert_int_le(prebuf, tlength + base - minreq); 15753a5a1b3Sopenharmony_ci ck_assert_int_le(prebuf, tlength); 15853a5a1b3Sopenharmony_ci 15953a5a1b3Sopenharmony_ci /* length >= 0 16053a5a1b3Sopenharmony_ci * length <= maxlength */ 16153a5a1b3Sopenharmony_ci ck_assert_int_ge(length, 0); 16253a5a1b3Sopenharmony_ci ck_assert_int_le(length, maxlength); 16353a5a1b3Sopenharmony_ci} 16453a5a1b3Sopenharmony_ci 16553a5a1b3Sopenharmony_ciSTART_TEST (memchunk_from_str_test) { 16653a5a1b3Sopenharmony_ci pa_mempool *p; 16753a5a1b3Sopenharmony_ci pa_memchunk chunk; 16853a5a1b3Sopenharmony_ci 16953a5a1b3Sopenharmony_ci p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true); 17053a5a1b3Sopenharmony_ci ck_assert_ptr_ne(p, NULL); 17153a5a1b3Sopenharmony_ci 17253a5a1b3Sopenharmony_ci /* allocate memchunk and check default settings */ 17353a5a1b3Sopenharmony_ci chunk = memchunk_from_str(p, "abcd"); 17453a5a1b3Sopenharmony_ci ck_assert_ptr_ne(chunk.memblock, NULL); 17553a5a1b3Sopenharmony_ci ck_assert_int_eq(chunk.index, 0); 17653a5a1b3Sopenharmony_ci ck_assert_int_eq(chunk.length, 4); 17753a5a1b3Sopenharmony_ci 17853a5a1b3Sopenharmony_ci /* cleanup */ 17953a5a1b3Sopenharmony_ci pa_memblock_unref(chunk.memblock); 18053a5a1b3Sopenharmony_ci pa_mempool_unref(p); 18153a5a1b3Sopenharmony_ci} 18253a5a1b3Sopenharmony_ciEND_TEST 18353a5a1b3Sopenharmony_ci 18453a5a1b3Sopenharmony_ciSTART_TEST (memblockq_test_initial_properties) { 18553a5a1b3Sopenharmony_ci pa_mempool *p; 18653a5a1b3Sopenharmony_ci pa_memblockq *bq; 18753a5a1b3Sopenharmony_ci pa_memchunk silence; 18853a5a1b3Sopenharmony_ci pa_sample_spec ss = { 18953a5a1b3Sopenharmony_ci .format = PA_SAMPLE_S32BE, 19053a5a1b3Sopenharmony_ci .rate = 48000, 19153a5a1b3Sopenharmony_ci .channels = 1 19253a5a1b3Sopenharmony_ci }; 19353a5a1b3Sopenharmony_ci int64_t idx = 0; 19453a5a1b3Sopenharmony_ci size_t maxlength = 100; 19553a5a1b3Sopenharmony_ci size_t tlength = 20; 19653a5a1b3Sopenharmony_ci size_t prebuf = 16; 19753a5a1b3Sopenharmony_ci size_t minreq = 8; 19853a5a1b3Sopenharmony_ci size_t maxrewind = 40; 19953a5a1b3Sopenharmony_ci 20053a5a1b3Sopenharmony_ci p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true); 20153a5a1b3Sopenharmony_ci ck_assert_ptr_ne(p, NULL); 20253a5a1b3Sopenharmony_ci 20353a5a1b3Sopenharmony_ci silence = memchunk_from_str(p, "__"); 20453a5a1b3Sopenharmony_ci 20553a5a1b3Sopenharmony_ci bq = pa_memblockq_new("test memblockq", idx, maxlength, tlength, &ss, prebuf, minreq, maxrewind, &silence); 20653a5a1b3Sopenharmony_ci fail_unless(bq != NULL); 20753a5a1b3Sopenharmony_ci 20853a5a1b3Sopenharmony_ci /* check initial properties */ 20953a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_is_readable(bq), false); 21053a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_length(bq), 0); 21153a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_maxlength(bq), maxlength); 21253a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_tlength(bq), tlength); 21353a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_prebuf(bq), prebuf); 21453a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_minreq(bq), minreq); 21553a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_maxrewind(bq), maxrewind); 21653a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_base(bq), pa_frame_size(&ss)); 21753a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_read_index(bq), 0); 21853a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_write_index(bq), 0); 21953a5a1b3Sopenharmony_ci 22053a5a1b3Sopenharmony_ci check_queue_invariants(bq); 22153a5a1b3Sopenharmony_ci 22253a5a1b3Sopenharmony_ci /* Check reporting of missing bytes: 22353a5a1b3Sopenharmony_ci * Initially, tlength bytes are missing. The second call doesn't 22453a5a1b3Sopenharmony_ci * report additional missing data since the first call. */ 22553a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), tlength); 22653a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), 0); 22753a5a1b3Sopenharmony_ci 22853a5a1b3Sopenharmony_ci /* cleanup */ 22953a5a1b3Sopenharmony_ci pa_memblockq_free(bq); 23053a5a1b3Sopenharmony_ci pa_memblock_unref(silence.memblock); 23153a5a1b3Sopenharmony_ci pa_mempool_unref(p); 23253a5a1b3Sopenharmony_ci} 23353a5a1b3Sopenharmony_ciEND_TEST 23453a5a1b3Sopenharmony_ci 23553a5a1b3Sopenharmony_ciSTART_TEST (memblockq_test) { 23653a5a1b3Sopenharmony_ci int ret; 23753a5a1b3Sopenharmony_ci 23853a5a1b3Sopenharmony_ci pa_mempool *p; 23953a5a1b3Sopenharmony_ci pa_memblockq *bq; 24053a5a1b3Sopenharmony_ci pa_memchunk chunk1, chunk2, chunk3, chunk4; 24153a5a1b3Sopenharmony_ci pa_memchunk silence; 24253a5a1b3Sopenharmony_ci pa_sample_spec ss = { 24353a5a1b3Sopenharmony_ci .format = PA_SAMPLE_S16LE, 24453a5a1b3Sopenharmony_ci .rate = 48000, 24553a5a1b3Sopenharmony_ci .channels = 1 24653a5a1b3Sopenharmony_ci }; 24753a5a1b3Sopenharmony_ci 24853a5a1b3Sopenharmony_ci p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true); 24953a5a1b3Sopenharmony_ci ck_assert_ptr_ne(p, NULL); 25053a5a1b3Sopenharmony_ci 25153a5a1b3Sopenharmony_ci silence = memchunk_from_str(p, "__"); 25253a5a1b3Sopenharmony_ci 25353a5a1b3Sopenharmony_ci bq = pa_memblockq_new("test memblockq", 0, 200, 10, &ss, 4, 4, 40, &silence); 25453a5a1b3Sopenharmony_ci fail_unless(bq != NULL); 25553a5a1b3Sopenharmony_ci check_queue_invariants(bq); 25653a5a1b3Sopenharmony_ci 25753a5a1b3Sopenharmony_ci chunk1 = memchunk_from_str(p, "11"); 25853a5a1b3Sopenharmony_ci chunk2 = memchunk_from_str(p, "XX22"); 25953a5a1b3Sopenharmony_ci chunk2.index += 2; 26053a5a1b3Sopenharmony_ci chunk2.length -= 2; 26153a5a1b3Sopenharmony_ci chunk3 = memchunk_from_str(p, "3333"); 26253a5a1b3Sopenharmony_ci chunk4 = memchunk_from_str(p, "44444444"); 26353a5a1b3Sopenharmony_ci 26453a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk1); 26553a5a1b3Sopenharmony_ci fail_unless(ret == 0); 26653a5a1b3Sopenharmony_ci 26753a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk2); 26853a5a1b3Sopenharmony_ci fail_unless(ret == 0); 26953a5a1b3Sopenharmony_ci 27053a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk3); 27153a5a1b3Sopenharmony_ci fail_unless(ret == 0); 27253a5a1b3Sopenharmony_ci 27353a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk4); 27453a5a1b3Sopenharmony_ci fail_unless(ret == 0); 27553a5a1b3Sopenharmony_ci 27653a5a1b3Sopenharmony_ci check_queue_invariants(bq); 27753a5a1b3Sopenharmony_ci 27853a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, -6, 0, true); 27953a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk3); 28053a5a1b3Sopenharmony_ci fail_unless(ret == 0); 28153a5a1b3Sopenharmony_ci 28253a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, -2, 0, true); 28353a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk1); 28453a5a1b3Sopenharmony_ci fail_unless(ret == 0); 28553a5a1b3Sopenharmony_ci 28653a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, -10, 0, true); 28753a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk4); 28853a5a1b3Sopenharmony_ci fail_unless(ret == 0); 28953a5a1b3Sopenharmony_ci 29053a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, 10, 0, true); 29153a5a1b3Sopenharmony_ci 29253a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk1); 29353a5a1b3Sopenharmony_ci fail_unless(ret == 0); 29453a5a1b3Sopenharmony_ci 29553a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, -6, 0, true); 29653a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk2); 29753a5a1b3Sopenharmony_ci fail_unless(ret == 0); 29853a5a1b3Sopenharmony_ci 29953a5a1b3Sopenharmony_ci /* Test splitting */ 30053a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, -12, 0, true); 30153a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk1); 30253a5a1b3Sopenharmony_ci fail_unless(ret == 0); 30353a5a1b3Sopenharmony_ci 30453a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, 20, 0, true); 30553a5a1b3Sopenharmony_ci 30653a5a1b3Sopenharmony_ci /* Test merging */ 30753a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk3); 30853a5a1b3Sopenharmony_ci fail_unless(ret == 0); 30953a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, -2, 0, true); 31053a5a1b3Sopenharmony_ci 31153a5a1b3Sopenharmony_ci chunk3.index += 2; 31253a5a1b3Sopenharmony_ci chunk3.length -= 2; 31353a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk3); 31453a5a1b3Sopenharmony_ci fail_unless(ret == 0); 31553a5a1b3Sopenharmony_ci 31653a5a1b3Sopenharmony_ci pa_memblockq_seek(bq, 30, PA_SEEK_RELATIVE, true); 31753a5a1b3Sopenharmony_ci 31853a5a1b3Sopenharmony_ci dump(bq, 0); 31953a5a1b3Sopenharmony_ci 32053a5a1b3Sopenharmony_ci pa_memblockq_rewind(bq, 52); 32153a5a1b3Sopenharmony_ci 32253a5a1b3Sopenharmony_ci dump(bq, 1); 32353a5a1b3Sopenharmony_ci 32453a5a1b3Sopenharmony_ci check_queue_invariants(bq); 32553a5a1b3Sopenharmony_ci 32653a5a1b3Sopenharmony_ci pa_memblockq_free(bq); 32753a5a1b3Sopenharmony_ci pa_memblock_unref(silence.memblock); 32853a5a1b3Sopenharmony_ci pa_memblock_unref(chunk1.memblock); 32953a5a1b3Sopenharmony_ci pa_memblock_unref(chunk2.memblock); 33053a5a1b3Sopenharmony_ci pa_memblock_unref(chunk3.memblock); 33153a5a1b3Sopenharmony_ci pa_memblock_unref(chunk4.memblock); 33253a5a1b3Sopenharmony_ci 33353a5a1b3Sopenharmony_ci pa_mempool_unref(p); 33453a5a1b3Sopenharmony_ci} 33553a5a1b3Sopenharmony_ciEND_TEST 33653a5a1b3Sopenharmony_ci 33753a5a1b3Sopenharmony_ciSTART_TEST (memblockq_test_length_changes) { 33853a5a1b3Sopenharmony_ci pa_mempool *p; 33953a5a1b3Sopenharmony_ci pa_memblockq *bq; 34053a5a1b3Sopenharmony_ci pa_memchunk silence, data; 34153a5a1b3Sopenharmony_ci pa_sample_spec ss = { 34253a5a1b3Sopenharmony_ci .format = PA_SAMPLE_S32BE, 34353a5a1b3Sopenharmony_ci .rate = 48000, 34453a5a1b3Sopenharmony_ci .channels = 1 34553a5a1b3Sopenharmony_ci }; 34653a5a1b3Sopenharmony_ci int64_t idx = 0; 34753a5a1b3Sopenharmony_ci size_t maxlength = 60; 34853a5a1b3Sopenharmony_ci size_t tlength = 40; 34953a5a1b3Sopenharmony_ci size_t prebuf = 16; 35053a5a1b3Sopenharmony_ci size_t minreq = 20; 35153a5a1b3Sopenharmony_ci size_t maxrewind = 40; 35253a5a1b3Sopenharmony_ci 35353a5a1b3Sopenharmony_ci p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true); 35453a5a1b3Sopenharmony_ci ck_assert_ptr_ne(p, NULL); 35553a5a1b3Sopenharmony_ci 35653a5a1b3Sopenharmony_ci silence = memchunk_from_str(p, "____"); 35753a5a1b3Sopenharmony_ci 35853a5a1b3Sopenharmony_ci bq = pa_memblockq_new("test memblockq", idx, maxlength, tlength, &ss, prebuf, minreq, maxrewind, &silence); 35953a5a1b3Sopenharmony_ci fail_unless(bq != NULL); 36053a5a1b3Sopenharmony_ci 36153a5a1b3Sopenharmony_ci data = memchunk_from_str(p, "12345678"); 36253a5a1b3Sopenharmony_ci 36353a5a1b3Sopenharmony_ci /* insert some data */ 36453a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_push(bq, &data), 0); 36553a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_push(bq, &data), 0); 36653a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_push(bq, &data), 0); 36753a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_push(bq, &data), 0); 36853a5a1b3Sopenharmony_ci 36953a5a1b3Sopenharmony_ci /* check state */ 37053a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_get_length(bq), 32); 37153a5a1b3Sopenharmony_ci 37253a5a1b3Sopenharmony_ci /* adjust maximum length 37353a5a1b3Sopenharmony_ci * This might modify tlength, prebuf, minreq, too. */ 37453a5a1b3Sopenharmony_ci pa_memblockq_set_maxlength(bq, maxlength/2); 37553a5a1b3Sopenharmony_ci check_queue_invariants(bq); 37653a5a1b3Sopenharmony_ci 37753a5a1b3Sopenharmony_ci /* adjust target length 37853a5a1b3Sopenharmony_ci * This might modify minreq, too. */ 37953a5a1b3Sopenharmony_ci pa_memblockq_set_tlength(bq, tlength/2); 38053a5a1b3Sopenharmony_ci check_queue_invariants(bq); 38153a5a1b3Sopenharmony_ci 38253a5a1b3Sopenharmony_ci /* adjust minimum requested length 38353a5a1b3Sopenharmony_ci * This might modify prebuf, too. */ 38453a5a1b3Sopenharmony_ci pa_memblockq_set_minreq(bq, minreq/2); 38553a5a1b3Sopenharmony_ci check_queue_invariants(bq); 38653a5a1b3Sopenharmony_ci 38753a5a1b3Sopenharmony_ci /* adjust prebuffer length */ 38853a5a1b3Sopenharmony_ci pa_memblockq_set_prebuf(bq, prebuf/2); 38953a5a1b3Sopenharmony_ci check_queue_invariants(bq); 39053a5a1b3Sopenharmony_ci 39153a5a1b3Sopenharmony_ci /* cleanup */ 39253a5a1b3Sopenharmony_ci pa_memblockq_free(bq); 39353a5a1b3Sopenharmony_ci pa_memblock_unref(silence.memblock); 39453a5a1b3Sopenharmony_ci pa_memblock_unref(data.memblock); 39553a5a1b3Sopenharmony_ci pa_mempool_unref(p); 39653a5a1b3Sopenharmony_ci} 39753a5a1b3Sopenharmony_ciEND_TEST 39853a5a1b3Sopenharmony_ci 39953a5a1b3Sopenharmony_ciSTART_TEST (memblockq_test_pop_missing) { 40053a5a1b3Sopenharmony_ci pa_mempool *p; 40153a5a1b3Sopenharmony_ci pa_memblockq *bq; 40253a5a1b3Sopenharmony_ci pa_memchunk silence, data, chunk; 40353a5a1b3Sopenharmony_ci pa_sample_spec ss = { 40453a5a1b3Sopenharmony_ci .format = PA_SAMPLE_S16BE, 40553a5a1b3Sopenharmony_ci .rate = 48000, 40653a5a1b3Sopenharmony_ci .channels = 1 40753a5a1b3Sopenharmony_ci }; 40853a5a1b3Sopenharmony_ci int64_t idx = 0; 40953a5a1b3Sopenharmony_ci size_t maxlength = 200; 41053a5a1b3Sopenharmony_ci size_t tlength = 100; 41153a5a1b3Sopenharmony_ci size_t prebuf = 0; 41253a5a1b3Sopenharmony_ci size_t minreq = 80; 41353a5a1b3Sopenharmony_ci size_t maxrewind = 0; 41453a5a1b3Sopenharmony_ci 41553a5a1b3Sopenharmony_ci p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true); 41653a5a1b3Sopenharmony_ci ck_assert_ptr_ne(p, NULL); 41753a5a1b3Sopenharmony_ci 41853a5a1b3Sopenharmony_ci silence = memchunk_from_str(p, "____"); 41953a5a1b3Sopenharmony_ci data = memchunk_from_str(p, "1234567890"); 42053a5a1b3Sopenharmony_ci 42153a5a1b3Sopenharmony_ci bq = pa_memblockq_new("test memblockq", idx, maxlength, tlength, &ss, prebuf, minreq, maxrewind, &silence); 42253a5a1b3Sopenharmony_ci fail_unless(bq != NULL); 42353a5a1b3Sopenharmony_ci 42453a5a1b3Sopenharmony_ci /* The following equation regarding the internal variables of a memblockq 42553a5a1b3Sopenharmony_ci * is always true: 42653a5a1b3Sopenharmony_ci * 42753a5a1b3Sopenharmony_ci * length + missing + requested = tlength 42853a5a1b3Sopenharmony_ci * 42953a5a1b3Sopenharmony_ci * "length" is the current memblockq length (write index minus read index) 43053a5a1b3Sopenharmony_ci * and "tlength" is the target length. The intuitive meaning of "missing" 43153a5a1b3Sopenharmony_ci * would be the difference between tlength and length, but actually 43253a5a1b3Sopenharmony_ci * "missing" and "requested" together constitute the amount that is missing 43353a5a1b3Sopenharmony_ci * from the queue. Writing to the queue decrements "requested" and reading 43453a5a1b3Sopenharmony_ci * from the queue increments "missing". pa_memblockq_pop_missing() resets 43553a5a1b3Sopenharmony_ci * "missing" to zero, returns the old "missing" value and adds the 43653a5a1b3Sopenharmony_ci * equivalent amount to "requested". 43753a5a1b3Sopenharmony_ci * 43853a5a1b3Sopenharmony_ci * This test has comments between each step documenting the assumed state 43953a5a1b3Sopenharmony_ci * of those internal variables. */ 44053a5a1b3Sopenharmony_ci 44153a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 44253a5a1b3Sopenharmony_ci * 0 + 100 + 0 = 100 */ 44353a5a1b3Sopenharmony_ci 44453a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), tlength); 44553a5a1b3Sopenharmony_ci 44653a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 44753a5a1b3Sopenharmony_ci * 0 + 0 + 100 = 100 */ 44853a5a1b3Sopenharmony_ci 44953a5a1b3Sopenharmony_ci for (int i = 0; i != 2; ++i) 45053a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_push(bq, &data), 0); 45153a5a1b3Sopenharmony_ci check_queue_invariants(bq); 45253a5a1b3Sopenharmony_ci 45353a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 45453a5a1b3Sopenharmony_ci * 20 + 0 + 80 = 100 */ 45553a5a1b3Sopenharmony_ci 45653a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), 0); 45753a5a1b3Sopenharmony_ci 45853a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 45953a5a1b3Sopenharmony_ci * 20 + 0 + 80 = 100 */ 46053a5a1b3Sopenharmony_ci 46153a5a1b3Sopenharmony_ci for (int i = 0; i != 8; ++i) 46253a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_push(bq, &data), 0); 46353a5a1b3Sopenharmony_ci check_queue_invariants(bq); 46453a5a1b3Sopenharmony_ci 46553a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 46653a5a1b3Sopenharmony_ci * 100 + 0 + 0 = 100 */ 46753a5a1b3Sopenharmony_ci 46853a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), 0); 46953a5a1b3Sopenharmony_ci 47053a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 47153a5a1b3Sopenharmony_ci * 100 + 0 + 0 = 100 */ 47253a5a1b3Sopenharmony_ci 47353a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_peek_fixed_size(bq, 40, &chunk), 0); 47453a5a1b3Sopenharmony_ci pa_memblockq_drop(bq, 40); 47553a5a1b3Sopenharmony_ci ck_assert_int_eq(chunk.length - chunk.index, 40); 47653a5a1b3Sopenharmony_ci pa_memblock_unref(chunk.memblock); 47753a5a1b3Sopenharmony_ci check_queue_invariants(bq); 47853a5a1b3Sopenharmony_ci 47953a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 48053a5a1b3Sopenharmony_ci * 60 + 40 + 0 = 100 */ 48153a5a1b3Sopenharmony_ci 48253a5a1b3Sopenharmony_ci /* 40 bytes are missing, but that's less than minreq, so 0 is reported */ 48353a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), 0); 48453a5a1b3Sopenharmony_ci 48553a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 48653a5a1b3Sopenharmony_ci * 60 + 40 + 0 = 100 */ 48753a5a1b3Sopenharmony_ci 48853a5a1b3Sopenharmony_ci /* Now we push 30 bytes even though it was not requested, so the requested 48953a5a1b3Sopenharmony_ci * counter goes negative! */ 49053a5a1b3Sopenharmony_ci for (int i = 0; i != 3; ++i) 49153a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_push(bq, &data), 0); 49253a5a1b3Sopenharmony_ci check_queue_invariants(bq); 49353a5a1b3Sopenharmony_ci 49453a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 49553a5a1b3Sopenharmony_ci * 90 + 40 + -30 = 100 */ 49653a5a1b3Sopenharmony_ci 49753a5a1b3Sopenharmony_ci /* missing < minreq, so nothing is reported missing. */ 49853a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), 0); 49953a5a1b3Sopenharmony_ci 50053a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 50153a5a1b3Sopenharmony_ci * 90 + 40 + -30 = 100 */ 50253a5a1b3Sopenharmony_ci 50353a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_peek_fixed_size(bq, 20, &chunk), 0); 50453a5a1b3Sopenharmony_ci pa_memblockq_drop(bq, 20); 50553a5a1b3Sopenharmony_ci ck_assert_int_eq(chunk.length - chunk.index, 20); 50653a5a1b3Sopenharmony_ci pa_memblock_unref(chunk.memblock); 50753a5a1b3Sopenharmony_ci check_queue_invariants(bq); 50853a5a1b3Sopenharmony_ci 50953a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 51053a5a1b3Sopenharmony_ci * 70 + 60 + -30 = 100 */ 51153a5a1b3Sopenharmony_ci 51253a5a1b3Sopenharmony_ci /* missing < minreq, so nothing is reported missing. */ 51353a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), 0); 51453a5a1b3Sopenharmony_ci 51553a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 51653a5a1b3Sopenharmony_ci * 70 + 60 + -30 = 100 */ 51753a5a1b3Sopenharmony_ci 51853a5a1b3Sopenharmony_ci /* We push more data again even though it was not requested, so the 51953a5a1b3Sopenharmony_ci * requested counter goes further into the negative range. */ 52053a5a1b3Sopenharmony_ci for (int i = 0; i != 5; ++i) 52153a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_push(bq, &data), 0); 52253a5a1b3Sopenharmony_ci check_queue_invariants(bq); 52353a5a1b3Sopenharmony_ci 52453a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 52553a5a1b3Sopenharmony_ci * 120 + 60 + -80 = 100 */ 52653a5a1b3Sopenharmony_ci 52753a5a1b3Sopenharmony_ci /* missing < minreq, so nothing is reported missing. */ 52853a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), 0); 52953a5a1b3Sopenharmony_ci 53053a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 53153a5a1b3Sopenharmony_ci * 120 + 60 + -80 = 100 */ 53253a5a1b3Sopenharmony_ci 53353a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_peek_fixed_size(bq, 20, &chunk), 0); 53453a5a1b3Sopenharmony_ci pa_memblockq_drop(bq, 20); 53553a5a1b3Sopenharmony_ci ck_assert_int_eq(chunk.length - chunk.index, 20); 53653a5a1b3Sopenharmony_ci pa_memblock_unref(chunk.memblock); 53753a5a1b3Sopenharmony_ci check_queue_invariants(bq); 53853a5a1b3Sopenharmony_ci 53953a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 54053a5a1b3Sopenharmony_ci * 100 + 80 + -80 = 100 */ 54153a5a1b3Sopenharmony_ci 54253a5a1b3Sopenharmony_ci /* missing has now reached the minreq threshold */ 54353a5a1b3Sopenharmony_ci ck_assert_int_eq(pa_memblockq_pop_missing(bq), 80); 54453a5a1b3Sopenharmony_ci 54553a5a1b3Sopenharmony_ci /* length + missing + requested = tlength 54653a5a1b3Sopenharmony_ci * 100 + 0 + 0 = 100 */ 54753a5a1b3Sopenharmony_ci 54853a5a1b3Sopenharmony_ci /* cleanup */ 54953a5a1b3Sopenharmony_ci pa_memblockq_free(bq); 55053a5a1b3Sopenharmony_ci pa_memblock_unref(silence.memblock); 55153a5a1b3Sopenharmony_ci pa_memblock_unref(data.memblock); 55253a5a1b3Sopenharmony_ci pa_mempool_unref(p); 55353a5a1b3Sopenharmony_ci} 55453a5a1b3Sopenharmony_ciEND_TEST 55553a5a1b3Sopenharmony_ci 55653a5a1b3Sopenharmony_ciSTART_TEST (memblockq_test_tlength_change) { 55753a5a1b3Sopenharmony_ci int ret; 55853a5a1b3Sopenharmony_ci size_t missing; 55953a5a1b3Sopenharmony_ci 56053a5a1b3Sopenharmony_ci pa_mempool *p; 56153a5a1b3Sopenharmony_ci pa_memblockq *bq; 56253a5a1b3Sopenharmony_ci pa_memchunk chunk; 56353a5a1b3Sopenharmony_ci char buffer[2048]; 56453a5a1b3Sopenharmony_ci pa_sample_spec ss = { 56553a5a1b3Sopenharmony_ci .format = PA_SAMPLE_S16LE, 56653a5a1b3Sopenharmony_ci .rate = 48000, 56753a5a1b3Sopenharmony_ci .channels = 1 56853a5a1b3Sopenharmony_ci }; 56953a5a1b3Sopenharmony_ci 57053a5a1b3Sopenharmony_ci pa_log_set_level(PA_LOG_DEBUG); 57153a5a1b3Sopenharmony_ci 57253a5a1b3Sopenharmony_ci bq = pa_memblockq_new("test memblockq", 0, 4096, 2048, &ss, 0, 512, 512, NULL); 57353a5a1b3Sopenharmony_ci fail_unless(bq != NULL); 57453a5a1b3Sopenharmony_ci 57553a5a1b3Sopenharmony_ci /* Empty buffer, so expect tlength */ 57653a5a1b3Sopenharmony_ci missing = pa_memblockq_pop_missing(bq); 57753a5a1b3Sopenharmony_ci fail_unless(missing == 2048); 57853a5a1b3Sopenharmony_ci 57953a5a1b3Sopenharmony_ci /* Everything requested, so should be satisfied */ 58053a5a1b3Sopenharmony_ci missing = pa_memblockq_pop_missing(bq); 58153a5a1b3Sopenharmony_ci fail_unless(missing == 0); 58253a5a1b3Sopenharmony_ci 58353a5a1b3Sopenharmony_ci p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true); 58453a5a1b3Sopenharmony_ci 58553a5a1b3Sopenharmony_ci chunk.memblock = pa_memblock_new_fixed(p, buffer, sizeof(buffer), 1); 58653a5a1b3Sopenharmony_ci fail_unless(chunk.memblock != NULL); 58753a5a1b3Sopenharmony_ci 58853a5a1b3Sopenharmony_ci chunk.index = 0; 58953a5a1b3Sopenharmony_ci chunk.length = sizeof(buffer); 59053a5a1b3Sopenharmony_ci 59153a5a1b3Sopenharmony_ci /* Fill buffer (i.e. satisfy earlier request) */ 59253a5a1b3Sopenharmony_ci ret = pa_memblockq_push(bq, &chunk); 59353a5a1b3Sopenharmony_ci fail_unless(ret == 0); 59453a5a1b3Sopenharmony_ci 59553a5a1b3Sopenharmony_ci /* Should still be happy */ 59653a5a1b3Sopenharmony_ci missing = pa_memblockq_pop_missing(bq); 59753a5a1b3Sopenharmony_ci fail_unless(missing == 0); 59853a5a1b3Sopenharmony_ci 59953a5a1b3Sopenharmony_ci /* Check that we don't request less than minreq */ 60053a5a1b3Sopenharmony_ci pa_memblockq_drop(bq, 400); 60153a5a1b3Sopenharmony_ci missing = pa_memblockq_pop_missing(bq); 60253a5a1b3Sopenharmony_ci ck_assert_int_eq(missing, 0); 60353a5a1b3Sopenharmony_ci 60453a5a1b3Sopenharmony_ci missing = pa_memblockq_pop_missing(bq); 60553a5a1b3Sopenharmony_ci fail_unless(missing == 0); 60653a5a1b3Sopenharmony_ci 60753a5a1b3Sopenharmony_ci /* Reduce tlength under what's dropped and under previous minreq */ 60853a5a1b3Sopenharmony_ci pa_memblockq_set_tlength(bq, 256); 60953a5a1b3Sopenharmony_ci pa_memblockq_set_minreq(bq, 64); 61053a5a1b3Sopenharmony_ci 61153a5a1b3Sopenharmony_ci /* We are now overbuffered and should not request more */ 61253a5a1b3Sopenharmony_ci missing = pa_memblockq_pop_missing(bq); 61353a5a1b3Sopenharmony_ci fail_unless(missing == 0); 61453a5a1b3Sopenharmony_ci 61553a5a1b3Sopenharmony_ci /* Drop more data so we are below tlength again, but just barely */ 61653a5a1b3Sopenharmony_ci pa_memblockq_drop(bq, 1400); 61753a5a1b3Sopenharmony_ci 61853a5a1b3Sopenharmony_ci /* Should still honour minreq */ 61953a5a1b3Sopenharmony_ci missing = pa_memblockq_pop_missing(bq); 62053a5a1b3Sopenharmony_ci fail_unless(missing == 0); 62153a5a1b3Sopenharmony_ci 62253a5a1b3Sopenharmony_ci /* Finally drop enough to fall below minreq */ 62353a5a1b3Sopenharmony_ci pa_memblockq_drop(bq, 80); 62453a5a1b3Sopenharmony_ci 62553a5a1b3Sopenharmony_ci /* And expect a request */ 62653a5a1b3Sopenharmony_ci missing = pa_memblockq_pop_missing(bq); 62753a5a1b3Sopenharmony_ci fail_unless(missing == 88); 62853a5a1b3Sopenharmony_ci 62953a5a1b3Sopenharmony_ci pa_memblockq_free(bq); 63053a5a1b3Sopenharmony_ci pa_memblock_unref(chunk.memblock); 63153a5a1b3Sopenharmony_ci pa_mempool_unref(p); 63253a5a1b3Sopenharmony_ci} 63353a5a1b3Sopenharmony_ciEND_TEST 63453a5a1b3Sopenharmony_ci 63553a5a1b3Sopenharmony_ci 63653a5a1b3Sopenharmony_ciint main(int argc, char *argv[]) { 63753a5a1b3Sopenharmony_ci int failed = 0; 63853a5a1b3Sopenharmony_ci Suite *s; 63953a5a1b3Sopenharmony_ci TCase *tc; 64053a5a1b3Sopenharmony_ci SRunner *sr; 64153a5a1b3Sopenharmony_ci 64253a5a1b3Sopenharmony_ci if (!getenv("MAKE_CHECK")) 64353a5a1b3Sopenharmony_ci pa_log_set_level(PA_LOG_DEBUG); 64453a5a1b3Sopenharmony_ci 64553a5a1b3Sopenharmony_ci s = suite_create("Memblock Queue"); 64653a5a1b3Sopenharmony_ci tc = tcase_create("memblockq"); 64753a5a1b3Sopenharmony_ci tcase_add_test(tc, memchunk_from_str_test); 64853a5a1b3Sopenharmony_ci tcase_add_test(tc, memblockq_test_initial_properties); 64953a5a1b3Sopenharmony_ci tcase_add_test(tc, memblockq_test); 65053a5a1b3Sopenharmony_ci tcase_add_test(tc, memblockq_test_length_changes); 65153a5a1b3Sopenharmony_ci tcase_add_test(tc, memblockq_test_pop_missing); 65253a5a1b3Sopenharmony_ci tcase_add_test(tc, memblockq_test_tlength_change); 65353a5a1b3Sopenharmony_ci suite_add_tcase(s, tc); 65453a5a1b3Sopenharmony_ci 65553a5a1b3Sopenharmony_ci sr = srunner_create(s); 65653a5a1b3Sopenharmony_ci srunner_run_all(sr, CK_NORMAL); 65753a5a1b3Sopenharmony_ci failed = srunner_ntests_failed(sr); 65853a5a1b3Sopenharmony_ci srunner_free(sr); 65953a5a1b3Sopenharmony_ci 66053a5a1b3Sopenharmony_ci return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 66153a5a1b3Sopenharmony_ci} 662