/*
 * Copyright (c) 2017 Codecoup
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stdio.h>
#include <stdint.h>
#include <nffs/nffs.h>
#include <fs.h>
#include "nffs_test_utils.h"
#include <ztest_assert.h>
#include <timestamp.h>
#include <sys_clock.h>

#define TEST_NUM_FILES		500
#define RW_DATA_LENGTH		(128 * 1024)
#define RW_CHUNK_LENGTH		256

#define TEST_DATA_LEN (1024 * 24)

static const struct nffs_area_desc area_descs[] = {
	{ 0x00020000, 16384 },
	{ 0x00024000, 16384 },
	{ 0x00028000, 16384 },
	{ 0x0002c000, 16384 },
	{ 0x00030000, 16384 },
	{ 0x00034000, 16384 },
	{ 0x00038000, 16384 },
	{ 0x0003c000, 16384 },
	{ 0x00040000, 16384 },
	{ 0x00044000, 16384 },
	{ 0x00048000, 16384 },
	{ 0x0004c000, 16384 },
	{ 0, 0 },
};

void test_performance(void)
{
	char filename[16];
	fs_file_t file;
	s64_t reftime;
	u32_t delta;
	int i;
	int rc;

	/* Format to start on clean flash */
	rc = nffs_format_full(area_descs);
	zassert_equal(rc, 0, "cannot format nffs");

	/* 1. Create files benchmark */
	printk("1. Creating files...\n");
	nffs_cache_clear();
	k_uptime_delta(&reftime);

	for (i = 0; i < TEST_NUM_FILES; i++) {
		snprintf(filename, sizeof(filename), "/file_%d", i);
		rc = fs_open(&file, filename);
		zassert_equal(rc, 0, "cannot open file");
		rc = fs_close(&file);
		zassert_equal(rc, 0, "cannot close file");
	}

	delta = k_uptime_delta_32(&reftime);
	printk("Created %d files in %d.%03d seconds\n", TEST_NUM_FILES,
	       delta / 1000, delta % 1000);

	/* 2. Unlink files benchmark */
	printk("2. Unlinking files...\n");
	nffs_cache_clear();
	k_uptime_delta(&reftime);

	for (i = 0; i < TEST_NUM_FILES; i++) {
		snprintf(filename, sizeof(filename), "/file_%d", i);
		rc = fs_unlink(filename);
		zassert_equal(rc, 0, "cannot unlink file");
	}

	delta = k_uptime_delta_32(&reftime);
	printk("Unlinked %d files in %d.%03d seconds\n", TEST_NUM_FILES,
	       delta / 1000, delta % 1000);

	/* Format to start on clean flash */
	rc = nffs_format_full(area_descs);
	zassert_equal(rc, 0, "cannot format nffs");

	/* 3. Write file benchmark */
	printk("3. Writing file...\n");
	nffs_cache_clear();
	k_uptime_delta(&reftime);

	rc = fs_open(&file, "/file");
	zassert_equal(rc, 0, "cannot open file");
	memset(nffs_test_buf, 0, RW_CHUNK_LENGTH);
	for (i = 0; i < RW_DATA_LENGTH; ) {
		rc = fs_write(&file, nffs_test_buf, RW_CHUNK_LENGTH);
		zassert_equal(rc, RW_CHUNK_LENGTH, "cannot write file");
		i += rc;
	}
	rc = fs_close(&file);
	zassert_equal(rc, 0, "cannot close file");

	delta = k_uptime_delta_32(&reftime);
	printk("Written %d bytes in %d.%03d seconds\n", i, delta / 1000,
	       delta % 1000);

	/* 4. Read file benchmark */
	printk("4. Reading file...\n");
	nffs_cache_clear();
	k_uptime_delta(&reftime);

	rc = fs_open(&file, "/file");
	zassert_equal(rc, 0, "cannot open file");
	for (i = 0; i < RW_DATA_LENGTH; ) {
		rc = fs_read(&file, nffs_test_buf, RW_CHUNK_LENGTH);
		zassert_equal(rc, RW_CHUNK_LENGTH, "cannot read file");
		i += rc;
	}
	rc = fs_close(&file);
	zassert_equal(rc, 0, "cannot close file");

	delta = k_uptime_delta_32(&reftime);
	printk("Read %d bytes in %d.%03d seconds\n", i, delta / 1000,
	       delta % 1000);

	/* Format to start on clean flash */
	rc = nffs_format_full(area_descs);
	zassert_equal(rc, 0, "cannot format nffs");

	/* 5. Write file benchmark */
	printk("5. Writing file (max block size)...\n");
	nffs_cache_clear();
	k_uptime_delta(&reftime);

	rc = fs_open(&file, "/file");
	zassert_equal(rc, 0, "cannot open file");
	memset(nffs_test_buf, 0, NFFS_BLOCK_MAX_DATA_SZ_MAX);
	for (i = 0; i < RW_DATA_LENGTH; ) {
		rc = fs_write(&file, nffs_test_buf, NFFS_BLOCK_MAX_DATA_SZ_MAX);
		zassert_equal(rc, NFFS_BLOCK_MAX_DATA_SZ_MAX,
			      "cannot write file");
		i += rc;
	}
	rc = fs_close(&file);
	zassert_equal(rc, 0, "cannot close file");

	delta = k_uptime_delta_32(&reftime);
	printk("Written %d bytes in %d.%03d seconds\n", i, delta / 1000,
	       delta % 1000);

	/* 6. Read file benchmark */
	printk("6. Reading file (max block size)...\n");
	nffs_cache_clear();
	k_uptime_delta(&reftime);

	rc = fs_open(&file, "/file");
	zassert_equal(rc, 0, "cannot open file");
	for (i = 0; i < RW_DATA_LENGTH; ) {
		rc = fs_read(&file, nffs_test_buf, NFFS_BLOCK_MAX_DATA_SZ_MAX);
		zassert_equal(rc, NFFS_BLOCK_MAX_DATA_SZ_MAX,
			      "cannot read file");
		i += rc;
	}
	rc = fs_close(&file);
	zassert_equal(rc, 0, "cannot close file");

	delta = k_uptime_delta_32(&reftime);
	printk("Read %d bytes in %d.%03d seconds\n", i, delta / 1000,
	       delta % 1000);
}
