blob: 7083765b5fabc448f0363b25ef3f5d9f0dc582b3 [file] [log] [blame]
/*
* Copyright (c) 2014, STMicroelectronics International N.V.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License Version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
/*************************************************************************
* 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;
}