/** @file
  Provides the basic types and common elements of the unit test framework

  Copyright (c) Microsoft Corporation.<BR>
  Copyright (c) 2019 - 2020, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __UNIT_TEST_TYPES_H__
#define __UNIT_TEST_TYPES_H__

#include <Library/UnitTestLib.h>

///
/// The maximum length of a string stored in the unit test framework
///
#define UNIT_TEST_MAX_STRING_LENGTH  (120)

///
/// The size of a firngerprint used to save/resume execution of a unit test
/// framework.  This is the size of a CRC32 value which is 32-bit value.
///
///
#define UNIT_TEST_FINGERPRINT_SIZE  (sizeof (UINT32))

///
/// The maximum length of a test failure message stored in the unit test
/// framework
///
#define UNIT_TEST_TESTFAILUREMSG_LENGTH  (120)

///
/// FAILURE_TYPE used to record the type of assert that was triggered by a unit
/// test.
///
typedef UINT32 FAILURE_TYPE;
#define FAILURETYPE_NOFAILURE          (0)
#define FAILURETYPE_OTHER              (1)
#define FAILURETYPE_ASSERTTRUE         (2)
#define FAILURETYPE_ASSERTFALSE        (3)
#define FAILURETYPE_ASSERTEQUAL        (4)
#define FAILURETYPE_ASSERTNOTEQUAL     (5)
#define FAILURETYPE_ASSERTNOTEFIERROR  (6)
#define FAILURETYPE_ASSERTSTATUSEQUAL  (7)
#define FAILURETYPE_ASSERTNOTNULL      (8)
#define FAILURETYPE_EXPECTASSERT       (9)

///
/// Unit Test context structure tracked by the unit test framework.
///
typedef struct {
  CHAR8                     *Description;
  CHAR8                     *Name; // can't have spaces and should be short
  CHAR8                     *Log;
  FAILURE_TYPE              FailureType;
  CHAR8                     FailureMessage[UNIT_TEST_TESTFAILUREMSG_LENGTH];
  UINT8                     Fingerprint[UNIT_TEST_FINGERPRINT_SIZE];
  UNIT_TEST_STATUS          Result;
  UNIT_TEST_FUNCTION        RunTest;
  UNIT_TEST_PREREQUISITE    Prerequisite;
  UNIT_TEST_CLEANUP         CleanUp;
  UNIT_TEST_CONTEXT         Context;
  UNIT_TEST_SUITE_HANDLE    ParentSuite;
} UNIT_TEST;

///
/// Structure used to store the set of unit tests in a unit test suite as a list.
///
typedef struct {
  LIST_ENTRY    Entry;
  UNIT_TEST     UT;
} UNIT_TEST_LIST_ENTRY;

///
/// Unit Test Suite context structure tracked by the unit test framework.
///
typedef struct {
  UINTN                         NumTests;
  CHAR8                         *Title;
  CHAR8                         *Name;
  UINT8                         Fingerprint[UNIT_TEST_FINGERPRINT_SIZE];
  UNIT_TEST_SUITE_SETUP         Setup;
  UNIT_TEST_SUITE_TEARDOWN      Teardown;
  LIST_ENTRY                    TestCaseList;   // UNIT_TEST_LIST_ENTRY
  UNIT_TEST_FRAMEWORK_HANDLE    ParentFramework;
} UNIT_TEST_SUITE;

///
/// Structure used to store the set of unit test suites in a unit test framework
/// as a list.
///
typedef struct {
  LIST_ENTRY         Entry;
  UNIT_TEST_SUITE    UTS;
} UNIT_TEST_SUITE_LIST_ENTRY;

///
/// Unit Test Framework context structure tracked by the unit test framework.
///
typedef struct {
  CHAR8         *Title;
  CHAR8         *ShortTitle;    // This title should contain NO spaces or non-filename characters. Is used in reporting and serialization.
  CHAR8         *VersionString;
  CHAR8         *Log;
  UINT8         Fingerprint[UNIT_TEST_FINGERPRINT_SIZE];
  LIST_ENTRY    TestSuiteList;  // UNIT_TEST_SUITE_LIST_ENTRY
  EFI_TIME      StartTime;
  EFI_TIME      EndTime;
  UNIT_TEST     *CurrentTest;
  VOID          *SavedState;    // This is an instance of UNIT_TEST_SAVE_HEADER*, if present.
} UNIT_TEST_FRAMEWORK;

///
/// Serialized version of a unit test
///
typedef struct {
  UINT32              Size;                                       // Size of the UNIT_TEST_SAVE_TEST including Log[]
  UINT8               Fingerprint[UNIT_TEST_FINGERPRINT_SIZE];    // Fingerprint of the test itself.
  CHAR8               FailureMessage[UNIT_TEST_TESTFAILUREMSG_LENGTH];
  FAILURE_TYPE        FailureType;
  UNIT_TEST_STATUS    Result;
  CHAR8               Log[];
} UNIT_TEST_SAVE_TEST;

///
/// Serialized version of a unit test context
///
typedef struct {
  UINT32    Size;                                    // Size of the UNIT_TEST_SAVE_CONTEXT including Data[]
  UINT8     Fingerprint[UNIT_TEST_FINGERPRINT_SIZE]; // Fingerprint of the corresponding test.
  UINT8     Data[];                                  // Actual data of the context.
} UNIT_TEST_SAVE_CONTEXT;

///
/// Serialized version of unit test framework
///
typedef struct {
  UINT8       Version;
  UINT32      SaveStateSize;                           // Size of the entire serialized buffer.
  UINT8       Fingerprint[UNIT_TEST_FINGERPRINT_SIZE]; // Fingerprint of the framework that has been saved.
  EFI_TIME    StartTime;
  UINT32      TestCount;
  BOOLEAN     HasSavedContext;
  // UNIT_TEST_SAVE_TEST    Tests[];         // Array of structures starts here.
  // UNIT_TEST_SAVE_CONTEXT SavedContext[];  // Saved context for the currently running test.
  // CHAR8                  Log[];           // NOTE: Not yet implemented!!
} UNIT_TEST_SAVE_HEADER;

/**
  This function is responsible for initializing the log buffer for a single test. It can
  be used internally, but may also be consumed by the test framework to add pre-existing
  data to a log before it's used.

  @param[in,out]  TestHandle    A handle to the test being initialized.
  @param[in]      Buffer        [Optional] A pointer to pre-existing log data that should
                                be used to initialize the log. Should include a NULL terminator.
  @param[in]      BufferSize    [Optional] The size of the pre-existing log data.

**/
VOID
EFIAPI
UnitTestLogInit (
  IN OUT UNIT_TEST  *Test,
  IN UINT8          *Buffer     OPTIONAL,
  IN UINTN          BufferSize  OPTIONAL
  );

/**
  Internal helper function to return a handle to the currently executing framework.
  This function is generally used for communication within the UnitTest framework, but is
  defined here so that it can be consumed by the Assertion and Logging macros.

  There should be no need to consume as a test writer, but it's there if you need it.

  @retval     Handle to the currently executing test framework.

**/
UNIT_TEST_FRAMEWORK_HANDLE
GetActiveFrameworkHandle (
  VOID
  );

#endif
