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

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

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

/* The file.bin.partial.inc contains characters from 100 to 141 */
static const unsigned char partial_inc_file[] = {
#include <file.bin.partial.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>
};

static const unsigned char partial_gz_inc_file[] = {
#include <file.bin.partial.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 const unsigned char compressed_partial_inc_file[] = {
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x02, 0xff, 0x4b, 0x49, 0x4d, 0x4b, 0xcf, 0xc8,
	0xcc, 0xca, 0xce, 0xc9, 0xcd, 0xcb, 0x2f, 0x28,
	0x2c, 0x2a, 0x2e, 0x29, 0x2d, 0x2b, 0xaf, 0xa8,
	0xac, 0xaa, 0xae, 0xa9, 0xad, 0xab, 0x6f, 0x68,
	0x6c, 0x6a, 0x6e, 0x69, 0x6d, 0x6b, 0xef, 0xe8,
	0xec, 0xea, 0xee, 0xe9, 0x05, 0x00, 0xe7, 0xa1,
	0xc1, 0x22, 0x2a, 0x00, 0x00, 0x00,
};

ZTEST(gen_inc_file, test_gen_inc_file)
{
	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");
	}
}

ZTEST(gen_inc_file, test_gen_partial_inc_file)
{
	int i;

	zassert_equal(sizeof(partial_inc_file), 42, "Invalid partial size file");

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

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

	for (i = 0; i < ref_size; 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], ref_file[i],
			      "Invalid value in inc file");
	}
}

ZTEST(gen_inc_file, test_gen_gz_inc_file_no_mtime)
{
	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, compressed_inc_file,
				sizeof(compressed_inc_file), mtime_zero);
}

ZTEST(gen_inc_file, test_gen_gz_inc_file_mtime_arg)
{
	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, compressed_inc_file,
				sizeof(compressed_inc_file), mtime_test_val);
}

ZTEST(gen_inc_file, test_gen_gz_inc_partial_file)
{
	zassert_equal(sizeof(partial_gz_inc_file), sizeof(compressed_partial_inc_file),
		      "Invalid partial compressed file size");

	do_test_gen_gz_inc_file(partial_gz_inc_file, compressed_partial_inc_file,
				sizeof(compressed_partial_inc_file), NULL);
}


ZTEST_SUITE(gen_inc_file, NULL, NULL, NULL, NULL, NULL);
