test: lib/bzero: Added unit tests for lib/bzero.

Signed-off-by: Michal Jerzy Wierzbicki <michalx.wierzbicki@linux.intel.com>
diff --git a/test/cmocka/Makefile.am b/test/cmocka/Makefile.am
index ea917ab..397c06c 100644
--- a/test/cmocka/Makefile.am
+++ b/test/cmocka/Makefile.am
@@ -55,7 +55,12 @@
 rstrcmp_SOURCES = src/lib/lib/rstrcmp.c
 rstrcmp_LDADD = ../../src/lib/libcore.a $(LDADD)
 
-#pipeline tests
+check_PROGRAMS += bzero
+bzero_SOURCES = src/lib/lib/bzero.c
+bzero_LDADD = ../../src/lib/libcore.a $(LDADD)
+
+# pipeline tests
+
 check_PROGRAMS += pipeline_new
 pipeline_new_SOURCES = ../../src/audio/pipeline.c  src/audio/pipeline/pipeline_new.c src/audio/pipeline/pipeline_mocks.c src/audio/pipeline/pipeline_mocks_rzalloc.c
 
diff --git a/test/cmocka/src/lib/lib/bzero.c b/test/cmocka/src/lib/lib/bzero.c
new file mode 100644
index 0000000..facd338
--- /dev/null
+++ b/test/cmocka/src/lib/lib/bzero.c
@@ -0,0 +1,200 @@
+/*
+ * 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: Michal Jerzy Wierzbicki <michalx.wierzbicki@linux.intel.com>
+ */
+
+#include <sof/alloc.h>
+
+#include <stdarg.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+struct test_data_t {
+	size_t len;
+	char str[0];
+};
+
+struct test_data_zero_middle_t {
+	int beg;
+	int end;
+	int len;
+};
+
+static struct test_data_t *test_data;
+static struct test_data_zero_middle_t *test_data_zero_middle;
+static const char default_char = 'a';
+
+static void reset_test_arr(void)
+{
+	int i;
+
+	for (i = 0; i < test_data->len-1; ++i)
+		test_data->str[i] = default_char;
+	test_data->str[test_data->len] = 0;
+}
+
+static int setup(void **state)
+{
+	const int len = 6;
+
+	test_data = malloc(sizeof(struct test_data_t)
+		+ len * sizeof(test_data[0]));
+	test_data->len = len;
+
+	const int zero_beg = 2;
+	const int zero_end = 4;
+	// aa000aa... - pattern of zeroing
+
+	test_data_zero_middle = malloc(sizeof(struct test_data_zero_middle_t));
+	test_data_zero_middle->beg = zero_beg;
+	test_data_zero_middle->end = zero_end;
+	test_data_zero_middle->len = zero_end - zero_beg;
+
+	return 0;
+}
+
+static int teardown(void **state)
+{
+	free(test_data);
+
+	return 0;
+}
+
+static int check_arr(char *arr, size_t n, char should_be)
+{
+	size_t i;
+
+	for (i = 0; i < n; ++i)
+		if (arr[i] != should_be)
+			return i;
+	return -1;
+}
+
+static int check_test_arr(char should_be)
+{
+	return check_arr(test_data->str, test_data->len-1, should_be);
+}
+
+static int check_test_arr_with_offset(
+	int offset_beg, int offset_end, char should_be)
+{
+	return check_arr(
+		test_data->str+offset_beg,
+		test_data->len+offset_end-1,
+		should_be
+	);
+}
+
+/* Tests*/
+static void test_lib_lib_bzero_check_test_arr(void **state)
+{
+	reset_test_arr();
+
+	(void) state;
+
+	assert_int_equal(check_test_arr(default_char), -1);
+}
+
+static void test_lib_lib_bzero_check_test_arr_with_offset(void **state)
+{
+	const int it = 3;
+
+	reset_test_arr();
+	test_data->str[it] = default_char+1;
+
+	(void) state;
+
+	assert_int_equal(check_test_arr(default_char), it);
+}
+
+static void test_lib_lib_bzero_char_zero_none(void **state)
+{
+	reset_test_arr();
+
+	(void) state;
+
+	bzero(test_data->str, 0);
+	assert_int_equal(check_test_arr(default_char), -1);
+}
+
+static void test_lib_lib_bzero_char_zero_all(void **state)
+{
+	reset_test_arr();
+
+	(void) state;
+
+	bzero(test_data->str, test_data->len);
+	assert_int_equal(check_test_arr(0), -1);
+}
+
+static void test_lib_lib_bzero_char_zero_middle_beg(void **state)
+{
+	reset_test_arr();
+
+	(void) state;
+
+	bzero(test_data->str+test_data_zero_middle->beg,
+		test_data_zero_middle->len);
+	assert_int_equal(check_test_arr(default_char),
+		test_data_zero_middle->beg);
+}
+
+static void test_lib_lib_bzero_char_zero_middle_mid(void **state)
+{
+	(void) state;
+
+	assert_int_equal(check_test_arr_with_offset(
+		test_data_zero_middle->beg, -test_data_zero_middle->beg,
+		0), test_data_zero_middle->len);
+}
+
+static void test_lib_lib_bzero_char_zero_middle_end(void **state)
+{
+	(void) state;
+
+	assert_int_equal(check_test_arr_with_offset(
+		test_data_zero_middle->end, -test_data_zero_middle->end,
+		default_char), -1);
+}
+
+int main(void)
+{
+	const struct CMUnitTest tests[] = {
+		cmocka_unit_test(test_lib_lib_bzero_check_test_arr),
+		cmocka_unit_test(test_lib_lib_bzero_check_test_arr_with_offset),
+		cmocka_unit_test(test_lib_lib_bzero_char_zero_none),
+		cmocka_unit_test(test_lib_lib_bzero_char_zero_all),
+		cmocka_unit_test(test_lib_lib_bzero_char_zero_middle_beg),
+		cmocka_unit_test(test_lib_lib_bzero_char_zero_middle_mid),
+		cmocka_unit_test(test_lib_lib_bzero_char_zero_middle_end),
+	};
+
+	cmocka_set_message_output(CM_OUTPUT_TAP);
+
+	return cmocka_run_group_tests(tests, setup, teardown);
+}