/*
 * Copyright (c) 2017 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <ztest.h>
#include <flash.h>
#include <dfu/flash_img.h>

void test_collecting(void)
{
	struct device *flash_dev;
	struct flash_img_context ctx;
	u32_t i, j;
	u8_t data[5], temp, k;

	flash_dev = device_get_binding(CONFIG_SOC_FLASH_NRF5_DEV_NAME);

	flash_write_protection_set(flash_dev, false);
	flash_erase(flash_dev, FLASH_AREA_IMAGE_1_OFFSET,
		    FLASH_AREA_IMAGE_1_SIZE);
	flash_write_protection_set(flash_dev, true);

	flash_img_init(&ctx, flash_dev);
	zassert(flash_img_bytes_written(&ctx) == 0, "pass", "fail");

	k = 0;
	for (i = 0; i < 300; i++) {
		for (j = 0; j < ARRAY_SIZE(data); j++) {
			data[j] = k++;
		}
		zassert(flash_img_buffered_write(&ctx, data, sizeof(data),
						 false) == 0, "pass", "fail");
	}

	zassert(flash_img_buffered_write(&ctx, data, 0, true) == 0, "pass",
					 "fail");

	k = 0;
	for (i = 0; i < 300 * sizeof(data); i++) {
		zassert(flash_read(flash_dev, FLASH_AREA_IMAGE_1_OFFSET + i,
				   &temp, 1) == 0, "pass", "fail");
		zassert(temp == k, "pass", "fail");
		k++;
	}
}

void test_main(void *p1, void *p2, void *p3)
{
	ztest_test_suite(test_util, ztest_unit_test(test_collecting));
	ztest_run_test_suite(test_util);
}
