blob: 5e6ad5959a02a306c4ae113955c0442a6056d171 [file] [log] [blame]
/*
* 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);