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