diff options
Diffstat (limited to 'longbow/src/LongBow/Reporting/ANSITerm')
5 files changed, 647 insertions, 0 deletions
diff --git a/longbow/src/LongBow/Reporting/ANSITerm/longBowReportANSITerminal_About.c b/longbow/src/LongBow/Reporting/ANSITerm/longBowReportANSITerminal_About.c new file mode 100644 index 00000000..e12c7b37 --- /dev/null +++ b/longbow/src/LongBow/Reporting/ANSITerm/longBowReportANSITerminal_About.c @@ -0,0 +1,44 @@ +// DO NOT EDIT THIS FILE. IT IS AUTOMATICALLY GENERATED. +// longbow-generate-about 1.0.20170214.46e2c73a 2017-02-14T20:35:31Z + +#include "longBowReportANSITerminal_About.h" + +const char *longBowReportANSITerminal_What = "@(#)" "LongBow ANSI Terminal Reporter " RELEASE_VERSION " 2017-02-14T21:39:44.348378" + "@(#)" "\tCopyright (c) 2017 Cisco and/or its affiliates."; + +const char * +longBowReportANSITerminalAbout_Name(void) +{ + return "LongBow ANSI Terminal Reporter"; +} + +const char * +longBowReportANSITerminalAbout_Version(void) +{ + return RELEASE_VERSION; +} + +const char * +longBowReportANSITerminalAbout_About(void) +{ + return "LongBow ANSI Terminal Reporter "RELEASE_VERSION " 2017-02-14T21:39:44.348378" "\nCopyright (c) 2017 Cisco and/or its affiliates.\n"; +} + +const char * +longBowReportANSITerminalAbout_MiniNotice(void) +{ + return "Copyright (c) 2017 Cisco and/or its affiliates.\n"; +} + +const char * +longBowReportANSITerminalAbout_ShortNotice(void) +{ + return "Copyright (c) 2017 Cisco and/or its affiliates.\n"; +} + +const char * +longBowReportANSITerminalAbout_LongNotice(void) +{ + return "Copyright (c) 2017 Cisco and/or its affiliates.\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n\n"; +} + diff --git a/longbow/src/LongBow/Reporting/ANSITerm/longBowReportANSITerminal_About.h b/longbow/src/LongBow/Reporting/ANSITerm/longBowReportANSITerminal_About.h new file mode 100755 index 00000000..8dd3230c --- /dev/null +++ b/longbow/src/LongBow/Reporting/ANSITerm/longBowReportANSITerminal_About.h @@ -0,0 +1,54 @@ +// DO NOT EDIT THIS FILE. IT IS AUTOMATICALLY GENERATED. +// longbow-generate-about 1.0.20170214.46e2c73a 2017-02-14T20:35:31Z + +#ifndef longBowReportANSITerminal_About_h +#define longBowReportANSITerminal_About_h +/** + * Embedded string containing information for the what(1) command. + * + */ +extern const char *longBowReportANSITerminal_What; + +/** + * Return the name as a C string. + * + * @return The name as a C string. + */ +const char *longBowReportANSITerminalAbout_Name(void); + +/** + * Return the version as a C string. + * + * @return The version as a C string. + */ +const char *longBowReportANSITerminalAbout_Version(void); + +/** + * Return the About text as a C string. + * + * @return The About text as a C string. + */ +const char *longBowReportANSITerminalAbout_About(void); + +/** + * Return the minimum copyright notice as a C string. + * + * @return The minimum copyright notice as a C string. + */ +const char *longBowReportANSITerminalAbout_MiniNotice(void); + +/** + * Return the short copyright notice as a C string. + * + * @return The short copyright notice as a C string. + */ +const char *longBowReportANSITerminalAbout_ShortNotice(void); + +/** + * Return the long copyright notice as a C string. + * + * @return The long copyright notice as a C string. + */ +const char *longBowReportANSITerminalAbout_LongNotice(void); + +#endif // longBowReportANSITerminal_About_h diff --git a/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Runtime.c b/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Runtime.c new file mode 100644 index 00000000..60ca4d42 --- /dev/null +++ b/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Runtime.c @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + */ +#include <config.h> + +#include <stdio.h> +#include <stdarg.h> +#include <assert.h> + +#include <LongBow/Reporting/ANSITerm/longBowReport_Runtime.h> +#include <LongBow/private/longBow_Memory.h> + +static const char *ansiRed = "\x1b[31m"; +static const char *ansiGreen = "\x1b[32m"; +static const char *ansiYellow = "\x1b[33m"; +static const char *ansiMagenta = "\x1b[35m"; +static const char *ansiReset = "\x1b[0m"; + +static void +_printGreen(void) +{ + printf("%s", ansiGreen); +} + +static void +_printYellow(void) +{ + printf("%s", ansiYellow); +} + +static void +_printMagenta(void) +{ + printf("%s", ansiMagenta); +} + +static void +_printReset(void) +{ + printf("%s", ansiReset); + fflush(stdout); +} + +static void +_longBowReportRuntime_RedPrintf(const char *format, va_list args) +{ + longBowReportRuntime_PrintRed(); + vprintf(format, args); + _printReset(); +} + +static void +_longBowReportRuntime_YellowPrintf(const char *format, va_list args) +{ + _printYellow(); + vprintf(format, args); + _printReset(); +} + +void +longBowReportRuntime_PrintRed(void) +{ + printf("%s", ansiRed); +} + +void +longBowReportRuntime_RedPrintf(const char *format, ...) +{ + va_list args; + va_start(args, format); + _longBowReportRuntime_RedPrintf(format, args); + va_end(args); +} + +void +longBowReportRuntime_GreenPrintf(const char *format, ...) +{ + _printGreen(); + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); + _printReset(); +} + +void +longBowReportRuntime_MagentaPrintf(const char *format, ...) +{ + _printMagenta(); + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); + _printReset(); +} + +void +longBowReportRuntime_YellowPrintf(const char *format, ...) +{ + va_list args; + va_start(args, format); + + _longBowReportRuntime_YellowPrintf(format, args); + + va_end(args); +} + +void +longBowReportRuntime_ParseSuppress(LongBowReportConfig *result, const char *key) +{ + for (size_t i = 0; i < strlen(key); i++) { + if (*key == 'X') { + result->suppress_report.untested = 1; + } else if (*key == '.') { + result->suppress_report.succeeded = 1; + } else if (*key == 'S') { + result->suppress_report.skipped = 1; + } else if (*key == 'W') { + result->suppress_report.warned = 1; + } else if (*key == 's') { + result->suppress_report.setup_failed = 1; + } else if (*key == 't') { + result->suppress_report.teardown_failed = 1; + } else if (*key == 'w') { + result->suppress_report.teardown_warned = 1; + } else if (*key == 'F') { + result->suppress_report.failed = 1; + } else if (*key == 'T') { + result->suppress_report.stopped = 1; + } else if (*key == 'U') { + result->suppress_report.unimplemented = 1; + } else { + printf("Unknown suppression key '%c'\n", *key); + } + } +} + +LongBowReportConfig * +longBowReportRuntime_Create(int argc, char *argv[]) +{ + static const char *prefix = "--report"; + size_t prefixLength = strlen(prefix); + + LongBowReportConfig *result = longBowMemory_Allocate(sizeof(LongBowReportConfig)); + + for (int i = 0; i < argc; i++) { + if (strncmp(prefix, argv[i], prefixLength) == 0) { + if (strcmp("--report-suppress", argv[i]) == 0) { + longBowReportRuntime_ParseSuppress(result, argv[i + 1]); + i++; + } + } else if (strcmp("--help", argv[i]) == 0) { + printf("Options for LongBow Report ANSI Terminal\n"); + printf(" --report-suppress [STFU.XWstw] Suppress the display of specific reports.\n"); + printf(" S - suppress the report of a skipped test.\n"); + printf(" T - suppress the report of a stopped test.\n"); + printf(" F - suppress the report of a failed test.\n"); + printf(" U - suppress the report of an unimplemented test.\n"); + printf(" . - suppress the report of a successful test.\n"); + printf(" X - suppress the report of an untested test.\n"); + printf(" W - suppress the report of a warned test.\n"); + printf(" s - suppress the report of a setup failure.\n"); + printf(" t - suppress the report of a tear-down failure.\n"); + printf(" w - suppress the report of a tear-down warning.\n"); + free(result); + return NULL; + } + } + + return result; +} + +void +longBowReportRuntime_Destroy(LongBowReportConfig **reportPtr) +{ + longBowMemory_Deallocate((void **) reportPtr); +} + +static void +_EventPrint(const LongBowEvent *event) +{ + if (longBowEventType_IsSuppressAlert(longBowEvent_GetEventType(event)) == false) { + char *location = longBowLocation_ToString(longBowEvent_GetLocation(event)); + printf("%s %s %s %s\r\n", + longBowEvent_GetName(event), location, longBowEvent_GetKind(event), longBowEvent_GetMessage(event)); + + if (longBowEventType_IsSuppressBacktrace(longBowEvent_GetEventType(event)) == false) { + char **strs = longBowEvent_CreateSymbolicCallstack(event); + if (strs != NULL) { + for (size_t i = 0; i < longBowEvent_GetCallStackLength(event); ++i) { + printf("%s\r\n", strs[i]); + } + free(strs); + } + } + fflush(stdout); + free(location); + } +} + +void +longBowReportRuntime_Event(const LongBowEvent *event) +{ + LongBowStatus status = longBowEventType_GetStatus(longBowEvent_GetEventType(event)); + switch (status) { + case LongBowStatus_DONTCARE: + case LongBowStatus_UNTESTED: + break; + + /* successful */ + case LONGBOW_STATUS_SUCCEEDED: + // If this happens, there is an error in the encoding of the LongBowEventType. + longBowReportRuntime_PrintRed(); + _EventPrint(event); + _printReset(); + break; + + case LongBowStatus_WARNED: + case LongBowStatus_TEARDOWN_WARNED: + case LONGBOW_STATUS_SKIPPED: + case LongBowStatus_UNIMPLEMENTED: + case LongBowStatus_IMPOTENT: + case LONGBOW_STATUS_MEMORYLEAK: + case LONGBOW_STATUS_SETUP_SKIPTESTS: + _printYellow(); + _EventPrint(event); + _printReset(); + break; + + /* failure */ + case LONGBOW_STATUS_FAILED: + case LongBowStatus_STOPPED: + case LONGBOW_STATUS_TEARDOWN_FAILED: + case LONGBOW_STATUS_SETUP_FAILED: + case LongBowStatus_SIGNALLED: + longBowReportRuntime_PrintRed(); + _EventPrint(event); + _printReset(); + break; + + case LongBowStatus_LIMIT: // fall through + default: + _printYellow(); + _EventPrint(event); + _printReset(); + break; + } +} + +void +longBowReportRuntime_Message(const char *format, ...) +{ + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); +} + +void +longBowReportRuntime_Warning(const char *format, ...) +{ + va_list args; + va_start(args, format); + longBowReportRuntime_YellowPrintf("WARNING "); + _longBowReportRuntime_YellowPrintf(format, args); + va_end(args); +} + +void +longBowReportRuntime_Error(const char *format, ...) +{ + va_list args; + va_start(args, format); + longBowReportRuntime_RedPrintf("FAILURE "); + _longBowReportRuntime_RedPrintf(format, args); + va_end(args); +} diff --git a/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Runtime.h b/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Runtime.h new file mode 100755 index 00000000..2e03f322 --- /dev/null +++ b/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Runtime.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file ANSITerm/longBowReport_Runtime.h + * @ingroup reporting + * @brief ANSI Terminal Reporting + * + */ +#ifndef LongBow_longBowReport_ANSITerm_Runtime_h +#define LongBow_longBowReport_ANSITerm_Runtime_h + +#include <stdio.h> +#include <stdarg.h> + +#include <LongBow/Reporting/longBowReport_Runtime.h> + +/** + * Begin printing in red. + * + */ +void longBowReportRuntime_PrintRed(void); + +/** + * Print the formatted string in red. + * + */ +void longBowReportRuntime_RedPrintf(const char *format, ...); + +/** + * Print the formatted string in green. + * + */ +void longBowReportRuntime_GreenPrintf(const char *format, ...); + +/** + * Print the formatted string in yellow. + * + */ +void longBowReportRuntime_YellowPrintf(const char *format, ...); + +/** + * Print the formatted string in magenta. + * + */ +void longBowReportRuntime_MagentaPrintf(const char *format, ...); + +/** + * Parse the given key and set the corresponding LongBowReportConfig to suppress reports. + * + * @param [in] config A valid LongBowReportConfig instance. + * @param [in] key A nul-terminated C string consisting of one or more of the characters, X.SWstwFTU + */ +void longBowReportRuntime_ParseSuppress(LongBowReportConfig *config, const char *key); +#endif // LongBow_longBowReport_ANSITerm_Runtime_h diff --git a/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Testing.c b/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Testing.c new file mode 100644 index 00000000..d1952210 --- /dev/null +++ b/longbow/src/LongBow/Reporting/ANSITerm/longBowReport_Testing.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + */ +#include <config.h> + +#include <stdio.h> +#include <stdarg.h> +#include <assert.h> + +#include <LongBow/Reporting/ANSITerm/longBowReport_Runtime.h> +#include <LongBow/Reporting/longBowReport_Testing.h> +#include <LongBow/private/longBow_String.h> + +static const LongBowTestRunner * +_testRunnerSilent(const LongBowTestRunner *testRunner) +{ + LongBowStatus status = longBowTestRunner_GetStatus(testRunner); + if (longBowStatus_IsSuccessful(status)) { + longBowReportRuntime_GreenPrintf("%s %s\n", longBowTestRunner_GetName(testRunner), longBowStatus_ToString(status)); + } else if (longBowStatus_IsSuccessful(status)) { + longBowReportRuntime_YellowPrintf("%s %s\n", longBowTestRunner_GetName(testRunner), longBowStatus_ToString(status)); + } else { + longBowReportRuntime_RedPrintf("%s %s\n", longBowTestRunner_GetName(testRunner), longBowStatus_ToString(status)); + } + return testRunner; +} + +static const LongBowTestRunner * +_testRunnerDetail(const LongBowTestRunner *testRunner) +{ + size_t nFixtures = longBowTestRunner_GetFixtureCount(testRunner); + + printf("\n"); + printf("%s: %zd fixture%s\n", longBowTestRunner_GetName(testRunner), nFixtures, (nFixtures == 1 ? "" : "s")); + + for (size_t i = 0; i < nFixtures; i++) { + LongBowTestFixture *fixture = longBowTestRunner_GetFixture(testRunner, i); + longBowReportTesting_TestFixture(fixture); + } + return testRunner; +} + +const LongBowTestRunner * +longBowReportTesting_TestRunner(const LongBowTestRunner *testRunner) +{ + if (longBowConfig_GetBoolean(longBowTestRunner_GetConfiguration(testRunner), false, "silent")) { + return _testRunnerSilent(testRunner); + } else { + return _testRunnerDetail(testRunner); + } +} + +static unsigned int +_totalSucceeded(const LongBowTestFixtureSummary *summary) +{ + return summary->totalSucceeded + summary->totalWarned + summary->totalTearDownWarned; +} + +static unsigned int +_totalWarned(const LongBowTestFixtureSummary *summary) +{ + return summary->totalWarned + summary->totalTearDownWarned; +} + +static unsigned int +_totalFailed(const LongBowTestFixtureSummary *summary) +{ + return summary->totalFailed + summary->totalSignalled + summary->totalStopped + summary->totalTearDownFailed; +} + +static unsigned int +_totalIncomplete(const LongBowTestFixtureSummary *summary) +{ + return summary->totalSetupFailed + summary->totalSkipped + summary->totalUnimplemented; +} + +static void +_reportSummary(const LongBowTestFixture *testFixture) +{ + const LongBowTestFixtureSummary *summary = longBowTestFixture_GetSummary(testFixture); + + char *fixtureString = longBowTestFixture_ToString(testFixture); + + printf("%s: Ran %u test case%s.", fixtureString, summary->totalTested, summary->totalTested == 1 ? "" : "s"); + free(fixtureString); + + if (summary->totalTested > 0) { + printf(" %d%% (%d) succeeded", _totalSucceeded(summary) * 100 / summary->totalTested, _totalSucceeded(summary)); + + if (_totalWarned(summary) > 0) { + printf(" %d%% (%d) with warnings", _totalWarned(summary) * 100 / _totalSucceeded(summary), _totalWarned(summary)); + } + if (_totalFailed(summary) != 0) { + printf(", %d%% (%d) failed", _totalFailed(summary) * 100 / summary->totalTested, _totalFailed(summary)); + } + if (_totalIncomplete(summary) > 0) { + printf(", %d%% (%d) incomplete", _totalIncomplete(summary) * 100 / summary->totalTested, _totalIncomplete(summary)); + } + } + + printf("\n"); +} + +const LongBowTestFixture * +longBowReportTesting_TestFixture(const LongBowTestFixture *testFixture) +{ + size_t nTestCases = longBowTestFixture_GetTestCaseCount(testFixture); + + _reportSummary(testFixture); + + for (size_t i = 0; i < nTestCases; i++) { + LongBowTestCase *testCase = longBowTestFixture_GetTestCase(testFixture, i); + longBowReportTesting_TestCase(testCase); + } + return testFixture; +} + +const LongBowTestCase * +longBowReportTesting_TestCase(const LongBowTestCase *testCase) +{ + LongBowRuntimeResult *testCaseResult = longBowTestCase_GetActualResult(testCase); + + char *rusageString = longBowReportRuntime_RUsageToString(longBowRuntimeResult_GetRUsage(testCaseResult)); + char *elapsedTimeString = longBowReportRuntime_TimevalToString(longBowRuntimeResult_GetElapsedTime(testCaseResult)); + char *statusString = longBowStatus_ToString(longBowRuntimeResult_GetStatus(testCaseResult)); + char *testCaseString = longBowTestCase_ToString(testCase); + + LongBowString *str = longBowString_CreateFormat("%s %s %s %zd %s\n", + testCaseString, + elapsedTimeString, + rusageString, + longBowRuntimeResult_GetEventEvaluationCount(longBowTestCase_GetActualResult(testCase)), + statusString); + char *string = longBowString_ToString(str); + + if (longBowTestCase_IsFailed(testCase)) { + longBowReportRuntime_RedPrintf("%s", string); + } else if (longBowTestCase_IsWarning(testCase)) { + longBowReportRuntime_YellowPrintf("%s", string); + } else if (longBowTestCase_IsIncomplete(testCase)) { + longBowReportRuntime_YellowPrintf("%s", string); + } else if (longBowTestCase_IsSuccessful(testCase)) { + longBowReportRuntime_GreenPrintf("%s", string); + } else { + longBowReportRuntime_RedPrintf("%s", string); + } + + free(string); + free(testCaseString); + free(statusString); + free(elapsedTimeString); + free(rusageString); + + return testCase; +} + +void +longBowReportTesting_DisplayTestCaseResult(const LongBowTestCase *testCase __attribute__((unused))) +{ +} + +void +longBowReportTesting_Trace(const char *restrict format, ...) +{ + va_list ap; + va_start(ap, format); + char *message; + if (vasprintf(&message, format, ap) == -1) { + va_end(ap); + return; + } + va_end(ap); + + longBowReportRuntime_MagentaPrintf("%s\n", message); + fflush(stdout); + free(message); +} |