/*
 * Copyright (c) 2021 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/ztest.h>

#include <zephyr/drivers/edac.h>

/**
 * EDAC dummy is used for coverage tests for -ENOSYS returns
 */

static const struct edac_driver_api edac_dummy_api = { 0 };

DEVICE_DEFINE(dummy_edac, "dummy_edac", NULL, NULL,
	      NULL, NULL,
	      POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
	      &edac_dummy_api);

ZTEST(ibecc, test_edac_dummy_api)
{
	const struct device *dev = device_get_binding("dummy_edac");
	uint64_t value;
	int ret;

	zassert_not_null(dev, "Device not found");

	/* Error log API */

	ret = edac_ecc_error_log_get(dev, &value);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_ecc_error_log_clear(dev);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_parity_error_log_get(dev, &value);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_parity_error_log_clear(dev);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	/* Error stat API */

	ret = edac_errors_cor_get(dev);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_errors_uc_get(dev);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	/* Notification API */

	/* It is OK to use NULL as a callback pointer */
	ret = edac_notify_callback_set(dev, NULL);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	/* Injection API */

	ret = edac_inject_set_param1(dev, 0x0);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_inject_get_param1(dev, &value);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_inject_set_param2(dev, 0x0);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_inject_get_param2(dev, &value);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_inject_set_error_type(dev, 0x0);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_inject_get_error_type(dev, (uint32_t *)&value);
	zassert_equal(ret, -ENOSYS, "dummy api failed");

	ret = edac_inject_error_trigger(dev);
	zassert_equal(ret, -ENOSYS, "dummy api failed");
}
