/*
 * Copyright (c) 2019 Peter Bigot Consulting, LLC
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/* Tests of functions in testfs_util */

#include <string.h>
#include <zephyr/ztest.h>
#include "testfs_tests.h"
#include "testfs_util.h"

#define MNT "/mnt"
#define ELT1 "a"
#define ELT2 "b"

static struct testfs_path path;
static const struct fs_mount_t mnt = {
	.mnt_point = MNT,
};

static inline struct testfs_path *reset_path()
{
	testfs_path_init(&path, &mnt, TESTFS_PATH_END);
	return &path;
}

ZTEST(littlefs, test_util_path_init_base)
{
	zassert_equal(testfs_path_init(&path, NULL, TESTFS_PATH_END),
		      path.path,
		      "bad root init return");
	zassert_equal(strcmp(path.path, "/"), 0, "bad root init path");

	zassert_equal(testfs_path_init(&path, &mnt, TESTFS_PATH_END),
		      path.path,
		      "bad mnt init return");
	zassert_equal(strcmp(path.path, mnt.mnt_point), 0, "bad mnt init path");

	if (IS_ENABLED(CONFIG_DEBUG)) {
		struct fs_mount_t invalid = {
			.mnt_point = "relative",
		};

		/* Apparently no way to verify this without panic. */
		testfs_path_init(&path, &invalid, TESTFS_PATH_END);
	}
}

ZTEST(littlefs, test_util_path_init_overrun)
{
	char overrun[TESTFS_PATH_MAX + 2] = "/";
	size_t overrun_max = sizeof(overrun) - 1;
	size_t path_max = sizeof(path.path) - 1;
	struct fs_mount_t overrun_mnt = {
		.mnt_point = overrun,
	};

	zassert_true(path_max < overrun_max,
		     "path length requirements unmet");

	memset(overrun + 1, 'A', overrun_max - 1);

	zassert_equal(testfs_path_init(&path, &overrun_mnt, TESTFS_PATH_END),
		      path.path,
		      "bad overrun init return");
	zassert_true(strcmp(path.path, overrun) < 0,
		     "bad overrun init");
	zassert_equal(strncmp(path.path, overrun, path_max),
		      0,
		      "bad overrun path");
	zassert_equal(path.path[path_max], '\0',
		      "missing overrun EOS");
}

ZTEST(littlefs, test_util_path_init_extended)
{
	zassert_equal(strcmp(testfs_path_init(&path, &mnt,
					      ELT1,
					      TESTFS_PATH_END),
			     MNT "/" ELT1),
		      0,
		      "bad mnt init elt1");

	zassert_equal(strcmp(testfs_path_init(&path, &mnt,
					      ELT1,
					      ELT2,
					      TESTFS_PATH_END),
			     MNT "/" ELT1 "/" ELT2),
		      0,
		      "bad mnt init elt1 elt2");
}

ZTEST(littlefs, test_util_path_extend)
{
	zassert_equal(strcmp(testfs_path_extend(reset_path(),
						TESTFS_PATH_END),
			     MNT),
		      0,
		      "empty extend failed");

	zassert_equal(strcmp(testfs_path_extend(reset_path(),
						ELT2,
						TESTFS_PATH_END),
			     MNT "/" ELT2),
		      0,
		      "elt extend failed");

	zassert_equal(strcmp(testfs_path_extend(reset_path(),
						ELT1,
						ELT2,
						TESTFS_PATH_END),
			     MNT "/" ELT1 "/" ELT2),
		      0,
		      "elt1 elt2 extend failed");
}

ZTEST(littlefs, test_util_path_extend_up)
{
	zassert_equal(strcmp(testfs_path_extend(reset_path(),
						ELT2,
						"..",
						ELT1,
						TESTFS_PATH_END),
			     MNT "/" ELT1),
		      0,
		      "elt elt2, up, elt1 failed");

	zassert_equal(strcmp(testfs_path_extend(reset_path(),
						"..",
						TESTFS_PATH_END),
			     "/"),
		      0,
		      "up strip mnt failed");

	zassert_equal(strcmp(testfs_path_extend(reset_path(),
						"..",
						"..",
						TESTFS_PATH_END),
			     "/"),
		      0,
		      "up from root failed");
}

ZTEST(littlefs, test_util_path_extend_overrun)
{
	char long_elt[TESTFS_PATH_MAX];

	memset(long_elt, 'a', sizeof(long_elt) - 1);
	long_elt[sizeof(long_elt) - 1] = '\0';

	zassert_equal(strcmp(testfs_path_extend(reset_path(),
						long_elt,
						ELT1,
						TESTFS_PATH_END),
			     MNT),
		      0,
		      "stop at overrun failed");
}
