diff options
author | Jiyoung Yun <jy910.yun@samsung.com> | 2016-11-23 19:09:09 +0900 |
---|---|---|
committer | Jiyoung Yun <jy910.yun@samsung.com> | 2016-11-23 19:09:09 +0900 |
commit | 4b4aad7217d3292650e77eec2cf4c198ea9c3b4b (patch) | |
tree | 98110734c91668dfdbb126fcc0e15ddbd93738ca /src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER | |
parent | fa45f57ed55137c75ac870356a1b8f76c84b229c (diff) | |
download | coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.gz coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.bz2 coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.zip |
Imported Upstream version 1.1.0upstream/1.1.0
Diffstat (limited to 'src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER')
10 files changed, 591 insertions, 0 deletions
diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/CMakeLists.txt b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/CMakeLists.txt new file mode 100644 index 0000000000..1962ade358 --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +add_subdirectory(test1) +add_subdirectory(test2) +add_subdirectory(test3) + diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/CMakeLists.txt b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/CMakeLists.txt new file mode 100644 index 0000000000..adbc8ae86a --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(SOURCES + PAL_EXCEPT_FILTER.c +) + +add_executable(paltest_pal_except_filter_test1 + ${SOURCES} +) + +add_dependencies(paltest_pal_except_filter_test1 coreclrpal) + +target_link_libraries(paltest_pal_except_filter_test1 + pthread + m + coreclrpal +) diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/PAL_EXCEPT_FILTER.c b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/PAL_EXCEPT_FILTER.c new file mode 100644 index 0000000000..ee65f43d2c --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/PAL_EXCEPT_FILTER.c @@ -0,0 +1,118 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/*===================================================================== +** +** Source: pal_except_filter.c (test 1) +** +** Purpose: Tests the PAL implementation of the PAL_EXCEPT_FILTER. An +** exception is forced and a known value is passed to the filter +** fuction. The known value as well as booleans are tested to +** ensure proper functioning. +** +** +**===================================================================*/ + + + +#include <palsuite.h> + +BOOL bFilter = FALSE; +BOOL bTry = FALSE; +const int nValidator = 12321; + +LONG ExitFilter(EXCEPTION_POINTERS* ep, LPVOID pnTestInt) +{ + int nTestInt = *(int *)pnTestInt; + + /* let the main know we've hit the filter function */ + bFilter = TRUE; + + if (!bTry) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " The filter was hit without PAL_TRY being hit.\n"); + } + + /* was the correct value passed? */ + if (nValidator != nTestInt) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Parameter passed to filter function" + " should have been \"%d\" but was \"%d\".\n", + nValidator, + nTestInt); + } + return EXCEPTION_EXECUTE_HANDLER; +} + + +int __cdecl main(int argc, char *argv[]) +{ + int* p = 0x00000000; /* pointer to NULL */ + BOOL bExcept = FALSE; + + if (0 != PAL_Initialize(argc, argv)) + { + return FAIL; + } + + + /* + ** test to make sure we get into the exception block + */ + + PAL_TRY + { + if (bExcept) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER was hit before PAL_TRY.\n"); + } + bTry = TRUE; /* indicate we hit the PAL_TRY block */ + *p = 13; /* causes an access violation exception */ + + Fail("PAL_EXCEPT_FILTER: ERROR -> code was executed after the " + "access violation.\n"); + } + PAL_EXCEPT_FILTER(ExitFilter, (LPVOID)&nValidator) + { + if (!bTry) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER was hit without PAL_TRY being hit.\n"); + } + bExcept = TRUE; /* indicate we hit the PAL_EXCEPT_FILTER block */ + } + PAL_ENDTRY; + + if (!bTry) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the PAL_TRY" + " block was not executed.\n"); + } + + if (!bExcept) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the " + "PAL_EXCEPT_FILTER block was not executed.\n"); + } + + if (!bFilter) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the filter" + " function was not executed.\n"); + } + + + /* did we hit all the code blocks? */ + if(!bTry || !bExcept || !bFilter) + { + Fail(""); + } + + + PAL_Terminate(); + return PASS; + +} diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/testinfo.dat b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/testinfo.dat new file mode 100644 index 0000000000..b0b90d3ab4 --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test1/testinfo.dat @@ -0,0 +1,16 @@ +# Licensed to the .NET Foundation under one or more agreements. +# The .NET Foundation licenses this file to you under the MIT license. +# See the LICENSE file in the project root for more information. + +Version = 1.0 +Section = exception_handling +Function = PAL_EXCEPT_FILTER +Name = Test for PAL_EXCEPT_FILTER +Type = DEFAULT +EXE1 = pal_except_filter +LANG = cpp +Description += Tests the PAL implementation of the PAL_EXCEPT_FILTER. An += exception is forced and a known value is passed to the filter += fuction. The known value as well as booleans are tested to += ensure proper functioning. diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/CMakeLists.txt b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/CMakeLists.txt new file mode 100644 index 0000000000..62cda706d5 --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(SOURCES + pal_except_filter.c +) + +add_executable(paltest_pal_except_filter_test2 + ${SOURCES} +) + +add_dependencies(paltest_pal_except_filter_test2 coreclrpal) + +target_link_libraries(paltest_pal_except_filter_test2 + pthread + m + coreclrpal +) diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/pal_except_filter.c b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/pal_except_filter.c new file mode 100644 index 0000000000..ccf53fb0ba --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/pal_except_filter.c @@ -0,0 +1,154 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/*===================================================================== +** +** Source: pal_except_filter.c (test 2) +** +** Purpose: Tests the PAL implementation of the PAL_EXCEPT_FILTER. An +** exception is forced and the filter returns +** EXCEPTION_CONTINUE_EXECUTION to allow execution to continue. +** +** +**===================================================================*/ + + +#include <palsuite.h> + +char* p; /* pointer to be abused */ + +BOOL bFilter = FALSE; +BOOL bTry = FALSE; +BOOL bTry2 = FALSE; +BOOL bContinued = FALSE; +const int nValidator = 12321; + +LONG ExitFilter(EXCEPTION_POINTERS* ep, LPVOID pnTestInt) +{ + int nTestInt = *(int *)pnTestInt; + void *Temp; + + /* let the main know we've hit the filter function */ + bFilter = TRUE; + + if (!bTry) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " The filter was hit without PAL_TRY being hit.\n"); + } + + /* was the correct value passed? */ + if (nValidator != nTestInt) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Parameter passed to filter function" + " should have been \"%d\" but was \"%d\".\n", + nValidator, + nTestInt); + } + + /* Are we dealing with the exception we expected? */ + if (EXCEPTION_ACCESS_VIOLATION != ep->ExceptionRecord->ExceptionCode) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Unexpected Exception" + " should have been \"%x\" but was \"%x\".\n", + EXCEPTION_ACCESS_VIOLATION, + ep->ExceptionRecord->ExceptionCode); + } + + /* attempt to correct the problem by commiting the page at address 'p' */ + Temp= VirtualAlloc(p, 1, MEM_COMMIT, PAGE_READWRITE); + if (!Temp) + { + Fail("EXCEPTION_CONTINUE_EXECUTION: last error = %u - probably " + "out of memory. Unable to continue, not proof of exception " + "failure\n", + GetLastError()); + } + /* The memory that 'p' points to is now valid */ + + return EXCEPTION_CONTINUE_EXECUTION; +} + + +int __cdecl main(int argc, char *argv[]) +{ + BOOL bExcept = FALSE; + + if (0 != PAL_Initialize(argc, argv)) + { + return FAIL; + } + + + /* + ** test to make sure we get into the exception block + */ + + PAL_TRY + { + if (bExcept) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER was hit before PAL_TRY.\n"); + } + bTry = TRUE; /* indicate we hit the PAL_TRY block */ + + /* reserve an address chunk for p to point to */ + p = (char*) VirtualAlloc(0, 1, MEM_RESERVE, PAGE_READONLY); + if (!p) + { + Fail("EXCEPTION_CONTINUE_EXECUTION: test setup via " + "VirtualAlloc failed.\n"); + } + + *p = 13; /* causes an access violation exception */ + + bTry2 = TRUE; + + + } + PAL_EXCEPT_FILTER(ExitFilter, (LPVOID)&nValidator) + { + bExcept = TRUE; /* indicate we hit the PAL_EXCEPT_FILTER block */ + Fail("PAL_EXCEPT_FILTER: ERROR -> in handler despite filter's " + "continue choice\n"); + } + PAL_ENDTRY; + + if (!bTry) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the PAL_TRY" + " block was not executed.\n"); + } + + if (bExcept) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the " + "PAL_EXCEPT_FILTER block was executed.\n"); + } + + if (!bFilter) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the filter" + " function was not executed.\n"); + } + + + if (!bTry2) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the PAL_TRY" + " block after the exception causing statements was not executed.\n"); + } + + /* did we hit all the code blocks? */ + if(!bTry || bExcept || !bFilter) + { + Fail(""); + } + + + PAL_Terminate(); + return PASS; + +} diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/testinfo.dat b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/testinfo.dat new file mode 100644 index 0000000000..729d2a4c49 --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test2/testinfo.dat @@ -0,0 +1,15 @@ +# Licensed to the .NET Foundation under one or more agreements. +# The .NET Foundation licenses this file to you under the MIT license. +# See the LICENSE file in the project root for more information. + +Version = 1.0 +Section = exception_handling +Function = PAL_EXCEPT_FILTER +Name = Test for PAL_EXCEPT_FILTER +Type = DEFAULT +EXE1 = pal_except_filter +LANG = cpp +Description += Tests the PAL implementation of the PAL_EXCEPT_FILTER. An += exception is forced and the filter returns += EXCEPTION_CONTINUE_EXECUTION to allow execution to continue. diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/CMakeLists.txt b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/CMakeLists.txt new file mode 100644 index 0000000000..cc68fb031c --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(SOURCES + pal_except_filter.c +) + +add_executable(paltest_pal_except_filter_test3 + ${SOURCES} +) + +add_dependencies(paltest_pal_except_filter_test3 coreclrpal) + +target_link_libraries(paltest_pal_except_filter_test3 + pthread + m + coreclrpal +) diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/pal_except_filter.c b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/pal_except_filter.c new file mode 100644 index 0000000000..20c36840b1 --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/pal_except_filter.c @@ -0,0 +1,206 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/*===================================================================== +** +** Source: pal_except_filter.c (test 3) +** +** Purpose: Tests the PAL implementation of the PAL_EXCEPT_FILTER in the +** presence of a call stack. An +** exception is forced and passed to two nested exception filters for +** consideration. The first filter returns EXCEPTION_CONTINUE_SEARCH +** so the second can run and return EXCEPTION_EXECUTE_HANDLER. The +** initial exception handler should be skipped, and the second +** executed +** +** +**===================================================================*/ + + + +#include <palsuite.h> + +BOOL bFilterCS = FALSE; +BOOL bFilterEE = FALSE; +BOOL bTry1 = FALSE; +BOOL bTry2 = FALSE; +BOOL bExcept1 = FALSE; +BOOL bExcept2 = FALSE; +BOOL bContinued = FALSE; +const int nValidator = 12321; + +LONG ContSearchFilter(EXCEPTION_POINTERS* ep, LPVOID pnTestInt) +{ + + /* let the main know we've hit the filter function */ + bFilterCS = TRUE; + + if (!bTry1 || !bTry2) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " The ContSearch filter was hit without PAL_TRY being hit.\n"); + } + + if (bFilterEE) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " The ContSearch filter was hit after the ExecuteException " + "filter.\n"); + } + + return EXCEPTION_CONTINUE_SEARCH; +} + +LONG ExecExeptionFilter(EXCEPTION_POINTERS* ep, LPVOID pnTestInt) +{ + /* let the main know we've hit the filter function */ + bFilterEE = TRUE; + + if (!bTry1 || !bTry2) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " The ContSearch filter was hit without PAL_TRY being hit.\n"); + } + + if (!bFilterCS) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " The ExecExeption filter was hit before the ContSearch " + "filter.\n"); + } + return EXCEPTION_EXECUTE_HANDLER; +} + +void NestedFunc1 (void) +{ + int* p = 0x00000000; /* pointer to NULL */ + + PAL_TRY + { + if (bExcept1 || bExcept2) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER was hit before PAL_TRY.\n"); + } + bTry2 = TRUE; /* indicate we hit the inner PAL_TRY block */ + *p = 13; /* causes an access violation exception */ + + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " We executed beyond the trapping code.\n"); + } + PAL_EXCEPT_FILTER(ContSearchFilter, (LPVOID)&nValidator) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " The dummy handler was " + "being hit.\n"); + bExcept2 = TRUE; /* indicate we hit the inner block */ + } + PAL_ENDTRY; + +} + +void NestedFunc2 (void) +{ + NestedFunc1(); +} + +int __cdecl main(int argc, char *argv[]) +{ + if (0 != PAL_Initialize(argc, argv)) + { + return FAIL; + } + + + /* + ** test to make sure we get into the second exception block only based + ** on the return codes of the filters + */ + + PAL_TRY + { + if (bExcept1 || bExcept2) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER was hit before PAL_TRY.\n"); + } + bTry1 = TRUE; /* indicate we hit the outer PAL_TRY block */ + + NestedFunc2(); + + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " We executed beyond the trapping code.\n"); + } + PAL_EXCEPT_FILTER(ExecExeptionFilter, (LPVOID)&nValidator) + { + if (!bTry1) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER's handler was hit without PAL_TRY's code " + "being hit.\n"); + } + if (!bTry2) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER's handler was hit without PAL_TRY's code " + "being hit.\n"); + } + if (!bFilterCS) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER's handler was hit without the inner filter " + "being hit.\n"); + } + if (!bFilterEE) + { + Fail("PAL_EXCEPT_FILTER: ERROR -> Something weird is going on." + " PAL_EXCEPT_FILTER's handler was hit without the outer filter " + "being hit.\n"); + } + bExcept1 = TRUE; /* indicate we hit the outer block */ + } + PAL_ENDTRY; + + if (!bTry1) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the outer" + " PAL_TRY block was not executed.\n"); + } + + if (bExcept2) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the " + "inner PAL_EXCEPT_FILTER block was executed.\n"); + } + if (!bExcept1) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the " + "outer PAL_EXCEPT_FILTER block was not executed.\n"); + } + + if (!bFilterCS) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the " + "search continuing filter" + " function was not executed.\n"); + } + if (!bFilterEE) + { + Trace("PAL_EXCEPT_FILTER: ERROR -> It appears the code in the " + "execute handler filter" + " function was not executed.\n"); + } + + + /* did we hit all the code blocks? */ + if(!bTry1 || !bTry2 || !bExcept1 || bExcept2 || !bFilterEE || !bFilterCS ) + { + Fail(""); + } + + + PAL_Terminate(); + return PASS; + +} diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/testinfo.dat b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/testinfo.dat new file mode 100644 index 0000000000..d2df399392 --- /dev/null +++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER/test3/testinfo.dat @@ -0,0 +1,19 @@ +# Licensed to the .NET Foundation under one or more agreements. +# The .NET Foundation licenses this file to you under the MIT license. +# See the LICENSE file in the project root for more information. + +Version = 1.0 +Section = exception_handling +Function = PAL_EXCEPT_FILTER_EX +Name = Test for nested PAL_EXCEPT_FILTER functions & EXCEPTION_CONTINUE_SEARCH +Type = DEFAULT +EXE1 = pal_except_filter +LANG = cpp +Description += Tests the PAL implementation of the PAL_EXCEPT_FILTER with nested += functions to build a call stack. An += exception is forced and passed to two nested exception filters for += consideration. The first filter returns EXCEPTION_CONTINUE_SEARCH += so the second can run and return EXCEPTION_EXECUTE_HANDLER. The += initial exception handler should be skipped, and the second += executed |