tests: cache: Add cache test

This is useful to prove that the implementation of the API is done
correctly.

Signed-off-by: Carlo Caione <ccaione@baylibre.com>
diff --git a/tests/kernel/cache/CMakeLists.txt b/tests/kernel/cache/CMakeLists.txt
new file mode 100644
index 0000000..b304466
--- /dev/null
+++ b/tests/kernel/cache/CMakeLists.txt
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: Apache-2.0
+
+cmake_minimum_required(VERSION 3.20.0)
+find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
+project(cache_api)
+
+FILE(GLOB app_sources src/*.c)
+target_sources(app PRIVATE ${app_sources})
diff --git a/tests/kernel/cache/prj.conf b/tests/kernel/cache/prj.conf
new file mode 100644
index 0000000..3971afe
--- /dev/null
+++ b/tests/kernel/cache/prj.conf
@@ -0,0 +1,3 @@
+CONFIG_ZTEST=y
+CONFIG_ZTEST_NEW_API=y
+CONFIG_TEST_USERSPACE=y
diff --git a/tests/kernel/cache/src/test_cache_api.c b/tests/kernel/cache/src/test_cache_api.c
new file mode 100644
index 0000000..bbfc573
--- /dev/null
+++ b/tests/kernel/cache/src/test_cache_api.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2016 Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <zephyr/ztest.h>
+#include <zephyr/cache.h>
+
+#define SIZE	(4096)
+
+static ZTEST_BMEM uint8_t user_buffer[SIZE];
+
+ZTEST(cache_api, test_instr_cache_api)
+{
+	int ret;
+
+	ret = sys_cache_instr_flush_all();
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_instr_invd_all();
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_instr_flush_and_invd_all();
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_instr_flush_range(user_buffer, SIZE);
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_instr_invd_range(user_buffer, SIZE);
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_instr_flush_and_invd_range(user_buffer, SIZE);
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+}
+
+ZTEST(cache_api, test_data_cache_api)
+{
+	int ret;
+
+	ret = sys_cache_data_flush_all();
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_data_invd_all();
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_data_flush_and_invd_all();
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+}
+
+ZTEST_USER(cache_api, test_data_cache_api_user)
+{
+	int ret;
+
+	ret = sys_cache_data_flush_range(user_buffer, SIZE);
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_data_invd_range(user_buffer, SIZE);
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+
+	ret = sys_cache_data_flush_and_invd_range(user_buffer, SIZE);
+	zassert_true((ret == 0) || (ret == -ENOTSUP));
+}
+
+static void *cache_api_setup(void)
+{
+	sys_cache_data_enable();
+	sys_cache_instr_enable();
+
+	return NULL;
+}
+
+static void cache_api_teardown(void *unused)
+{
+	sys_cache_data_disable();
+	sys_cache_instr_disable();
+}
+
+ZTEST_SUITE(cache_api, NULL, cache_api_setup, NULL, NULL, cache_api_teardown);
diff --git a/tests/kernel/cache/testcase.yaml b/tests/kernel/cache/testcase.yaml
new file mode 100644
index 0000000..77abd4c
--- /dev/null
+++ b/tests/kernel/cache/testcase.yaml
@@ -0,0 +1,4 @@
+tests:
+  kernel.cache.api:
+    tags: kernel cache
+    filter: CONFIG_CACHE_MANAGEMENT