#ifndef EXITEST_TEST_H_INCLUDED #define EXITEST_TEST_H_INCLUDED #include struct et_test; typedef u32 et_status; /* Test passed. */ #define ET_STATUS_PASS (et_status)0x00 /* Test failed. */ #define ET_STATUS_FAIL (et_status)0x01 /* Test skipped or not applicable. */ #define ET_STATUS_SKIP (et_status)0x02 /* Internal error during testing. */ #define ET_STATUS_ERROR (et_status)0x03 #define ET_STATUS_MASK (et_status)0x03 #define ET_STATUS_GET_BASE(_status) ((et_status)(_status) & ~((1u << ET_STATUS_ERRCODE_SHIFT) - 1)) #define ET_STATUS_ERRCODE_SHIFT 2u #define ET_STATUS_ERRCODE_MASK (((1u << ET_STATUS_PRIVATE_SHIFT) - 1) & ~ET_STATUS_MASK) #define ET_STATUS_MAKE_ERRCODE(_code) (((et_status)(_code) << ET_STATUS_ERRCODE_SHIFT) & ET_STATUS_ERRCODE_MASK) #define ET_STATUS_GET_ERRCODE(_status) (((et_status)(_status) & ET_STATUS_ERRCODE_MASK) >> ET_STATUS_ERRCODE_SHIFT) #define ET_STATUS_PRIVATE_SHIFT 8u #define ET_STATUS_GET_PRIVATE(_status) ((et_status)(_status) >> ET_STATUS_PRIVATE_SHIFT) #define ET_STATUS_MAKE_PRIVATE(_exp) ((et_status)(_exp) << ET_STATUS_PRIVATE_SHIFT) #define ET_STATUS_PRIVATE_MASK (ET_STATUS_MAKE_PRIVATE(~0u)) typedef enum { ET_TEST_INTERACTIVE = 0x0001u, ET_TEST_ESSENTIAL = 0x0002u } et_test_flags; typedef enum { ET_ERRCODE_NONE = ET_STATUS_MAKE_ERRCODE(0), ET_ERRCODE_BAD_ALLOC = ET_STATUS_MAKE_ERRCODE(0x01u), /* Error code is test-specific */ ET_ERRCODE_PRIVATE = ET_STATUS_MAKE_ERRCODE(~0u), } et_status_errcode; /* returns 1 to continue testing, 0 when test is complete (call finish for status) */ typedef int (et_test_setup_proc)(struct et_test *test, void *work, int exi_channel); typedef int (et_test_tick_proc)(struct et_test *test, void *work); typedef et_status (et_test_finish_proc)(struct et_test *test, void *work); /* translates a status code into a readable message. The returned pointer is a static string, and may not have all the information * as if a writeable buffer is passed into the function. * * Tests: do not write into out if outbuf_sz is too small. Try to keep the max message length within 256 bytes. */ typedef const char *(et_test_translate_proc)(struct et_test *test, char *out, size_t outbuf_sz, et_status status); struct et_test { et_test_flags flags; const char *name; size_t work_size; et_test_setup_proc *setup_f; et_test_tick_proc *tick_f; et_test_finish_proc *finish_f; et_test_translate_proc *trans_f; const void *priv_data[4]; }; /* Array of tests. */ extern const struct et_test et_tests[]; extern const size_t et_ntests; #endif /* include guard */