/*
 * Samsung Exynos SoC series NPU driver
 *
 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
 *              http://www.samsung.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#ifdef IDIOT_DECL_SECTION

#define		TESTFILE_NUM    5
#define		SIZE_STEP	100
#define		TMP_DIR		"/storage"
const char*	FILENAME_FMT = TMP_DIR "/img%03d";
const char*	GOLDEN_FMT = "%d\t" TMP_DIR "/img%03d\n";

#define		DEFAULT_FRAME_ID	0
#define		DEFAULT_NET_ID		4084

struct addr_info drv_addr_ary[TESTFILE_NUM];
struct av_info mem = {
	.address_vector_cnt = TESTFILE_NUM,
	.addr_info = drv_addr_ary,
};

static void dealloc_session(struct npu_session* sess)
{
	int i;
	if(sess->ncp_info.ncp_addr.vaddr) {
		kfree(sess->ncp_info.ncp_addr.vaddr);
	}

	for(i = 0; i < TESTFILE_NUM; ++i) {
		if(mem.addr_info[i].vaddr)	vfree(mem.addr_info[i].vaddr);
		mem.addr_info[i].vaddr = NULL;
	}
}

static int generate_files(struct npu_session* sess)
{
	int ret = 0;
	int i;
	size_t j;
	mm_segment_t old_fs;
	struct file *fp = NULL;
	char file_name[128];
	size_t size;
	loff_t file_offset = 0;

	u8* data;
	struct ncp_header*	header_obj;

	old_fs = get_fs();
	set_fs(KERNEL_DS);

	/* Setting number vector */

	header_obj = kmalloc(sizeof(struct ncp_header), GFP_KERNEL);
	if(header_obj == NULL) {
		npu_err("Memory allocation for session failed.");
		ret = -ENOMEM;
		goto err_exit;
	}
	header_obj->magic_number1 = NCP_MAGIC1;
	header_obj->magic_number2 = NCP_MAGIC2;
	header_obj->address_vector_cnt = sess->ncp_info.address_vector_cnt = TESTFILE_NUM;
	header_obj->net_id = DEFAULT_NET_ID;
	sess->ncp_info.ncp_addr.vaddr = header_obj;

	mem.address_vector_cnt = TESTFILE_NUM;
	/* Setting each memeory vector and make files */
	for(i = 0; i < TESTFILE_NUM; ++i) {
		size = (i+1) * SIZE_STEP;
		data = vmalloc(size);
		file_offset = 0;

		if(data == NULL) {
			npu_err("Memory allocation failed.");
			ret = -ENOMEM;
			goto err_header;
		}
		for(j = 0; j < size; j++) {
			data[j] = j % 256;
		}

		scnprintf(file_name, sizeof(file_name)-1, FILENAME_FMT, i);
		fp = filp_open(file_name, O_RDWR|O_CREAT, 0666);
		if (!fp) {
			npu_err("Cannot open file [%s].\n", file_name);
			ret = -EBADFD;
			goto err_data;
		}
		ret = kernel_write(fp, data, size, &file_offset);
		if(ret != size) {
			npu_err("File write error on file [%s] ret = %d.\n", file_name, ret);
			ret = -EBADFD;
			goto err_data;
		}

		mem.addr_info[i].size = (u32)size;
		mem.addr_info[i].vaddr = data;
		mem.addr_info[i].av_index = i;
		filp_close(fp, NULL);
		fp = NULL;
	}
	sess->IMB_info = mem.addr_info;
	sess->IMB_cnt = mem.address_vector_cnt;

	ret = 0;
err_data:
	vfree(data);
err_header:
	kfree(header_obj);
err_exit:
	if(fp)		filp_close(fp, NULL);
	set_fs(old_fs);
	return ret;
}

static int setup_failed = 0;
static struct npu_session g_session;
static struct file dummy_file;

