// SPDX-License-Identifier: Apache-2.0
// Copyright (C) 2018 IBM Corp.

#include <assert.h>
#include <experimental/filesystem>
#include <fcntl.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/syslog.h>
#include <unistd.h>

#include "config.h"
#include "common.h"
#include "mbox.h"

extern "C" {
#include "flash.h"
}

#include "vpnor/test/tmpd.hpp"

static constexpr auto BLOCK_SIZE = 0x1000;
static constexpr auto PART_SIZE = BLOCK_SIZE;
static constexpr auto PATCH_SIZE = BLOCK_SIZE / 2;
static constexpr auto UPDATE_SIZE = BLOCK_SIZE;

const std::string toc[] = {
    "partition01=TEST1,00001000,00002000,80,ECC,READWRITE",
};

int main(void)
{
    namespace fs = std::experimental::filesystem;
    namespace test = openpower::virtual_pnor::test;

    struct mbox_context _ctx, *ctx = &_ctx;
    void *map;
    int rc;
    int fd;

    /* Setup */
    memset(ctx, 0, sizeof(mbox_context));

    mbox_vlog = &mbox_log_console;
    verbosity = (verbose)2;

    test::VpnorRoot root(ctx, toc, BLOCK_SIZE);
    std::vector<uint8_t> roContent(PART_SIZE, 0xff);
    root.write("TEST1", roContent.data(), roContent.size());
    /* write_flash doesn't copy the file for us */
    std::vector<uint8_t> patchContent(PATCH_SIZE, 0xaa);
    root.patch("TEST1", patchContent.data(), patchContent.size());

    init_vpnor_from_paths(ctx);

    /* Test */
    std::vector<uint8_t> update(UPDATE_SIZE, 0x55);
    rc = write_flash(ctx, 0x1000, update.data(), update.size());
    assert(rc == 0);

    /* Check that PATCH is modified with the new data */
    fs::path patch = root.patch() / "TEST1";
    assert(UPDATE_SIZE == fs::file_size(patch));
    fd = open(patch.c_str(), O_RDONLY);
    map = mmap(NULL, UPDATE_SIZE, PROT_READ, MAP_SHARED, fd, 0);
    assert(map != MAP_FAILED);
    rc = memcmp(update.data(), map, update.size());
    assert(rc == 0);
    munmap(map, update.size());
    close(fd);

    destroy_vpnor(ctx);
    free(ctx->flash_bmap);

    return rc;
}
