/*
 * Copyright (c) 2022, Commonwealth Scientific and Industrial Research
 * Organisation (CSIRO) ABN 41 687 119 230.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/ztest.h>
#include <zephyr/arch/common/semihost.h>

ZTEST(semihost, test_file_ops)
{
	const char *test_file = "./test.bin";
	uint8_t w_buffer[16] = { 1, 2, 3, 4, 5 };
	uint8_t r_buffer[16];
	long read, fd;

	/* Open in write mode */
	fd = semihost_open(test_file, SEMIHOST_OPEN_WB);
	zassert_true(fd > 0, "Bad handle (%d)", fd);
	zassert_equal(semihost_flen(fd), 0, "File not empty");

	/* Write some data */
	zassert_equal(semihost_write(fd, w_buffer, sizeof(w_buffer)), 0, "Write failed");
	zassert_equal(semihost_flen(fd), sizeof(w_buffer), "Size not updated");
	zassert_equal(semihost_write(fd, w_buffer, sizeof(w_buffer)), 0, "Write failed");
	zassert_equal(semihost_flen(fd), 2 * sizeof(w_buffer), "Size not updated");

	/* Reading should fail in this mode */
	read = semihost_read(fd, r_buffer, sizeof(r_buffer));
	zassert_equal(read, -EIO, "Read from write-only file");

	/* Close the file */
	zassert_equal(semihost_close(fd), 0, "Close failed");

	/* Open the same file again for reading */
	fd = semihost_open(test_file, SEMIHOST_OPEN_RB);
	zassert_true(fd > 0, "Bad handle (%d)", fd);
	zassert_equal(semihost_flen(fd), 2 * sizeof(w_buffer), "Data not preserved");

	/* Check reading data */
	read = semihost_read(fd, r_buffer, sizeof(r_buffer));
	zassert_equal(read, sizeof(r_buffer), "Read failed %d", read);
	zassert_mem_equal(r_buffer, w_buffer, sizeof(r_buffer), "Data not read");
	read = semihost_read(fd, r_buffer, sizeof(r_buffer));
	zassert_equal(read, sizeof(r_buffer), "Read failed");
	zassert_mem_equal(r_buffer, w_buffer, sizeof(r_buffer), "Data not read");

	/* Read past end of file */
	read = semihost_read(fd, r_buffer, sizeof(r_buffer));
	zassert_equal(read, -EIO, "Read past end of file");

	/* Seek to file offset */
	zassert_equal(semihost_seek(fd, 1), 0, "Seek failed");

	/* Read from offset */
	read = semihost_read(fd, r_buffer, sizeof(r_buffer) - 1);
	zassert_equal(read, sizeof(r_buffer) - 1, "Read failed");
	zassert_mem_equal(r_buffer, w_buffer + 1, sizeof(r_buffer) - 1, "Data not read");

	/* Close the file */
	zassert_equal(semihost_close(fd), 0, "Close failed");

	/* Opening again in write mode should erase the file */
	fd = semihost_open(test_file, SEMIHOST_OPEN_WB);
	zassert_true(fd > 0, "Bad handle (%d)", fd);
	zassert_equal(semihost_flen(fd), 0, "File not empty");
	zassert_equal(semihost_close(fd), 0, "Close failed");
}

ZTEST_SUITE(semihost, NULL, NULL, NULL, NULL, NULL);
