/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
/* Test pldm_msgbuf_extract() separately because we can't do _Generic() in C++
 * code, i.e. gtest */

#include <endian.h>
#include <float.h>
#include <stdio.h>
#include <stdlib.h>

/* We're exercising the implementation so disable the asserts for now */
#ifndef NDEBUG
#define NDEBUG 1
#endif
#include "msgbuf.h"

/* Given we disabled asserts above, set up our own expectation framework */
#define expect(cond) __expect(__func__, __LINE__, (cond))
#define __expect(fn, line, cond)                                               \
    do                                                                         \
    {                                                                          \
        if (!(cond))                                                           \
        {                                                                      \
            fprintf(stderr, "%s:%d: failed expectation: %s\n", fn, line,       \
                    #cond);                                                    \
            exit(EXIT_FAILURE);                                                \
        }                                                                      \
    } while (0)

static void test_msgbuf_extract_generic_uint8(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint8_t buf[1] = {0xa5};
    uint8_t val;

    expect(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctx, val) == 0);
    expect(val == 0xa5);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_extract_generic_int8(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    int8_t buf[1] = {-1};
    int8_t val;

    expect(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctx, val) == 0);
    expect(val == -1);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_extract_generic_uint16(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint16_t buf[1] = {0x5aa5};
    uint16_t val;

    expect(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctx, val) == 0);
    expect(val == 0x5aa5);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_extract_generic_int16(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    int16_t buf[1] = {(int16_t)(htole16((uint16_t)INT16_MIN))};
    int16_t val;

    expect(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctx, val) == 0);
    expect(val == INT16_MIN);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_extract_generic_uint32(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint32_t buf[1] = {0x5a00ffa5};
    uint32_t val;

    expect(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctx, val) == 0);
    expect(val == 0x5a00ffa5);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_extract_generic_int32(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    int32_t buf[1] = {(int32_t)(htole32((uint32_t)INT32_MIN))};
    int32_t val;

    expect(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctx, val) == 0);
    expect(val == INT32_MIN);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_extract_generic_real32(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint32_t buf[1];
    uint32_t xform;
    real32_t val;

    val = FLT_MAX;
    memcpy(&xform, &val, sizeof(val));
    buf[0] = htole32(xform);
    val = 0;

    expect(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctx, val) == 0);
    expect(val == FLT_MAX);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_extract_array_generic_uint8(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint32_t buf[1] = {0};
    uint8_t arr[1];

    expect(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract_array(ctx, 1, arr, 1) == 0);
    expect(arr[0] == 0);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_insert_generic_int32(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    int32_t src = -12345;
    int32_t checkVal = 0;
    uint8_t buf[sizeof(int32_t)] = {0};

    expect(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_insert(ctx, src) == 0);

    struct pldm_msgbuf _ctxExtract;
    struct pldm_msgbuf* ctxExtract = &_ctxExtract;

    expect(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctxExtract, checkVal) == 0);

    expect(src == checkVal);
    expect(pldm_msgbuf_complete(ctxExtract) == 0);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_insert_generic_uint32(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint32_t src = 0xf1223344;
    uint32_t checkVal = 0;
    uint8_t buf[sizeof(uint32_t)] = {0};

    expect(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_insert(ctx, src) == 0);

    struct pldm_msgbuf _ctxExtract;
    struct pldm_msgbuf* ctxExtract = &_ctxExtract;

    expect(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctxExtract, checkVal) == 0);

    expect(src == checkVal);
    expect(pldm_msgbuf_complete(ctxExtract) == 0);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_insert_generic_uint16(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint16_t src = 0xf344;
    uint16_t checkVal = 0;
    uint8_t buf[sizeof(uint16_t)] = {0};

    expect(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(uint16_t)) == 0);
    expect(pldm_msgbuf_insert(ctx, src) == 0);

    struct pldm_msgbuf _ctxExtract;
    struct pldm_msgbuf* ctxExtract = &_ctxExtract;

    expect(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctxExtract, checkVal) == 0);

    expect(src == checkVal);
    expect(pldm_msgbuf_complete(ctxExtract) == 0);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_insert_generic_int16(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    int16_t src = -12;
    int16_t checkVal = 0;
    uint8_t buf[sizeof(int16_t)] = {0};

    expect(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(uint16_t)) == 0);
    expect(pldm_msgbuf_insert(ctx, src) == 0);

    struct pldm_msgbuf _ctxExtract;
    struct pldm_msgbuf* ctxExtract = &_ctxExtract;

    expect(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctxExtract, checkVal) == 0);

    expect(src == checkVal);
    expect(pldm_msgbuf_complete(ctxExtract) == 0);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_insert_generic_uint8(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint8_t src = 0xf4;
    uint8_t checkVal = 0;
    uint8_t buf[sizeof(uint8_t)] = {0};

    expect(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_insert(ctx, src) == 0);

    struct pldm_msgbuf _ctxExtract;
    struct pldm_msgbuf* ctxExtract = &_ctxExtract;

    expect(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctxExtract, checkVal) == 0);

    expect(src == checkVal);
    expect(pldm_msgbuf_complete(ctxExtract) == 0);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_insert_generic_int8(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    int8_t src = -4;
    int8_t checkVal = 0;
    uint8_t buf[sizeof(int8_t)] = {0};

    expect(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_insert(ctx, src) == 0);

    struct pldm_msgbuf _ctxExtract;
    struct pldm_msgbuf* ctxExtract = &_ctxExtract;

    expect(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract(ctxExtract, checkVal) == 0);

    expect(src == checkVal);
    expect(pldm_msgbuf_complete(ctxExtract) == 0);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

static void test_msgbuf_insert_array_generic_uint8(void)
{
    struct pldm_msgbuf _ctx;
    struct pldm_msgbuf* ctx = &_ctx;
    uint8_t src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
    uint8_t buf[6] = {0};
    uint8_t retBuff[6] = {0};

    expect(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_insert_array(ctx, sizeof(src), src, sizeof(src)) == 0);

    struct pldm_msgbuf _ctxExtract;
    struct pldm_msgbuf* ctxExtract = &_ctxExtract;

    expect(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)) == 0);
    expect(pldm_msgbuf_extract_array(ctxExtract, sizeof(retBuff), retBuff,
                                     sizeof(retBuff)) == 0);

    expect(memcmp(src, retBuff, sizeof(retBuff)) == 0);
    expect(pldm_msgbuf_complete(ctxExtract) == 0);
    expect(pldm_msgbuf_complete(ctx) == 0);
}

typedef void (*testfn)(void);

static const testfn tests[] = {test_msgbuf_extract_generic_uint8,
                               test_msgbuf_extract_generic_int8,
                               test_msgbuf_extract_generic_uint16,
                               test_msgbuf_extract_generic_int16,
                               test_msgbuf_extract_generic_uint32,
                               test_msgbuf_extract_generic_int32,
                               test_msgbuf_extract_generic_real32,
                               test_msgbuf_extract_array_generic_uint8,
                               test_msgbuf_insert_generic_uint8,
                               test_msgbuf_insert_generic_int8,
                               test_msgbuf_insert_generic_uint16,
                               test_msgbuf_insert_generic_int16,
                               test_msgbuf_insert_generic_uint32,
                               test_msgbuf_insert_generic_int32,
                               test_msgbuf_insert_array_generic_uint8,
                               NULL};

int main(void)
{
    testfn const* testp = &tests[0];

    while (*testp)
    {
        (*testp)();
        testp++;
    }

    return 0;
}
