| /* |
| * Copyright (c) 2018 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <ztest.h> |
| #include <kernel.h> |
| |
| #define STACK_SIZE (512 + CONFIG_TEST_EXTRA_STACKSIZE) |
| #define MAIL_LEN 64 |
| |
| K_MEM_POOL_DEFINE(mpooltx, 8, MAIL_LEN, 1, 4); |
| K_MEM_POOL_DEFINE(mpoolrx, 8, MAIL_LEN, 1, 4); |
| |
| static K_THREAD_STACK_DEFINE(tstack, STACK_SIZE); |
| |
| static struct k_thread tdata; |
| |
| static struct k_mbox mbox; |
| |
| static struct k_sem sync_sema; |
| |
| static k_tid_t tid1, receiver_tid; |
| |
| static enum mmsg_type { |
| PUT_GET_NULL = 0, |
| TARGET_SOURCE |
| } info_type; |
| |
| static void msg_sender(struct k_mbox *pmbox, s32_t timeout) |
| { |
| struct k_mbox_msg mmsg; |
| |
| (void)memset(&mmsg, 0, sizeof(mmsg)); |
| |
| switch (info_type) { |
| case PUT_GET_NULL: |
| /* mbox sync put empty message */ |
| mmsg.info = PUT_GET_NULL; |
| mmsg.size = 0; |
| mmsg.tx_data = NULL; |
| if (timeout == K_FOREVER) { |
| k_mbox_put(pmbox, &mmsg, K_FOREVER); |
| } else if (timeout == K_NO_WAIT) { |
| k_mbox_put(pmbox, &mmsg, K_NO_WAIT); |
| } else { |
| k_mbox_put(pmbox, &mmsg, timeout); |
| } |
| break; |
| default: |
| break; |
| } |
| } |
| |
| static void msg_receiver(struct k_mbox *pmbox, k_tid_t thd_id, s32_t timeout) |
| { |
| struct k_mbox_msg mmsg; |
| char rxdata[MAIL_LEN]; |
| |
| switch (info_type) { |
| case PUT_GET_NULL: |
| mmsg.size = sizeof(rxdata); |
| mmsg.rx_source_thread = thd_id; |
| if (timeout == K_FOREVER) { |
| zassert_true(k_mbox_get(pmbox, &mmsg, |
| rxdata, K_FOREVER) == 0, NULL); |
| } else if (timeout == K_NO_WAIT) { |
| zassert_false(k_mbox_get(pmbox, &mmsg, |
| rxdata, K_NO_WAIT) == 0, NULL); |
| } else { |
| zassert_true(k_mbox_get(pmbox, &mmsg, |
| rxdata, timeout) == 0, NULL); |
| } |
| break; |
| default: |
| break; |
| } |
| } |
| |
| static void test_mbox_init(void) |
| { |
| k_mbox_init(&mbox); |
| |
| k_sem_init(&sync_sema, 0, 1); |
| } |
| |
| void test_send(void *p1, void *p2, void *p3) |
| { |
| msg_sender((struct k_mbox *)p1, K_NO_WAIT); |
| } |
| |
| /* Receive message from any thread with no wait */ |
| void test_msg_receiver(void) |
| { |
| static k_tid_t tid; |
| |
| info_type = PUT_GET_NULL; |
| msg_receiver(&mbox, K_ANY, K_NO_WAIT); |
| |
| tid = k_thread_create(&tdata, tstack, STACK_SIZE, |
| test_send, &mbox, NULL, NULL, |
| K_PRIO_PREEMPT(0), 0, K_NO_WAIT); |
| |
| msg_receiver(&mbox, K_ANY, 2); |
| k_thread_abort(tid); |
| } |
| |
| void test_send_un(void *p1, void *p2, void *p3) |
| { |
| TC_PRINT("Sender UNLIMITED\n"); |
| msg_sender((struct k_mbox *)p1, K_FOREVER); |
| } |
| |
| /* Receive message from thread tid1 */ |
| void msg_receiver_unlimited(void) |
| { |
| info_type = PUT_GET_NULL; |
| |
| receiver_tid = k_current_get(); |
| tid1 = k_thread_create(&tdata, tstack, STACK_SIZE, |
| test_send_un, &mbox, NULL, NULL, |
| K_PRIO_PREEMPT(0), 0, K_NO_WAIT); |
| |
| msg_receiver(&mbox, tid1, K_FOREVER); |
| k_thread_abort(tid1); |
| } |
| |
| /*test case main entry*/ |
| void test_main(void) |
| { |
| test_mbox_init(); |
| ztest_test_suite(test_mbox, |
| ztest_unit_test(test_msg_receiver), |
| ztest_unit_test(msg_receiver_unlimited)); |
| ztest_run_test_suite(test_mbox); |
| } |