/*
 * Copyright 2017, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * This software may be distributed and modified according to the terms of
 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
 * See "LICENSE_BSD2.txt" for details.
 *
 * @TAG(DATA61_BSD)
 */

#pragma once

/* Include Kconfig variables. */
#include <autoconf.h>
#include <sel4test/gen_config.h>
#include <stdbool.h>

typedef enum test_result {
    /* test passed */
    SUCCESS,
    /* test failed */
    FAILURE,
    /* test corrupted environment, abort tests */
    ABORT,
    /* Start of the free slot/ID to be used to request
     * operations from sel4test-test to sel4test-driver
     * using the same end point
     */
    SEL4TEST_RESULT_FREE
} test_result_t;

/* Communication codes/requests between a server and a client */
typedef enum _sel4test_communication_codes {
    SEL4TEST_TIME_MIN = SEL4TEST_RESULT_FREE,
    /* Client: requests a timeout from the server
     * Server: Notify clients after the elapsed requested time.
     * Previous timeout requests will be overwritten (if ongoing) with
     * new timeout requests.
     */
    SEL4TEST_TIME_TIMEOUT,
    /* Client: requests a timer reset and cancel previous requests
     * Server: Cleans up the resources used from previous requests
     * and stop notifying clients.
     */
    SEL4TEST_TIME_RESET,
    SEL4TEST_TIME_TIMESTAMP,

    SEL4TEST_TIME_MAX,

    SEL4TEST_PROTOBUF_RPC = SEL4TEST_TIME_MAX,

    SEL4TEST_OUTPUT_MAX
} sel4test_output_t;

/* A buffered printf to avoid corrupting xml output */
void sel4test_printf(const char *out);
/* enable printf buffering */
void sel4test_start_printf_buffer(void);
/* dump the current buffer and disable printf buffering */
void sel4test_end_printf_buffer(void);

/* reset the test environment for the next test */
void sel4test_reset(void);

/**
 * Report an error in a test case.
 * Can report multiple errors.
 * This will fail a test case.
 */
void _sel4test_report_error(const char *error, const char *file, int line);

/*
 * Mark the current test as failed. Should
 * only be called once per test case
 */
void _sel4test_failure(const char *failure, const char *file, int line);

/*
 * Mark the current test as fatally failed. The test will be terminated and
 * will not proceed beyond this point.
 */
void _sel4test_abort(const char *failure, const char *file, int line);

/*
 * Indicates if current test passed.
 */
test_result_t sel4test_get_result(void);

static inline bool sel4test_isTimerRPC(int output)
{
    return (output > SEL4TEST_TIME_MIN && output < SEL4TEST_TIME_MAX);
}
