/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <string.h>
#include <fcntl.h>
#include <zephyr/posix/unistd.h>
#include "test_fs.h"

#define THE_FILE FATFS_MNTP"/the_file.txt"

static int test_file_open_flags(void)
{
	int fd = 0;
	int data = 0;
	int ret;

	/* 1 Check opening non-existent without O_CREAT */
	TC_PRINT("Open of non-existent file, flags = 0\n");
	fd = open(THE_FILE, 0);
	if (fd >= 0 || errno != ENOENT) {
		TC_PRINT("Expected fail; fd = %d, errno = %d\n", fd, errno);
		close(fd);
		return TC_FAIL;
	}

	TC_PRINT("Open on non-existent file, flags = O_RDONLY\n");
	fd = open(THE_FILE, O_RDONLY);
	if (fd >= 0 || errno != ENOENT) {
		TC_PRINT("Expected fail; fd = %d, errno = %d\n", fd, errno);
		close(fd);
		return TC_FAIL;
	}
	TC_PRINT("Open on non-existent file, flags = O_WRONLY\n");
	fd = open(THE_FILE, O_WRONLY);
	if (fd >= 0 || errno != ENOENT) {
		TC_PRINT("Expected fail; fd = %d, errno = %d\n", fd, errno);
		close(fd);
		return TC_FAIL;
	}

	TC_PRINT("Open on non-existent file, flags = O_RDWR\n");
	fd = open(THE_FILE, O_RDWR);
	if (fd >= 0 || errno != ENOENT) {
		TC_PRINT("Expected fail; fd = %d, errno = %d\n", fd, errno);
		close(fd);
		return TC_FAIL;
	}
	/* end 1 */

	/* 2 Create file for read only, attempt to read, attempt to write */
	TC_PRINT("Open on non-existent file, flags = O_CREAT | O_WRONLY\n");
	fd = open(THE_FILE, O_CREAT | O_WRONLY);
	if (fd < 0) {
		TC_PRINT("Expected success; fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
	}

	TC_PRINT("Attempt read file opened with flags = O_CREAT | O_WRONLY\n");
	ret = read(fd, &data, sizeof(data));
	if (ret > 0 || errno != EACCES) {
		TC_PRINT("Expected fail, ret = %d, errno = %d\n", ret, errno);
		close(fd);
		return TC_FAIL;
	}

	TC_PRINT("Attempt write file opened with flags = O_CREAT | O_WRONLY\n");
	ret = write(fd, &data, sizeof(data));
	if (ret <= 0 || errno != EACCES) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	close(fd);
	/* end 2 */


	/* 3 Attempt read/write operation on file opened with flags = 0 */
	TC_PRINT("Attempt open existing with flags = 0\n");
	fd = open(THE_FILE, 0);
	if (fd < 0) {
		TC_PRINT("Expected success, fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
	}

	TC_PRINT("Attempt read file opened with flags = 0\n");
	ret = read(fd, &data, sizeof(data));
	if (ret < 0) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	TC_PRINT("Attempt write file opened with flags = 0\n");
	ret = write(fd, &data, sizeof(data));
	if (ret >= 0 || errno != EACCES) {
		TC_PRINT("Expected fail, ret = %d, errno = %d\n", ret, errno);
		close(fd);
		return TC_FAIL;
	}

	close(fd);
	/* end 3 */

	/* 4 Attempt read/write on file opened with flags O_RDONLY */
	/* File does have content after previous tests. */
	TC_PRINT("Attempt open existing with flags = O_RDONLY\n");
	fd = open(THE_FILE, O_RDONLY);
	if (fd < 0) {
		TC_PRINT("Expected success, fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
	}

	TC_PRINT("Attempt read file opened with flags = O_RDONLY\n");
	ret = read(fd, &data, sizeof(data));
	if (ret < 0) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	TC_PRINT("Attempt write file opened with flags = O_RDONLY\n");
	ret = write(fd, &data, sizeof(data));
	if (ret >= 0 || errno != EACCES) {
		TC_PRINT("Expected fail, ret = %d, errno = %d\n", ret, errno);
		close(fd);
		return TC_FAIL;
	}

	close(fd);
	/* end 4 */

	/* 5 Attempt read/write on file opened with flags O_WRONLY */
	/* File does have content after previous tests. */
	TC_PRINT("Attempt open existing with flags = O_WRONLY\n");
	fd = open(THE_FILE, O_WRONLY);
	if (fd < 0) {
		TC_PRINT("Expected success, fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
	}

	TC_PRINT("Attempt read file opened with flags = O_WRONLY\n");
	ret = read(fd, &data, sizeof(data));
	if (ret >= 0 || errno != EACCES) {
		TC_PRINT("Expected fail, ret = %d, errno = %d\n", ret, errno);
		close(fd);
		return TC_FAIL;
	}

	TC_PRINT("Attempt write file opened with flags = O_WRONLY\n");
	ret = write(fd, &data, sizeof(data));
	if (ret < 0) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	close(fd);
	/* end 5 */

	/* 6 Attempt read/write on file opened with flags O_APPEND | O_WRONLY */
	TC_PRINT("Attempt open existing with flags = O_APPEND | O_WRONLY\n");
	fd = open(THE_FILE, O_APPEND | O_WRONLY);
	if (fd < 0) {
		TC_PRINT("Expected success, fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
	}

	TC_PRINT("Attempt read file opened with flags = O_APPEND | O_WRONLY\n");
	ret = read(fd, &data, sizeof(data));
	if (ret >= 0 || errno != EACCES) {
		TC_PRINT("Expected fail, ret = %d, errno = %d\n", ret, errno);
		close(fd);
		return TC_FAIL;
	}

	TC_PRINT("Attempt write to opened with flags = O_APPEND | O_WRONLY\n");
	ret = write(fd, &data, sizeof(data));
	if (ret < 0) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	close(fd);
	/* end 6 */

	/* 7 Attempt read/write on file opened with flags O_APPEND | O_RDWR */
	TC_PRINT("Attempt open existing with flags = O_APPEND | O_RDWR\n");
	fd = open(THE_FILE, O_APPEND | O_RDWR);
	if (fd < 0) {
		TC_PRINT("Expected success, fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
	}


	TC_PRINT("Attempt read file opened with flags = O_APPEND | O_RDWR\n");
	lseek(fd, 0, SEEK_SET);
	ret = read(fd, &data, sizeof(data));
	if (ret < 0) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	TC_PRINT("Attempt write file opened with flags = O_APPEND | O_RDWR\n");
	ret = write(fd, &data, sizeof(data));
	if (ret < 0) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	close(fd);
	/* end 7 */

	/* 8 Check if appended file is always written at the end */
	TC_PRINT("Attempt write to file opened with O_APPEND | O_RDWR\n");
	/* Clean start */
	unlink(THE_FILE);
	fd = open(THE_FILE, O_CREAT | O_WRONLY);
	if (fd < 0) {
		TC_PRINT("Expected success, fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
	}

	ret = write(fd, &data, sizeof(data));
	if (ret < 0) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	close(fd);

	fd = open(THE_FILE, O_APPEND | O_RDWR);
	if (fd < 0) {
		TC_PRINT("Expected success, fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
	}

	lseek(fd, 0, SEEK_SET);
	ret = write(fd, &data, sizeof(data));
	if (ret < 0) {
		TC_PRINT("Expected success, ret = %d, errno = %d\n", ret,
			 errno);
		close(fd);
		return TC_FAIL;
	}

	ret = lseek(fd, 0, SEEK_END);

	if (ret != (sizeof(data) * 2)) {
		TC_PRINT("Expected file size %zu, ret = %d, errno = %d\n",
			 sizeof(data) * 2, ret, errno);
		close(fd);
		return TC_FAIL;
	}

	close(fd);
	/* end 8 */

	return TC_PASS;
}

/**
 * @brief Test for POSIX open flags
 *
 * @details Test attempts to open file with different combinations of open
 * flags and checks if operations on files are permitted according to flags.
 */
ZTEST(posix_fs_test, test_fs_open_flags)
{
	zassert_true(test_file_open_flags() == TC_PASS);
}
