From: Slawomir Blauciak slawomir.blauciak@linux.intel.com
--- test/cmocka/Makefile.am | 25 +++ test/cmocka/src/audio/buffer/buffer_copy.c | 174 ++++++++++++++++++++ test/cmocka/src/audio/buffer/buffer_new.c | 69 ++++++++ test/cmocka/src/audio/buffer/buffer_wrap.c | 91 ++++++++++ test/cmocka/src/audio/buffer/buffer_write.c | 116 +++++++++++++ test/cmocka/src/audio/buffer/mock.c | 63 +++++++ 6 files changed, 538 insertions(+) create mode 100644 test/cmocka/src/audio/buffer/buffer_copy.c create mode 100644 test/cmocka/src/audio/buffer/buffer_new.c create mode 100644 test/cmocka/src/audio/buffer/buffer_wrap.c create mode 100644 test/cmocka/src/audio/buffer/buffer_write.c create mode 100644 test/cmocka/src/audio/buffer/mock.c
diff --git a/test/cmocka/Makefile.am b/test/cmocka/Makefile.am index ff1ef19..0437665 100644 --- a/test/cmocka/Makefile.am +++ b/test/cmocka/Makefile.am @@ -16,11 +16,36 @@ AM_CFLAGS += -I$(CMOCKA_PREFIX)/include AM_LDFLAGS += -L$(CMOCKA_PREFIX)/lib endif
+if BUILD_XTENSA +AM_CFLAGS += -I../../src/arch/xtensa/include +AM_CFLAGS += -I../../src/platform/apollolake/include +endif + +if BUILD_HOST +AM_CFLAGS += -I../../src/arch/host/include +endif + CFLAGS := $(filter-out -nostdlib,$(CFLAGS)) LDFLAGS := $(filter-out -nostdlib,$(LDFLAGS))
LDADD = -lcmocka
+check_PROGRAMS += buffer_new +buffer_new_SOURCES = src/audio/buffer/buffer_new.c src/audio/buffer/mock.c +buffer_new_LDADD = ../../src/audio/libaudio.a $(LDADD) + +check_PROGRAMS += buffer_write +buffer_write_SOURCES = src/audio/buffer/buffer_write.c src/audio/buffer/mock.c +buffer_write_LDADD = ../../src/audio/libaudio.a $(LDADD) + +check_PROGRAMS += buffer_wrap +buffer_wrap_SOURCES = src/audio/buffer/buffer_wrap.c src/audio/buffer/mock.c +buffer_wrap_LDADD = ../../src/audio/libaudio.a $(LDADD) + +check_PROGRAMS += buffer_copy +buffer_copy_SOURCES = src/audio/buffer/buffer_copy.c src/audio/buffer/mock.c +buffer_copy_LDADD = ../../src/audio/libaudio.a $(LDADD) + # list tests
check_PROGRAMS += list_init diff --git a/test/cmocka/src/audio/buffer/buffer_copy.c b/test/cmocka/src/audio/buffer/buffer_copy.c new file mode 100644 index 0000000..6a9dea3 --- /dev/null +++ b/test/cmocka/src/audio/buffer/buffer_copy.c @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Intel Corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * Author: Slawomir Blauciak slawomir.blauciak@linux.intel.com + */ + +#include <sof/audio/component.h> +#include <sof/audio/buffer.h> +#include <sof/ipc.h> + +#include <stdio.h> +#include <stdarg.h> +#include <stddef.h> +#include <setjmp.h> +#include <math.h> +#include <cmocka.h> + +static void test_audio_buffer_copy_underrun(void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 256 + }; + + struct comp_buffer *src = buffer_new(&test_buf_desc); + struct comp_buffer *snk = buffer_new(&test_buf_desc); + + assert_non_null(src); + assert_non_null(snk); + + comp_update_buffer_produce(src, 10); + + assert_int_equal(src->avail, 10); + assert_int_equal(comp_buffer_can_copy_bytes(src, snk, 16), -1); + + buffer_free(src); + buffer_free(snk); +} + +static void test_audio_buffer_copy_overrun(void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 256 + }; + + struct comp_buffer *src = buffer_new(&test_buf_desc); + struct comp_buffer *snk = buffer_new(&test_buf_desc); + + assert_non_null(src); + assert_non_null(snk); + + comp_update_buffer_produce(src, 16); + comp_update_buffer_produce(snk, 246); + + assert_int_equal(src->avail, 16); + assert_int_equal(snk->free, 10); + assert_int_equal(comp_buffer_can_copy_bytes(src, snk, 16), 1); + + buffer_free(src); + buffer_free(snk); +} + +static void test_audio_buffer_copy_success(void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 256 + }; + + struct comp_buffer *src = buffer_new(&test_buf_desc); + struct comp_buffer *snk = buffer_new(&test_buf_desc); + + assert_non_null(src); + assert_non_null(snk); + + comp_update_buffer_produce(src, 10); + + assert_int_equal(src->avail, 10); + assert_int_equal(comp_buffer_can_copy_bytes(src, snk, 0), 0); + + buffer_free(src); + buffer_free(snk); +} + +static void test_audio_buffer_copy_fit_space_constraint(void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 256 + }; + + struct comp_buffer *src = buffer_new(&test_buf_desc); + struct comp_buffer *snk = buffer_new(&test_buf_desc); + + assert_non_null(src); + assert_non_null(snk); + + comp_update_buffer_produce(src, 16); + comp_update_buffer_produce(snk, 246); + + assert_int_equal(src->avail, 16); + assert_int_equal(snk->free, 10); + assert_int_equal(comp_buffer_get_copy_bytes(src, snk), 10); + + buffer_free(src); + buffer_free(snk); +} + +static void test_audio_buffer_copy_fit_no_space_constraint(void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 256 + }; + + struct comp_buffer *src = buffer_new(&test_buf_desc); + struct comp_buffer *snk = buffer_new(&test_buf_desc); + + assert_non_null(src); + assert_non_null(snk); + + comp_update_buffer_produce(src, 16); + + assert_int_equal(src->avail, 16); + assert_int_equal(comp_buffer_get_copy_bytes(src, snk), 16); + + buffer_free(src); + buffer_free(snk); +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_audio_buffer_copy_underrun), + cmocka_unit_test(test_audio_buffer_copy_overrun), + cmocka_unit_test(test_audio_buffer_copy_success), + cmocka_unit_test(test_audio_buffer_copy_fit_space_constraint), + cmocka_unit_test(test_audio_buffer_copy_fit_no_space_constraint) + }; + + cmocka_set_message_output(CM_OUTPUT_TAP); + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/test/cmocka/src/audio/buffer/buffer_new.c b/test/cmocka/src/audio/buffer/buffer_new.c new file mode 100644 index 0000000..4c5cb5b --- /dev/null +++ b/test/cmocka/src/audio/buffer/buffer_new.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Intel Corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * Author: Slawomir Blauciak slawomir.blauciak@linux.intel.com + */ + +#include <sof/audio/component.h> +#include <sof/audio/buffer.h> +#include <sof/ipc.h> + +#include <stdio.h> +#include <stdarg.h> +#include <stddef.h> +#include <setjmp.h> +#include <math.h> +#include <cmocka.h> + +static void test_audio_buffer_new(void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 256 + }; + + struct comp_buffer *buf = buffer_new(&test_buf_desc); + + assert_non_null(buf); + assert_int_equal(buf->avail, 0); + assert_int_equal(buf->free, 256); + assert_ptr_equal(buf->w_ptr, buf->r_ptr); + + buffer_free(buf); +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_audio_buffer_new) + }; + + cmocka_set_message_output(CM_OUTPUT_TAP); + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/test/cmocka/src/audio/buffer/buffer_wrap.c b/test/cmocka/src/audio/buffer/buffer_wrap.c new file mode 100644 index 0000000..aae5b03 --- /dev/null +++ b/test/cmocka/src/audio/buffer/buffer_wrap.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Intel Corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * Author: Slawomir Blauciak slawomir.blauciak@linux.intel.com + */ + +#include <sof/audio/component.h> +#include <sof/audio/buffer.h> +#include <sof/ipc.h> + +#include <stdio.h> +#include <stdarg.h> +#include <stddef.h> +#include <setjmp.h> +#include <math.h> +#include <cmocka.h> + +static void test_audio_buffer_write_fill_10_bytes_and_write_5(void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 10 + }; + + struct comp_buffer *buf = buffer_new(&test_buf_desc); + + assert_non_null(buf); + assert_int_equal(buf->avail, 0); + assert_int_equal(buf->free, 10); + assert_ptr_equal(buf->w_ptr, buf->r_ptr); + + uint8_t bytes[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + + memcpy(buf->w_ptr, &bytes, 10); + comp_update_buffer_produce(buf, 10); + + assert_int_equal(buf->avail, 10); + assert_int_equal(buf->free, 0); + assert_ptr_equal(buf->w_ptr, buf->r_ptr); + + uint8_t more_bytes[5] = {10, 11, 12, 13, 14}; + + memcpy(buf->w_ptr, &more_bytes, 5); + comp_update_buffer_produce(buf, 5); + + uint8_t ref[10] = {10, 11, 12, 13, 14, 5, 6, 7, 8, 9}; + + assert_int_equal(buf->avail, 5); + assert_int_equal(buf->free, 5); + assert_ptr_equal(buf->w_ptr, buf->r_ptr + 5); + assert_int_equal(memcmp(buf->r_ptr, &ref, 10), 0); + + buffer_free(buf); +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test + (test_audio_buffer_write_fill_10_bytes_and_write_5) + }; + + cmocka_set_message_output(CM_OUTPUT_TAP); + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/test/cmocka/src/audio/buffer/buffer_write.c b/test/cmocka/src/audio/buffer/buffer_write.c new file mode 100644 index 0000000..47e45c7 --- /dev/null +++ b/test/cmocka/src/audio/buffer/buffer_write.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Intel Corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * Author: Slawomir Blauciak slawomir.blauciak@linux.intel.com + */ + +#include <sof/audio/component.h> +#include <sof/audio/buffer.h> +#include <sof/ipc.h> + +#include <stdio.h> +#include <stdarg.h> +#include <stddef.h> +#include <setjmp.h> +#include <math.h> +#include <cmocka.h> + +static void test_audio_buffer_write_10_bytes_out_of_256_and_read_back + (void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 256 + }; + + struct comp_buffer *buf = buffer_new(&test_buf_desc); + + assert_non_null(buf); + assert_int_equal(buf->avail, 0); + assert_int_equal(buf->free, 256); + assert_ptr_equal(buf->w_ptr, buf->r_ptr); + + uint8_t bytes[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + + memcpy(buf->w_ptr, &bytes, 10); + comp_update_buffer_produce(buf, 10); + + assert_int_equal(buf->avail, 10); + assert_int_equal(buf->free, 246); + assert_ptr_equal(buf->w_ptr, buf->r_ptr + 10); + + assert_int_equal(memcmp(buf->r_ptr, &bytes, 10), 0); + + comp_update_buffer_consume(buf, 10); + + assert_int_equal(buf->avail, 0); + assert_int_equal(buf->free, 256); + assert_ptr_equal(buf->w_ptr, buf->r_ptr); + + buffer_free(buf); +} + +static void test_audio_buffer_fill_10_bytes(void **state) +{ + (void)state; + + struct sof_ipc_buffer test_buf_desc = { + .size = 10 + }; + + struct comp_buffer *buf = buffer_new(&test_buf_desc); + + assert_non_null(buf); + assert_int_equal(buf->avail, 0); + assert_int_equal(buf->free, 10); + assert_ptr_equal(buf->w_ptr, buf->r_ptr); + + uint8_t bytes[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + + memcpy(buf->w_ptr, &bytes, 10); + comp_update_buffer_produce(buf, 10); + + assert_int_equal(buf->avail, 10); + assert_int_equal(buf->free, 0); + assert_ptr_equal(buf->w_ptr, buf->r_ptr); + + buffer_free(buf); +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test + (test_audio_buffer_write_10_bytes_out_of_256_and_read_back), + cmocka_unit_test(test_audio_buffer_fill_10_bytes) + }; + + cmocka_set_message_output(CM_OUTPUT_TAP); + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/test/cmocka/src/audio/buffer/mock.c b/test/cmocka/src/audio/buffer/mock.c new file mode 100644 index 0000000..e35d34e --- /dev/null +++ b/test/cmocka/src/audio/buffer/mock.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Intel Corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * Author: Slawomir Blauciak slawomir.blauciak@linux.intel.com + */ + +#include <stdint.h> +#include <stdlib.h> + +void _trace_event(uint32_t e) +{ + (void)e; +} + +void _trace_event_mbox_atomic(uint32_t e) +{ + (void)e; +} + +void *rzalloc(int zone, uint32_t caps, size_t bytes) +{ + (void)zone; + (void)caps; + + return malloc(bytes); +} + +void *rballoc(int zone, uint32_t caps, size_t bytes) +{ + (void)zone; + (void)caps; + + return malloc(bytes); +} + +void rfree(void *ptr) +{ + free(ptr); +}