tests: add zephyr alerts test case
the commit cover alert send and receive with 4 types -
DEFAULT, IGNORE, PENDING, CONSUMED which across thread and isr
context.
Change-Id: I41dae9ba2dc980bcd768f1220f55b5492bc8ae37
Signed-off-by: jing wang <jing.j.wang@intel.com>
diff --git a/tests/kernel/alert/test_alert_api/Makefile b/tests/kernel/alert/test_alert_api/Makefile
new file mode 100644
index 0000000..4de50f9
--- /dev/null
+++ b/tests/kernel/alert/test_alert_api/Makefile
@@ -0,0 +1,4 @@
+BOARD ?= qemu_x86
+CONF_FILE = prj.conf
+
+include ${ZEPHYR_BASE}/Makefile.inc
diff --git a/tests/kernel/alert/test_alert_api/prj.conf b/tests/kernel/alert/test_alert_api/prj.conf
new file mode 100644
index 0000000..9a75212
--- /dev/null
+++ b/tests/kernel/alert/test_alert_api/prj.conf
@@ -0,0 +1,2 @@
+CONFIG_ZTEST=y
+CONFIG_IRQ_OFFLOAD=y
diff --git a/tests/kernel/alert/test_alert_api/src/Makefile b/tests/kernel/alert/test_alert_api/src/Makefile
new file mode 100644
index 0000000..07178ea
--- /dev/null
+++ b/tests/kernel/alert/test_alert_api/src/Makefile
@@ -0,0 +1,3 @@
+include $(ZEPHYR_BASE)/tests/Makefile.test
+
+obj-y = main.o test_alert_contexts.o
diff --git a/tests/kernel/alert/test_alert_api/src/main.c b/tests/kernel/alert/test_alert_api/src/main.c
new file mode 100644
index 0000000..cfaa501
--- /dev/null
+++ b/tests/kernel/alert/test_alert_api/src/main.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2016 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @addtogroup t_kernel_alert
+ * @{
+ * @defgroup t_alert_api test_alert_api
+ * @}
+ */
+
+#include <ztest.h>
+extern void test_thread_alert_default(void);
+extern void test_thread_alert_ignore(void);
+extern void test_thread_alert_consumed(void);
+extern void test_thread_alert_pending(void);
+extern void test_isr_alert_default(void);
+extern void test_isr_alert_ignore(void);
+extern void test_isr_alert_consumed(void);
+extern void test_isr_alert_pending(void);
+extern void test_thread_kinit_alert(void);
+extern void test_isr_kinit_alert(void);
+
+/*test case main entry*/
+void test_main(void *p1, void *p2, void *p3)
+{
+ ztest_test_suite(test_alert_api,
+ ztest_unit_test(test_thread_alert_default),
+ ztest_unit_test(test_thread_alert_ignore),
+ ztest_unit_test(test_thread_alert_consumed),
+ ztest_unit_test(test_thread_alert_pending),
+ ztest_unit_test(test_isr_alert_default),
+ ztest_unit_test(test_isr_alert_ignore),
+ ztest_unit_test(test_isr_alert_consumed),
+ ztest_unit_test(test_isr_alert_pending),
+ ztest_unit_test(test_thread_kinit_alert),
+ ztest_unit_test(test_isr_kinit_alert));
+ ztest_run_test_suite(test_alert_api);
+}
diff --git a/tests/kernel/alert/test_alert_api/src/test_alert_contexts.c b/tests/kernel/alert/test_alert_api/src/test_alert_contexts.c
new file mode 100644
index 0000000..6d5da5c
--- /dev/null
+++ b/tests/kernel/alert/test_alert_api/src/test_alert_contexts.c
@@ -0,0 +1,225 @@
+/*
+ * Copyright (c) 2016 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @addtogroup t_alert_api
+ * @{
+ * @defgroup t_alert_context test_alert_send_recv_context
+ * @brief TestPurpose: verify zephyr alert send/recv across different contexts
+ */
+
+#include <ztest.h>
+#include <irq_offload.h>
+
+#define TIMEOUT 100
+#define STACK_SIZE 512
+#define PENDING_MAX 2
+static int alert_handler0(struct k_alert *);
+static int alert_handler1(struct k_alert *);
+
+/**TESTPOINT: init via K_ALERT_DEFINE*/
+K_ALERT_DEFINE(kalert_pending, alert_handler1, PENDING_MAX);
+K_ALERT_DEFINE(kalert_consumed, alert_handler0, PENDING_MAX);
+
+static char __noinit __stack tstack[STACK_SIZE];
+static struct k_alert *palert;
+static volatile int handler_executed;
+
+/*handlers*/
+static int alert_handler0(struct k_alert *alt)
+{
+ handler_executed++;
+ return 0;
+}
+
+static int alert_handler1(struct k_alert *alt)
+{
+ handler_executed++;
+ return 1;
+}
+
+static void alert_send(void)
+{
+ /**TESTPOINT: alert send*/
+ for (int i = 0; i < PENDING_MAX; i++) {
+ k_alert_send(palert);
+ }
+}
+
+static void alert_recv(void)
+{
+ int ret;
+
+ if (palert->handler == K_ALERT_IGNORE ||
+ palert->handler == alert_handler0){
+ if (palert->handler == alert_handler0)
+ assert_equal(handler_executed, PENDING_MAX, NULL);
+ ret = k_alert_recv(palert, TIMEOUT);
+ assert_equal(ret, -EAGAIN, NULL);
+ }
+
+ if (palert->handler == K_ALERT_DEFAULT ||
+ palert->handler == alert_handler1){
+ if (palert->handler == alert_handler1)
+ assert_equal(handler_executed, PENDING_MAX, NULL);
+ for (int i = 0; i < PENDING_MAX; i++) {
+ /**TESTPOINT: alert recv*/
+ ret = k_alert_recv(palert, K_NO_WAIT);
+ assert_false(ret, NULL);
+ }
+ /**TESTPOINT: alert recv -EAGAIN*/
+ ret = k_alert_recv(palert, TIMEOUT);
+ assert_equal(ret, -EAGAIN, NULL);
+ /**TESTPOINT: alert recv -EBUSY*/
+ ret = k_alert_recv(palert, K_NO_WAIT);
+ assert_equal(ret, -EBUSY, NULL);
+ }
+}
+
+static void tThread_entry(void *p1, void *p2, void *p3)
+{
+ alert_recv();
+}
+
+static void thread_alert(void)
+{
+ handler_executed = 0;
+ /**TESTPOINT: thread-thread sync via alert*/
+ k_tid_t tid = k_thread_spawn(tstack, STACK_SIZE,
+ tThread_entry, NULL, NULL, NULL,
+ K_PRIO_PREEMPT(0), 0, 0);
+ alert_send();
+ k_sleep(TIMEOUT);
+ k_thread_abort(tid);
+}
+
+static void tIsr_entry(void *p)
+{
+ alert_send();
+}
+
+static void isr_alert(void)
+{
+ handler_executed = 0;
+ /**TESTPOINT: thread-isr sync via alert*/
+ irq_offload(tIsr_entry, NULL);
+ k_sleep(TIMEOUT);
+ alert_recv();
+}
+
+/*test cases*/
+void test_thread_alert_default(void)
+{
+ struct k_alert alert;
+ /**TESTPOINT: init via k_alert_init*/
+ k_alert_init(&alert, K_ALERT_DEFAULT, PENDING_MAX);
+
+ /**TESTPOINT: alert handler default*/
+ palert = &alert;
+ thread_alert();
+
+}
+
+void test_thread_alert_ignore(void)
+{
+ /**TESTPOINT: alert handler ignore*/
+ struct k_alert alert;
+ /**TESTPOINT: init via k_alert_init*/
+ k_alert_init(&alert, K_ALERT_IGNORE, PENDING_MAX);
+ palert = &alert;
+ thread_alert();
+}
+
+void test_thread_alert_consumed(void)
+{
+ struct k_alert alert;
+ /**TESTPOINT: init via k_alert_init*/
+ k_alert_init(&alert, alert_handler0, PENDING_MAX);
+
+ /**TESTPOINT: alert handler return 0*/
+ palert = &alert;
+ thread_alert();
+}
+
+void test_thread_alert_pending(void)
+{
+ struct k_alert alert;
+ /**TESTPOINT: init via k_alert_init*/
+ k_alert_init(&alert, alert_handler1, PENDING_MAX);
+
+ /**TESTPOINT: alert handler return 1*/
+ palert = &alert;
+ thread_alert();
+}
+
+void test_isr_alert_default(void)
+{
+ struct k_alert alert;
+ /**TESTPOINT: init via k_alert_init*/
+ k_alert_init(&alert, K_ALERT_DEFAULT, PENDING_MAX);
+
+ /**TESTPOINT: alert handler default*/
+ palert = &alert;
+ isr_alert();
+}
+
+void test_isr_alert_ignore(void)
+{
+ /**TESTPOINT: alert handler ignore*/
+ struct k_alert alert;
+ /**TESTPOINT: init via k_alert_init*/
+ k_alert_init(&alert, K_ALERT_IGNORE, PENDING_MAX);
+ palert = &alert;
+ isr_alert();
+}
+
+void test_isr_alert_consumed(void)
+{
+ struct k_alert alert;
+ /**TESTPOINT: init via k_alert_init*/
+ k_alert_init(&alert, alert_handler0, PENDING_MAX);
+
+ /**TESTPOINT: alert handler return 0*/
+ palert = &alert;
+ isr_alert();
+}
+
+void test_isr_alert_pending(void)
+{
+ struct k_alert alert;
+ /**TESTPOINT: init via k_alert_init*/
+ k_alert_init(&alert, alert_handler1, PENDING_MAX);
+
+ /**TESTPOINT: alert handler return 0*/
+ palert = &alert;
+ isr_alert();
+}
+
+void test_thread_kinit_alert(void)
+{
+ palert = &kalert_consumed;
+ thread_alert();
+ palert = &kalert_pending;
+ thread_alert();
+}
+
+void test_isr_kinit_alert(void)
+{
+ palert = &kalert_consumed;
+ isr_alert();
+ palert = &kalert_pending;
+ isr_alert();
+}
diff --git a/tests/kernel/alert/test_alert_api/testcase.ini b/tests/kernel/alert/test_alert_api/testcase.ini
new file mode 100644
index 0000000..58c4d1a
--- /dev/null
+++ b/tests/kernel/alert/test_alert_api/testcase.ini
@@ -0,0 +1,2 @@
+[test]
+tags = kernel