static void setup_basic(void)
{
	int	ret;
	int	i;
	char	golden_buf[128];

	memset(&g_session, 0, sizeof(g_session));
	ret = generate_files(&g_session);
	if(ret)		setup_failed = 1;

	/* Load configuration */
	ret = npu_golden_set_open(NULL, &dummy_file);
	if(ret) {
		npu_err("npu_golden_set_open failed.\n");
		setup_failed = 1;
	}
	for(i = 0; i < TESTFILE_NUM; i++) {
		ret = scnprintf(golden_buf, sizeof(golden_buf), GOLDEN_FMT, i, i);
		ret = npu_golden_set_write_kern(&dummy_file, golden_buf, ret, 0);
		if(ret <= 0) {
			npu_err("npu_golden_set_write_kern failed.\n");
			setup_failed = 1;
		}
	}
	ret = npu_golden_set_close(NULL, &dummy_file);
	if(ret) {
		npu_err("npu_golden_set_close failed.\n");
		setup_failed = 1;
	}

	setup_failed = 0;
}

static void teardown_basic(void)
{
	dealloc_session(&g_session);
}

#endif	/* IDIOT_DECL_SECTION */


#undef SETUP_CODE
#undef TEARDOWN_CODE
#define SETUP_CODE      setup_basic();
#define TEARDOWN_CODE   teardown_basic();

TESTDEF(golden_01_basic_setup,
	IDIOT_ASSERT_EQ(setup_failed, 0, %d);
)

TESTDEF(golden_02_basic_compare,
	int 	ret;
	struct vb_container_list vbcl = {
		.index = 0,
	};
	struct npu_frame frame = {
		.session = &g_session,
		.frame_id = 0,
		.av_info = &mem,
		.input = &vbcl,
	};

	IDIOT_ASSERT_EQ(setup_failed, 0, %d);

	frame.session = &g_session;
	frame.frame_id = 0;
	frame.av_info = &mem;
	frame.input = &vbcl;

	ret = npu_golden_compare(&frame);
	IDIOT_ASSERT_EQ(ret, 0, %d);
)

TESTDEF(golden_02_fail_one,
	int 	ret;
	struct vb_container_list vbcl = {
		.index = 0,
	};
	struct npu_frame frame = {
		.session = &g_session,
		.frame_id = 0,
		.av_info = &mem,
		.input = &vbcl,
	};

	IDIOT_ASSERT_EQ(setup_failed, 0, %d);

	/* Make failure data */
	((u8*)mem.addr_info[0].vaddr)[10]++;

	ret = npu_golden_compare(&frame);
	IDIOT_ASSERT_EQ(ret, 1, %d);
)

TESTDEF(golden_03_fail_three,
	int 	ret;
	struct vb_container_list vbcl = {
		.index = 0,
	};
	struct npu_frame frame = {
		.session = &g_session,
		.frame_id = 0,
		.av_info = &mem,
		.input = &vbcl,
	};

	IDIOT_ASSERT_EQ(setup_failed, 0, %d);

	/* Make failure data */
	((u8*)mem.addr_info[0].vaddr)[10]++;
	((u8*)mem.addr_info[1].vaddr)[20]++;
	((u8*)mem.addr_info[4].vaddr)[80]++;

	ret = npu_golden_compare(&frame);
	IDIOT_ASSERT_EQ(ret, 3, %d);
)

TESTDEF(golden_04_fail_all,
	int 	i, j, size;
	int 	ret;
	struct vb_container_list vbcl = {
		.index = 0,
	};
	struct npu_frame frame = {
		.session = &g_session,
		.frame_id = 0,
		.av_info = &mem,
		.input = &vbcl,
	};

	IDIOT_ASSERT_EQ(setup_failed, 0, %d);

	/* Make failure data */
	for(i = 0; i < TESTFILE_NUM; ++i) {
		size = (i+1) * SIZE_STEP;
		for(j = 0; j < size; ++j) {
			((u8*)mem.addr_info[i].vaddr)[j]++;
		}
	}

	ret = npu_golden_compare(&frame);
	IDIOT_ASSERT_NEQ(ret, 0, %d);
)
