/*
 * Copyright (c) 2017 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#include <string.h>
#include <zephyr/types.h>
#include <stdbool.h>
#include <ztest.h>

/* Don't confuse doxygen with missing files */
/**
 * @cond INTERNAL_HIDDEN
 */

/* The file.inc contains characters from 0 to 255 */
static const unsigned char inc_file[] = {
#include <file.bin.inc>
};

static const unsigned char no_mtime_gz_inc_file[] = {
#include <file.bin.gz.inc>
};

static const unsigned char mtime_gz_inc_file[] = {
#include <file.bin.mtime.gz.inc>
};

/**
 * @endcond
 */

static const unsigned char mtime_zero[4] = { 0, 0, 0, 0 };

/* Must match the --gzip-mtime=test_val passed to
 * generate_inc_file_for_target() */
static const unsigned char mtime_test_val[4] = { 42, 0, 0, 0 };

static const unsigned char compressed_inc_file[] = {
	0x1f, 0x8b, 0x08, 0x00, 0xDD, 0xDD, 0xDD, 0xDD,
	0x02, 0xff, 0x01, 0x00, 0x01, 0xff, 0xfe, 0x00,
	0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
	0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
	0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
	0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
	0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
	0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
	0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
	0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40,
	0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
	0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
	0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
	0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60,
	0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
	0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
	0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
	0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80,
	0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
	0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90,
	0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
	0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0,
	0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
	0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0,
	0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8,
	0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
	0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,
	0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
	0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
	0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0,
	0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
	0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
	0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
	0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x73,
	0x8c, 0x05, 0x29, 0x00, 0x01, 0x00, 0x00,
};

static void test_gen_inc_file(void)
{
	int i;

	zassert_equal(sizeof(inc_file), 256, "Invalid size file");

	for (i = 0; i < sizeof(inc_file); i++) {
		zassert_equal(inc_file[i], i, "Invalid value in inc file");
	}
}


static void do_test_gen_gz_inc_file(const unsigned char gz_inc_file[],
				    const unsigned char mtime[4])
{
	int i;

	for (i = 0; i < sizeof(inc_file); i++) {
		if (4 <= i && i < 8) {
			/* Modification time field (4 bytes) in
			 * the gzip header.
			 */
			if (mtime != NULL) { /* NULL arg = random "now" */
				zassert_equal(gz_inc_file[i], mtime[i-4],
					      "Invalid mtime in inc file");
			}

			continue;
		}

		zassert_equal(gz_inc_file[i], compressed_inc_file[i],
			      "Invalid value in inc file");
	}
}

static void test_gen_gz_inc_file_no_mtime(void)
{
	zassert_equal(sizeof(no_mtime_gz_inc_file), sizeof(compressed_inc_file),
		      "Invalid compressed file size");

	do_test_gen_gz_inc_file(no_mtime_gz_inc_file, mtime_zero);
}

static void test_gen_gz_inc_file_mtime_arg(void)
{
	zassert_equal(sizeof(mtime_gz_inc_file), sizeof(compressed_inc_file),
		      "Invalid compressed file size");

	do_test_gen_gz_inc_file(mtime_gz_inc_file, mtime_test_val);
}

void test_main(void)
{
	ztest_test_suite(gen_inc_file_test,
			 ztest_unit_test(test_gen_inc_file),
			 ztest_unit_test(test_gen_gz_inc_file_no_mtime),
			 ztest_unit_test(test_gen_gz_inc_file_mtime_arg)
			 );

	ztest_run_test_suite(gen_inc_file_test);
}
