blob: f855d0477518338f0a2f92fa4755a867b594f403 [file] [log] [blame]
/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/ztest.h>
#include <assert.h>
#include <zephyr/tc_util.h>
#include <zephyr/debug/coredump.h>
#define STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
static struct k_thread dump_thread;
static K_THREAD_STACK_DEFINE(dump_stack, STACK_SIZE);
void k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t *pEsf)
{
ARG_UNUSED(reason);
ARG_UNUSED(pEsf);
}
void dump_entry(void *p1, void *p2, void *p3)
{
unsigned int key;
key = irq_lock();
k_oops();
TC_ERROR("SHOULD NEVER SEE THIS\n");
irq_unlock(key);
}
static void check_errors(void)
{
int ret;
/* Check backend error if backend supports this query */
ret = coredump_query(COREDUMP_QUERY_GET_ERROR, NULL);
if (ret != -ENOTSUP) {
zassert_equal(ret, 0, "Error encountered! (%d)", ret);
}
}
void test_coredump(void)
{
k_tid_t tid;
/* Create a thread that crashes */
tid = k_thread_create(&dump_thread, dump_stack,
K_THREAD_STACK_SIZEOF(dump_stack),
dump_entry, NULL, NULL, NULL,
0, 0, K_NO_WAIT);
k_thread_join(tid, K_FOREVER);
check_errors();
}
void test_query_stored_dump(void)
{
int ret;
/* Cannot proceed with previous errors */
check_errors();
/* There should be a stored coredump now if backend has storage */
ret = coredump_query(COREDUMP_QUERY_HAS_STORED_DUMP, NULL);
if (ret == -ENOTSUP) {
ztest_test_skip();
} else if (ret == 1) {
check_errors();
ztest_test_pass();
} else if (ret == 0) {
TC_PRINT("Should have stored dump!\n");
ztest_test_fail();
} else {
TC_PRINT("Error reading stored dump! (%d)\n", ret);
ztest_test_fail();
}
}
void test_verify_stored_dump(void)
{
int ret;
/* Cannot proceed with previous errors */
check_errors();
/* There should be a stored coredump now if backend has storage */
ret = coredump_cmd(COREDUMP_CMD_VERIFY_STORED_DUMP, NULL);
if (ret == -ENOTSUP) {
ztest_test_skip();
} else if (ret == 1) {
check_errors();
ztest_test_pass();
} else if (ret == 0) {
TC_PRINT("Verification of stored dump failed!\n");
ztest_test_fail();
} else {
TC_PRINT("Error reading stored dump! (%d)\n", ret);
ztest_test_fail();
}
}
ZTEST(coredump_backends, test_coredump_backend) {
test_coredump();
test_query_stored_dump();
test_verify_stored_dump();
}
ZTEST_SUITE(coredump_backends, NULL, NULL, NULL, NULL, NULL);