// SPDX-License-Identifier: GPL-2.0
|
/*
|
* Copyright (c) 2014, STMicroelectronics International N.V.
|
*/
|
|
/*************************************************************************
|
* 1. Includes
|
************************************************************************/
|
#include "adbg_int.h"
|
|
/*************************************************************************
|
* 2. Definition of external constants and variables
|
************************************************************************/
|
|
/*************************************************************************
|
* 3. File scope types, constants and variables
|
************************************************************************/
|
|
/*************************************************************************
|
* 4. Declaration of file local functions
|
************************************************************************/
|
|
static bool ADBG_AssertHelper(ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber, const bool ExpressionOK);
|
|
static const char *ADBG_GetFileBase(const char *const FileName_p);
|
|
/*************************************************************************
|
* 5. Definition of external functions
|
************************************************************************/
|
bool Do_ADBG_Expect(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const int Expected,
|
const int Got,
|
const char *const GotVarName_p,
|
const ADBG_EnumTable_t *const EnumTable_p
|
)
|
{
|
if (ADBG_AssertHelper(Case_p, FileName_p, LineNumber, Expected == Got))
|
return true;
|
|
if (EnumTable_p != NULL) {
|
Do_ADBG_Log("%s:%d: %s has an unexpected value: 0x%x = %s, "
|
"expected 0x%x = %s",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
GotVarName_p,
|
Got, Do_ADBG_GetEnumName(Got, EnumTable_p),
|
Expected,
|
Do_ADBG_GetEnumName(Expected, EnumTable_p));
|
} else {
|
Do_ADBG_Log(
|
"%s:%d: %s has an unexpected value: 0x%x, expected 0x%x",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
GotVarName_p, Got, Expected);
|
}
|
|
return false;
|
}
|
|
bool Do_ADBG_ExpectNot(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const int NotExpected,
|
const int Got,
|
const char *const GotVarName_p,
|
const ADBG_EnumTable_t *const EnumTable_p
|
)
|
{
|
if (ADBG_AssertHelper(Case_p, FileName_p, LineNumber, NotExpected !=
|
Got))
|
return true;
|
|
if (EnumTable_p != NULL) {
|
Do_ADBG_Log("%s:%d: %s has an unexpected value: 0x%x = %s, "
|
"expected 0x%x = %s",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
GotVarName_p,
|
Got, Do_ADBG_GetEnumName(Got, EnumTable_p),
|
NotExpected,
|
Do_ADBG_GetEnumName(NotExpected, EnumTable_p));
|
} else {
|
Do_ADBG_Log(
|
"%s:%d: %s has an unexpected value: 0x%zu, expected 0x%zu",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
GotVarName_p, (size_t)Got, (size_t)NotExpected);
|
}
|
|
return false;
|
}
|
|
bool Do_ADBG_ExpectBuffer(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const void *const ExpectedBuffer_p,
|
const size_t ExpectedBufferLength,
|
const char *const GotBufferName_p,
|
const void *const GotBuffer_p,
|
const char *const GotBufferLengthName_p,
|
const size_t GotBufferLength
|
)
|
{
|
if (!ADBG_AssertHelper(Case_p, FileName_p, LineNumber,
|
ExpectedBufferLength == GotBufferLength)) {
|
Do_ADBG_Log(
|
"%s:%d: %s has an unexpected value: %zu, expected %zu",
|
ADBG_GetFileBase(
|
FileName_p), LineNumber,
|
GotBufferLengthName_p, GotBufferLength,
|
ExpectedBufferLength);
|
return false;
|
}
|
|
if (!ADBG_AssertHelper(Case_p, FileName_p, LineNumber,
|
memcmp(ExpectedBuffer_p, GotBuffer_p,
|
ExpectedBufferLength) == 0)) {
|
Do_ADBG_Log("%s:%d: %s has an unexpected content:",
|
ADBG_GetFileBase(
|
FileName_p), LineNumber, GotBufferName_p);
|
Do_ADBG_Log("Got");
|
Do_ADBG_HexLog(GotBuffer_p, GotBufferLength, 16);
|
Do_ADBG_Log("Expected");
|
Do_ADBG_HexLog(ExpectedBuffer_p, ExpectedBufferLength, 16);
|
return false;
|
}
|
|
return true;
|
}
|
|
bool Do_ADBG_ExpectPointer(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const void *Expected_p,
|
const void *Got_p,
|
const char *const GotVarName_p
|
)
|
{
|
if (ADBG_AssertHelper(Case_p, FileName_p, LineNumber, Expected_p ==
|
Got_p))
|
return true;
|
|
Do_ADBG_Log("%s:%d: %s has an unexpected value: %p, expected %p",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
GotVarName_p, Got_p, Expected_p);
|
|
return false;
|
}
|
|
|
|
bool Do_ADBG_ExpectPointerNotNULL(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const void *Got_p,
|
const char *const GotVarName_p
|
)
|
{
|
if (ADBG_AssertHelper(Case_p, FileName_p, LineNumber, Got_p != NULL))
|
return true;
|
|
Do_ADBG_Log("%s:%d: %s has an unexpected value: %p, expected not NULL",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
GotVarName_p, Got_p);
|
|
return false;
|
}
|
|
bool Do_ADBG_ExpectCompareSigned(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const long Value1,
|
const long Value2,
|
const bool Result,
|
const char *const Value1Str_p,
|
const char *const ComparStr_p,
|
const char *const Value2Str_p
|
)
|
{
|
if (!ADBG_AssertHelper(Case_p, FileName_p, LineNumber, Result)) {
|
Do_ADBG_Log(
|
"%s:%d: Expression \"%s %s %s\" (%ld %s %ld) is false",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
Value1Str_p, ComparStr_p, Value2Str_p,
|
Value1, ComparStr_p, Value2);
|
}
|
return Result;
|
}
|
|
bool Do_ADBG_ExpectCompareUnsigned(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const unsigned long Value1,
|
const unsigned long Value2,
|
const bool Result,
|
const char *const Value1Str_p,
|
const char *const ComparStr_p,
|
const char *const Value2Str_p
|
)
|
{
|
if (!ADBG_AssertHelper(Case_p, FileName_p, LineNumber, Result)) {
|
Do_ADBG_Log(
|
"%s:%d: Expression \"%s %s %s\" (%lu %s %lu) is false",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
Value1Str_p, ComparStr_p, Value2Str_p,
|
Value1, ComparStr_p, Value2);
|
}
|
return Result;
|
}
|
|
|
bool Do_ADBG_ExpectComparePointer(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const void *const Value1_p,
|
const void *const Value2_p,
|
const bool Result,
|
const char *const Value1Str_p,
|
const char *const ComparStr_p,
|
const char *const Value2Str_p
|
)
|
{
|
if (!ADBG_AssertHelper(Case_p, FileName_p, LineNumber, Result)) {
|
Do_ADBG_Log(
|
"%s:%d: Expression \"%s %s %s\" (%p %s %p) is false",
|
ADBG_GetFileBase(FileName_p), LineNumber,
|
Value1Str_p, ComparStr_p, Value2Str_p,
|
Value1_p, ComparStr_p, Value2_p);
|
}
|
return Result;
|
}
|
|
/*************************************************************************
|
* 6. Definitions of internal functions
|
************************************************************************/
|
static bool ADBG_AssertHelper(
|
ADBG_Case_t *const Case_p,
|
const char *const FileName_p,
|
const int LineNumber,
|
const bool ExpressionOK
|
)
|
{
|
ADBG_SubCase_t *SubCase_p = Case_p->CurrentSubCase_p;
|
|
IDENTIFIER_NOT_USED(Case_p)
|
|
SubCase_p->Result.NumTests++;
|
|
if (!ExpressionOK) {
|
SubCase_p->Result.NumFailedTests++;
|
if (SubCase_p->Result.FirstFailedRow == 0) {
|
SubCase_p->Result.FirstFailedRow = LineNumber;
|
SubCase_p->Result.FirstFailedFile_p = ADBG_GetFileBase(
|
FileName_p);
|
}
|
}
|
|
return ExpressionOK;
|
}
|
|
static const char *ADBG_GetFileBase(const char *const FileName_p)
|
{
|
const char *Ch_p = FileName_p;
|
const char *Base_p = FileName_p;
|
|
while (*Ch_p != '\0') {
|
if (*Ch_p == '\\')
|
Base_p = Ch_p + 1;
|
|
Ch_p++;
|
}
|
|
return Base_p;
|
}
|