From dc558da002794cc07013e8376f3c55c73391aa0e Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 12 Jul 2020 17:07:55 +1000 Subject: Update Dutil_TraceErrorSource to filter based on the report level. --- src/dutil/dutil.cpp | 6 ++++ src/dutil/inc/dutil.h | 13 +------- src/dutil/inc/dutilsources.h | 10 +++++++ src/test/DUtilUnitTest/DUtilTests.cpp | 35 ++++++++++++++++++++++ src/test/DUtilUnitTest/DUtilUnitTest.vcxproj | 4 ++- .../DUtilUnitTest/DUtilUnitTest.vcxproj.filters | 9 ++++++ src/test/DUtilUnitTest/DictUtilTest.cpp | 4 +++ src/test/DUtilUnitTest/FileUtilTest.cpp | 3 ++ src/test/DUtilUnitTest/IniUtilTest.cpp | 3 ++ src/test/DUtilUnitTest/MemUtilTest.cpp | 16 +++++++++- src/test/DUtilUnitTest/StrUtilTest.cpp | 16 +++++++--- src/test/DUtilUnitTest/UriUtilTest.cpp | 4 ++- src/test/DUtilUnitTest/error.cpp | 26 ++++++++++++++++ src/test/DUtilUnitTest/error.h | 16 ++++++---- src/test/DUtilUnitTest/precomp.h | 1 + 15 files changed, 142 insertions(+), 24 deletions(-) create mode 100644 src/test/DUtilUnitTest/DUtilTests.cpp create mode 100644 src/test/DUtilUnitTest/error.cpp (limited to 'src') diff --git a/src/dutil/dutil.cpp b/src/dutil/dutil.cpp index a32de516..99ce1bc6 100644 --- a/src/dutil/dutil.cpp +++ b/src/dutil/dutil.cpp @@ -408,6 +408,12 @@ DAPIV_(void) Dutil_TraceErrorSource( ... ) { + // if this is NOT an error report and we're not logging at this level, bail + if (REPORT_ERROR != rl && Dutil_rlCurrentTrace < rl) + { + return; + } + if (DUTIL_SOURCE_UNKNOWN != source && vpfnTraceErrorCallback) { va_list args; diff --git a/src/dutil/inc/dutil.h b/src/dutil/inc/dutil.h index 6b57b48a..15d45d21 100644 --- a/src/dutil/inc/dutil.h +++ b/src/dutil/inc/dutil.h @@ -10,17 +10,6 @@ #define DAPIV_(type) EXTERN_C type DAPIV -// enums -typedef enum REPORT_LEVEL -{ - REPORT_NONE, // turns off report (only valid for XXXSetLevel()) - REPORT_WARNING, // written if want only warnings or reporting is on in general - REPORT_STANDARD, // written if reporting is on - REPORT_VERBOSE, // written only if verbose reporting is on - REPORT_DEBUG, // reporting useful when debugging code - REPORT_ERROR, // always gets reported, but can never be specified -} REPORT_LEVEL; - // asserts and traces typedef BOOL (DAPI *DUTIL_ASSERTDISPLAYFUNCTION)(__in_z LPCSTR sz); @@ -29,7 +18,7 @@ typedef void (CALLBACK *DUTIL_CALLBACK_TRACEERROR)( __in int iLine, __in REPORT_LEVEL rl, __in UINT source, - __in HRESULT hr, + __in HRESULT hrError, __in_z __format_string LPCSTR szFormat, __in va_list args ); diff --git a/src/dutil/inc/dutilsources.h b/src/dutil/inc/dutilsources.h index bf3da16f..b03013ca 100644 --- a/src/dutil/inc/dutilsources.h +++ b/src/dutil/inc/dutilsources.h @@ -63,3 +63,13 @@ typedef enum DUTIL_SOURCE DUTIL_SOURCE_EXTERNAL = 256, } DUTIL_SOURCE; + +typedef enum REPORT_LEVEL +{ + REPORT_NONE, // turns off report (only valid for XXXSetLevel()) + REPORT_WARNING, // written if want only warnings or reporting is on in general + REPORT_STANDARD, // written if reporting is on + REPORT_VERBOSE, // written only if verbose reporting is on + REPORT_DEBUG, // reporting useful when debugging code + REPORT_ERROR, // always gets reported, but can never be specified +} REPORT_LEVEL; diff --git a/src/test/DUtilUnitTest/DUtilTests.cpp b/src/test/DUtilUnitTest/DUtilTests.cpp new file mode 100644 index 00000000..55e81d46 --- /dev/null +++ b/src/test/DUtilUnitTest/DUtilTests.cpp @@ -0,0 +1,35 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +#include "precomp.h" + +using namespace System; +using namespace Xunit; +using namespace WixBuildTools::TestSupport; + +namespace DutilTests +{ + public ref class DUtil + { + public: + [Fact] + void DUtilTraceErrorSourceFiltersOnTraceLevel() + { + DutilInitialize(&DutilTestTraceError); + + CallDutilTraceErrorSource(); + + Dutil_TraceSetLevel(REPORT_DEBUG, FALSE); + + Action^ action = gcnew Action(this, &DUtil::CallDutilTraceErrorSource); + Assert::Throws(action); + + DutilUninitialize(); + } + + private: + void CallDutilTraceErrorSource() + { + Dutil_TraceErrorSource(__FILE__, __LINE__, REPORT_DEBUG, DUTIL_SOURCE_EXTERNAL, E_FAIL, "Error message"); + } + }; +} diff --git a/src/test/DUtilUnitTest/DUtilUnitTest.vcxproj b/src/test/DUtilUnitTest/DUtilUnitTest.vcxproj index b023d74f..c0974780 100644 --- a/src/test/DUtilUnitTest/DUtilUnitTest.vcxproj +++ b/src/test/DUtilUnitTest/DUtilUnitTest.vcxproj @@ -36,6 +36,8 @@ + + @@ -92,4 +94,4 @@ - + \ No newline at end of file diff --git a/src/test/DUtilUnitTest/DUtilUnitTest.vcxproj.filters b/src/test/DUtilUnitTest/DUtilUnitTest.vcxproj.filters index 783e18c7..2456558f 100644 --- a/src/test/DUtilUnitTest/DUtilUnitTest.vcxproj.filters +++ b/src/test/DUtilUnitTest/DUtilUnitTest.vcxproj.filters @@ -24,6 +24,12 @@ Source Files + + Source Files + + + Source Files + Source Files @@ -42,6 +48,9 @@ Source Files + + Source Files + Source Files diff --git a/src/test/DUtilUnitTest/DictUtilTest.cpp b/src/test/DUtilUnitTest/DictUtilTest.cpp index 4e9d3907..4b4777d7 100644 --- a/src/test/DUtilUnitTest/DictUtilTest.cpp +++ b/src/test/DUtilUnitTest/DictUtilTest.cpp @@ -22,6 +22,8 @@ namespace DutilTests [Fact] void DictUtilTest() { + DutilInitialize(&DutilTestTraceError); + EmbeddedKeyTestHelper(DICT_FLAG_NONE, numIterations); EmbeddedKeyTestHelper(DICT_FLAG_CASEINSENSITIVE, numIterations); @@ -29,6 +31,8 @@ namespace DutilTests StringListTestHelper(DICT_FLAG_NONE, numIterations); StringListTestHelper(DICT_FLAG_CASEINSENSITIVE, numIterations); + + DutilUninitialize(); } private: diff --git a/src/test/DUtilUnitTest/FileUtilTest.cpp b/src/test/DUtilUnitTest/FileUtilTest.cpp index 9bd1d0c0..0087a1d5 100644 --- a/src/test/DUtilUnitTest/FileUtilTest.cpp +++ b/src/test/DUtilUnitTest/FileUtilTest.cpp @@ -18,6 +18,8 @@ namespace DutilTests LPWSTR sczTempDir = NULL; LPWSTR sczFileDir = NULL; + DutilInitialize(&DutilTestTraceError); + try { hr = PathExpand(&sczTempDir, L"%TEMP%\\FileUtilTest\\", PATH_EXPAND_ENVIRONMENT); @@ -43,6 +45,7 @@ namespace DutilTests { ReleaseStr(sczTempDir); ReleaseStr(sczFileDir); + DutilUninitialize(); } } diff --git a/src/test/DUtilUnitTest/IniUtilTest.cpp b/src/test/DUtilUnitTest/IniUtilTest.cpp index 2edd56ab..946f19c5 100644 --- a/src/test/DUtilUnitTest/IniUtilTest.cpp +++ b/src/test/DUtilUnitTest/IniUtilTest.cpp @@ -24,6 +24,8 @@ namespace DutilTests LPWSTR wzIniContents = L" PlainValue = \t Blah \r\n;CommentHere\r\n[Section1]\r\n ;Another Comment With = Equal Sign\r\nSection1ValueA=Foo\r\n\r\nSection1ValueB=Bar\r\n[Section2]\r\nSection2ValueA=Cha\r\nArray[0]=Arr\r\n"; LPWSTR wzScriptContents = L"setf ~PlainValue Blah\r\n;CommentHere\r\n\r\nsetf ~Section1\\Section1ValueA Foo\r\n\r\nsetf ~Section1\\Section1ValueB Bar\r\nsetf ~Section2\\Section2ValueA Cha\r\nsetf ~Section2\\Array[0] Arr\r\n"; + DutilInitialize(&DutilTestTraceError); + try { hr = PathExpand(&sczTempIniFilePath, L"%TEMP%\\IniUtilTest\\Test.ini", PATH_EXPAND_ENVIRONMENT); @@ -58,6 +60,7 @@ namespace DutilTests { ReleaseStr(sczTempIniFilePath); ReleaseStr(sczTempIniFileDir); + DutilUninitialize(); } } diff --git a/src/test/DUtilUnitTest/MemUtilTest.cpp b/src/test/DUtilUnitTest/MemUtilTest.cpp index 2621da6d..09692bfb 100644 --- a/src/test/DUtilUnitTest/MemUtilTest.cpp +++ b/src/test/DUtilUnitTest/MemUtilTest.cpp @@ -27,6 +27,8 @@ namespace DutilTests ArrayValue *rgValues = NULL; DWORD cValues = 0; + DutilInitialize(&DutilTestTraceError); + try { hr = MemEnsureArraySize(reinterpret_cast(&rgValues), cValues + 1, sizeof(ArrayValue), 5); @@ -101,7 +103,7 @@ namespace DutilTests } LExit: - return; + DutilUninitialize(); } [Fact] @@ -111,6 +113,8 @@ namespace DutilTests ArrayValue *rgValues = NULL; DWORD cValues = 0; + DutilInitialize(&DutilTestTraceError); + try { hr = MemInsertIntoArray(reinterpret_cast(&rgValues), 0, 1, cValues + 1, sizeof(ArrayValue), 5); @@ -180,6 +184,7 @@ namespace DutilTests finally { ReleaseMem(rgValues); + DutilUninitialize(); } } @@ -190,6 +195,8 @@ namespace DutilTests ArrayValue *rgValues = NULL; DWORD cValues = 0; + DutilInitialize(&DutilTestTraceError); + try { hr = MemEnsureArraySize(reinterpret_cast(&rgValues), 10, sizeof(ArrayValue), 10); @@ -252,6 +259,7 @@ namespace DutilTests finally { ReleaseMem(rgValues); + DutilUninitialize(); } } @@ -262,6 +270,8 @@ namespace DutilTests ArrayValue *rgValues = NULL; DWORD cValues = 0; + DutilInitialize(&DutilTestTraceError); + try { hr = MemEnsureArraySize(reinterpret_cast(&rgValues), 10, sizeof(ArrayValue), 10); @@ -326,6 +336,7 @@ namespace DutilTests finally { ReleaseMem(rgValues); + DutilUninitialize(); } } @@ -336,6 +347,8 @@ namespace DutilTests ArrayValue *rgValues = NULL; DWORD cValues = 0; + DutilInitialize(&DutilTestTraceError); + try { hr = MemEnsureArraySize(reinterpret_cast(&rgValues), 10, sizeof(ArrayValue), 10); @@ -424,6 +437,7 @@ namespace DutilTests finally { ReleaseMem(rgValues); + DutilUninitialize(); } } diff --git a/src/test/DUtilUnitTest/StrUtilTest.cpp b/src/test/DUtilUnitTest/StrUtilTest.cpp index 7c35b7c0..94fee280 100644 --- a/src/test/DUtilUnitTest/StrUtilTest.cpp +++ b/src/test/DUtilUnitTest/StrUtilTest.cpp @@ -86,6 +86,8 @@ namespace DutilTests HRESULT hr = S_OK; LPWSTR sczOutput = NULL; + DutilInitialize(&DutilTestTraceError); + try { hr = StrTrimWhitespace(&sczOutput, wzInput); @@ -103,7 +105,7 @@ namespace DutilTests } LExit: - return; + DutilUninitialize(); } void TestTrimAnsi(LPCSTR szInput, LPCSTR szExpectedResult) @@ -111,6 +113,8 @@ namespace DutilTests HRESULT hr = S_OK; LPSTR sczOutput = NULL; + DutilInitialize(&DutilTestTraceError); + try { hr = StrAnsiTrimWhitespace(&sczOutput, szInput); @@ -128,7 +132,7 @@ namespace DutilTests } LExit: - return; + DutilUninitialize(); } void TestStrAllocStringAnsi(LPCSTR szSource, DWORD cchSource, LPCWSTR wzExpectedResult) @@ -136,6 +140,8 @@ namespace DutilTests HRESULT hr = S_OK; LPWSTR sczOutput = NULL; + DutilInitialize(&DutilTestTraceError); + try { hr = StrAllocStringAnsi(&sczOutput, szSource, cchSource, CP_UTF8); @@ -153,7 +159,7 @@ namespace DutilTests } LExit: - return; + DutilUninitialize(); } void TestStrAnsiAllocString(LPWSTR wzSource, DWORD cchSource, LPCSTR szExpectedResult) @@ -161,6 +167,8 @@ namespace DutilTests HRESULT hr = S_OK; LPSTR sczOutput = NULL; + DutilInitialize(&DutilTestTraceError); + try { hr = StrAnsiAllocString(&sczOutput, wzSource, cchSource, CP_UTF8); @@ -178,7 +186,7 @@ namespace DutilTests } LExit: - return; + DutilUninitialize(); } }; } diff --git a/src/test/DUtilUnitTest/UriUtilTest.cpp b/src/test/DUtilUnitTest/UriUtilTest.cpp index 220b3ff5..b3bf87a2 100644 --- a/src/test/DUtilUnitTest/UriUtilTest.cpp +++ b/src/test/DUtilUnitTest/UriUtilTest.cpp @@ -17,6 +17,8 @@ namespace CfgTests { HRESULT hr = S_OK; + DutilInitialize(&DutilTestTraceError); + LPCWSTR uri = L"https://localhost/"; URI_PROTOCOL uriProtocol = URI_PROTOCOL::URI_PROTOCOL_UNKNOWN; hr = UriProtocol(uri, &uriProtocol); @@ -90,7 +92,7 @@ namespace CfgTests Assert::Equal((int)URI_PROTOCOL::URI_PROTOCOL_FTP, (int)uriProtocol); LExit: - ; + DutilUninitialize(); } }; } diff --git a/src/test/DUtilUnitTest/error.cpp b/src/test/DUtilUnitTest/error.cpp new file mode 100644 index 00000000..e51971c3 --- /dev/null +++ b/src/test/DUtilUnitTest/error.cpp @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +#include "precomp.h" + +const int ERROR_STRING_BUFFER = 1024; + +static char szMsg[ERROR_STRING_BUFFER]; +static WCHAR wzMsg[ERROR_STRING_BUFFER]; + +void CALLBACK DutilTestTraceError( + __in_z LPCSTR /*szFile*/, + __in int /*iLine*/, + __in REPORT_LEVEL /*rl*/, + __in UINT source, + __in HRESULT hrError, + __in_z __format_string LPCSTR szFormat, + __in va_list args + ) +{ + if (DUTIL_SOURCE_EXTERNAL == source) + { + ::StringCchPrintfA(szMsg, countof(szMsg), szFormat, args); + MultiByteToWideChar(CP_ACP, 0, szMsg, -1, wzMsg, countof(wzMsg)); + throw gcnew System::Exception(System::String::Format("hr = 0x{0:X8}, message = {1}", hrError, gcnew System::String(wzMsg))); + } +} diff --git a/src/test/DUtilUnitTest/error.h b/src/test/DUtilUnitTest/error.h index a52db56d..b973acaf 100644 --- a/src/test/DUtilUnitTest/error.h +++ b/src/test/DUtilUnitTest/error.h @@ -1,8 +1,14 @@ +#pragma once // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -const int ERROR_STRING_BUFFER = 1024; +#define DUTIL_SOURCE_DEFAULT DUTIL_SOURCE_EXTERNAL -static char szMsg[ERROR_STRING_BUFFER]; -static WCHAR wzMsg[ERROR_STRING_BUFFER]; - -#define ExitTrace(x, f, ...) { HRESULT hrTemp = x; hr = ::StringCchPrintfA(szMsg, countof(szMsg), f, __VA_ARGS__); MultiByteToWideChar(CP_ACP, 0, szMsg, -1, wzMsg, countof(wzMsg)); throw gcnew System::Exception(System::String::Format("hr = 0x{0:X8}, message = {1}", hrTemp, gcnew System::String(wzMsg))); } +void CALLBACK DutilTestTraceError( + __in_z LPCSTR szFile, + __in int iLine, + __in REPORT_LEVEL rl, + __in UINT source, + __in HRESULT hrError, + __in_z __format_string LPCSTR szFormat, + __in va_list args + ); diff --git a/src/test/DUtilUnitTest/precomp.h b/src/test/DUtilUnitTest/precomp.h index 15dfcd1a..284668fe 100644 --- a/src/test/DUtilUnitTest/precomp.h +++ b/src/test/DUtilUnitTest/precomp.h @@ -7,6 +7,7 @@ #include // Include error.h before dutil.h +#include #include "error.h" #include -- cgit v1.2.3-55-g6feb