diff options
Diffstat (limited to 'src/pal/tests/palsuite/file_io/SetCurrentDirectoryA')
10 files changed, 513 insertions, 0 deletions
diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/CMakeLists.txt b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/CMakeLists.txt new file mode 100644 index 0000000000..1962ade358 --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/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/file_io/SetCurrentDirectoryA/test1/CMakeLists.txt b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test1/CMakeLists.txt new file mode 100644 index 0000000000..7376b22226 --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test1/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(SOURCES + SetCurrentDirectoryA.c +) + +add_executable(paltest_setcurrentdirectorya_test1 + ${SOURCES} +) + +add_dependencies(paltest_setcurrentdirectorya_test1 coreclrpal) + +target_link_libraries(paltest_setcurrentdirectorya_test1 + pthread + m + coreclrpal +) diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test1/SetCurrentDirectoryA.c b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test1/SetCurrentDirectoryA.c new file mode 100644 index 0000000000..c07a62412b --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test1/SetCurrentDirectoryA.c @@ -0,0 +1,215 @@ +// 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: SetCurrentDirectoryA.c (test 1) +** +** Purpose: Tests the PAL implementation of the SetCurrentDirectoryA function. +** +** +**===================================================================*/ + +#include <palsuite.h> + + + +/* In order to avoid the "chicken and egg" scenario, this is another + method of getting the current directory. GetFullPathNameA is called with + a dummy file name and then the file name is stripped off leaving the + current working directory +*/ + +BOOL GetCurrentDir(char* szCurrentDir) +{ + const char* szFileName = "blah"; + DWORD dwRc = 0; + char szReturnedPath[_MAX_DIR+1]; + LPSTR pPathPtr; + size_t nCount = 0; + + /* use GetFullPathNameA to to get the current path by stripping + the file name off the end */ + memset(szReturnedPath, 0, (_MAX_DIR+1)); + dwRc = GetFullPathNameA(szFileName, + _MAX_DIR, + szReturnedPath, + &pPathPtr); + + if (dwRc == 0) + { + /* GetFullPathNameA failed */ + Trace("SetCurrentDirectoryA: ERROR -> GetFullPathNameA failed " + "with error code: %ld.\n", GetLastError()); + return(FALSE); + } + + /* now strip the file name from the full path to get the current path */ + nCount = strlen(szReturnedPath) - strlen(szFileName); + memset(szCurrentDir, 0, (_MAX_DIR+1)); + strncpy(szCurrentDir, szReturnedPath, nCount); + + return(TRUE); +} + + + +int __cdecl main(int argc, char *argv[]) +{ + const char* szDirName = "testing"; + /* directory name longer than MAX_PATH characters */ + char szLongDirName[MAX_LONGPATH+1]; + char szNewDir[_MAX_DIR+1]; + char szBuiltDir[_MAX_DIR+1]; + char szHomeDir[_MAX_DIR+1]; + WCHAR* szwPtr = NULL; + + memset(szLongDirName, 'a', MAX_LONGPATH+1); + if (0 != PAL_Initialize(argc,argv)) + { + return FAIL; + } + + /* remove the directory just in case a previous run of the test didn't */ + szwPtr = convert((LPSTR)szDirName); + + /* clean up. Remove the directory + * if it exists */ + RemoveDirectoryW(szwPtr); + + /* create a temp directory off the current directory */ + if (CreateDirectoryA(szDirName, NULL) != TRUE) + { + free(szwPtr); + Fail("SetCurrentDirectoryA: ERROR -> CreateDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + + /* find out what the current "home" directory is */ + memset(szHomeDir, 0, (_MAX_DIR+1)); + if(GetCurrentDir(szHomeDir) != TRUE) + { + if (!RemoveDirectoryW(szwPtr)) + { + Trace("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + free(szwPtr); + PAL_TerminateEx(FAIL); + return FAIL; + } + + /* set the current directory to the temp directory */ + + if (SetCurrentDirectoryA(szDirName) != TRUE) + { + Trace("SetCurrentDirectoryA: ERROR -> Unable to set current " + "directory. Failed with error code: %ld.\n", GetLastError()); + if (!RemoveDirectoryW(szwPtr)) + { + Trace("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + free(szwPtr); + Fail(""); + } + + /* append the temp name to the "home" directory */ + memset(szBuiltDir, 0, (_MAX_DIR+1)); +#if WIN32 + sprintf(szBuiltDir,"%s%s\\", szHomeDir, szDirName); +#else + sprintf(szBuiltDir,"%s%s/", szHomeDir, szDirName); +#endif + + /* get the new current directory */ + memset(szNewDir, 0, (_MAX_DIR+1)); + if(GetCurrentDir(szNewDir) != TRUE) + { + if (!RemoveDirectoryW(szwPtr)) + { + Trace("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + free(szwPtr); + PAL_TerminateEx(FAIL); + return FAIL; + } + + /*compare the new current dir to the compiled current dir */ + if (strncmp(szNewDir, szBuiltDir, strlen(szNewDir)) != 0) + { + if (!RemoveDirectoryW(szwPtr)) + { + Trace("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + free(szwPtr); + Fail("SetCurrentDirectoryA: ERROR -> The set directory \"%s\" does not" + " compare to the built directory \"%s\".\n", + szNewDir, + szBuiltDir); + } + + + + /* set the current dir back to the original */ + if (SetCurrentDirectoryA(szHomeDir) != TRUE) + { + Trace("SetCurrentDirectoryA: ERROR -> Unable to set current " + "directory. Failed with error code: %ld.\n", GetLastError()); + if (!RemoveDirectoryW(szwPtr)) + { + Trace("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + free(szwPtr); + Fail(""); + } + + + /* get the new current directory */ + memset(szNewDir, 0, sizeof(char)*(_MAX_DIR+1)); + if(GetCurrentDir(szNewDir) != TRUE) + { + if (!RemoveDirectoryW(szwPtr)) + { + Trace("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + free(szwPtr); + PAL_TerminateEx(FAIL); + return FAIL; + } + + /* ensure it compares to the "home" directory which is where + we should be now */ + if (strncmp(szNewDir, szHomeDir, strlen(szNewDir)) != 0) + { + if (!RemoveDirectoryW(szwPtr)) + { + Trace("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + free(szwPtr); + Fail("SetCurrentDirectoryA: ERROR -> The set directory does not " + "compare to the built directory.\n"); + } + + + /* clean up */ + if (!RemoveDirectoryW(szwPtr)) + { + free(szwPtr); + Fail("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", GetLastError()); + } + + free(szwPtr); + PAL_Terminate(); + + return PASS; +} + + diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test1/testinfo.dat b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test1/testinfo.dat new file mode 100644 index 0000000000..743b2ea3db --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test1/testinfo.dat @@ -0,0 +1,12 @@ +# 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 = file_io +Function = SetCurrentDirectoryA +Name = Test for SetCurrentDirectoryA (test 1) +Type = DEFAULT +EXE1 = setcurrentdirectorya +Description += Change the current directory and verify the results. diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/CMakeLists.txt b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/CMakeLists.txt new file mode 100644 index 0000000000..7c9caf8081 --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(SOURCES + setcurrentdirectorya.c +) + +add_executable(paltest_setcurrentdirectorya_test2 + ${SOURCES} +) + +add_dependencies(paltest_setcurrentdirectorya_test2 coreclrpal) + +target_link_libraries(paltest_setcurrentdirectorya_test2 + pthread + m + coreclrpal +) diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/setcurrentdirectorya.c b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/setcurrentdirectorya.c new file mode 100644 index 0000000000..415dbbf045 --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/setcurrentdirectorya.c @@ -0,0 +1,142 @@ +// 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: SetCurrentDirectoryA.c (test 2) +** +** Purpose: Tests the PAL implementation of the SetCurrentDirectoryA function +** by setting the current directory with ../ +** +** +**===================================================================*/ + +#include <palsuite.h> + +int __cdecl main(int argc, char *argv[]) +{ + const char szDirName[MAX_PATH] = "testing"; + char szBuiltDir[_MAX_DIR+1]; + char szHomeDirBefore[_MAX_DIR+1]; + char szHomeDirAfter[_MAX_DIR+1]; + WCHAR* szwPtr = NULL; + + + if (0 != PAL_Initialize(argc,argv)) + { + return FAIL; + } + + /* create a temp directory off the current directory */ + szwPtr = convert((LPSTR)szDirName); + + if (CreateDirectoryA(szDirName, NULL) != TRUE) + { + free(szwPtr); + Fail("Unexpected error: CreateDirectoryW failed " + "with error code: %ld.\n", + GetLastError()); + } + + /* find out what the current "home" directory is */ + memset(szHomeDirBefore, 0, (_MAX_DIR+1)); + + if( 0 == GetCurrentDirectoryA((_MAX_DIR+1), szHomeDirBefore) ) + { + Trace("Unexpected error: Unable to get current directory " + "with GetCurrentDirectoryA that returned %ld\n", + GetLastError()); + + if (!RemoveDirectoryW(szwPtr)) + { + Trace("Unexpected error: RemoveDirectoryW failed " + "with error code: %ld.\n", + GetLastError()); + } + free(szwPtr); + + Fail(""); + } + + /* append the temp name to the "home" directory */ + memset(szBuiltDir, 0, (_MAX_DIR+1)); +#if WIN32 + sprintf(szBuiltDir,"%s\\..\\", szDirName); +#else + sprintf(szBuiltDir,"%s/../", szDirName); +#endif + + + /* set the current directory to the temp directory */ + if (SetCurrentDirectoryA(szBuiltDir) != TRUE) + { + Trace("ERROR: Unable to set current " + "directory to %s. Failed with error code: %ld.\n", + szBuiltDir, + GetLastError()); + + if (!RemoveDirectoryW(szwPtr)) + { + Trace("SetCurrentDirectoryA: ERROR -> RemoveDirectoryW failed " + "with error code: %ld.\n", + GetLastError()); + } + free(szwPtr); + Fail(""); + } + + /* find out what the current "home" directory is */ + memset(szHomeDirAfter, 0, (_MAX_DIR+1)); + + if( 0 == GetCurrentDirectoryA((_MAX_DIR+1), szHomeDirAfter) ) + { + Trace("Unexpected error: Unable to get current directory " + "with GetCurrentDirectoryA that returned %ld\n", + GetLastError()); + + if (!RemoveDirectoryW(szwPtr)) + { + Trace("Unexpected error: RemoveDirectoryW failed " + "with error code: %ld.\n", + GetLastError()); + } + free(szwPtr); + + Fail(""); + } + + /*compare the new current dir to the compiled current dir */ + if (strncmp(szHomeDirBefore, szHomeDirAfter, strlen(szHomeDirBefore)) != 0) + { + Trace("ERROR: The set directory \"%s\" does not " + "compare to the built directory \"%s\".\n", + szHomeDirAfter, + szHomeDirBefore); + + if (!RemoveDirectoryW(szwPtr)) + { + Trace("Unexpected error: RemoveDirectoryW failed " + "with error code: %ld.\n", + GetLastError()); + } + free(szwPtr); + Fail(""); + } + + /* clean up */ + if (!RemoveDirectoryW(szwPtr)) + { + free(szwPtr); + Fail("Unexpected error: RemoveDirectoryW failed " + "with error code: %ld.\n", + GetLastError()); + } + + free(szwPtr); + PAL_Terminate(); + + return PASS; +} + + diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/testinfo.dat b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/testinfo.dat new file mode 100644 index 0000000000..677c484062 --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test2/testinfo.dat @@ -0,0 +1,12 @@ +# 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 = file_io +Function = SetCurrentDirectoryA +Name = Positive test for SetCurrentDirectoryA (test 2) +Type = DEFAULT +EXE1 = setcurrentdirectorya +Description += Set the current directory with ../ and verify the results. diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/CMakeLists.txt b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/CMakeLists.txt new file mode 100644 index 0000000000..57d3577d8f --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(SOURCES + setcurrentdirectorya.c +) + +add_executable(paltest_setcurrentdirectorya_test3 + ${SOURCES} +) + +add_dependencies(paltest_setcurrentdirectorya_test3 coreclrpal) + +target_link_libraries(paltest_setcurrentdirectorya_test3 + pthread + m + coreclrpal +) diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/setcurrentdirectorya.c b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/setcurrentdirectorya.c new file mode 100644 index 0000000000..a23a7a6314 --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/setcurrentdirectorya.c @@ -0,0 +1,56 @@ +// 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: SetCurrentDirectoryA.c (test 3) +** +** Purpose: Try calling SetCurrentDirectoryA with an invalid path, +** with a valid filename and with NULL +** +** +**===================================================================*/ + +#include <palsuite.h> + +int __cdecl main(int argc, char *argv[]) +{ + const char szDirName[MAX_PATH] = "testing"; + const char szFileName[MAX_PATH] = "setcurrentdirectorya.c"; + + if (0 != PAL_Initialize(argc,argv)) + { + return FAIL; + } + + /* set the current directory to an unexistant folder */ + if (0 != SetCurrentDirectoryA(szDirName)) + { + Fail("ERROR: SetCurrentDirectoryA should have failed " + "when trying to set the current directory to " + "an invalid folder\n"); + } + + /* set the current directory to an unexistant folder */ + if (0 != SetCurrentDirectoryA(szFileName)) + { + Fail("ERROR: SetCurrentDirectoryA should have failed " + "when trying to set the current directory to " + "a valid file name\n"); + } + + /* set the current directory to NULL */ + if (0 != SetCurrentDirectoryA(NULL)) + { + Fail("ERROR: SetCurrentDirectoryA should have failed " + "when trying to set the current directory to " + "NULL\n"); + } + + PAL_Terminate(); + + return PASS; +} + + diff --git a/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/testinfo.dat b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/testinfo.dat new file mode 100644 index 0000000000..d5520f7993 --- /dev/null +++ b/src/pal/tests/palsuite/file_io/SetCurrentDirectoryA/test3/testinfo.dat @@ -0,0 +1,13 @@ +# 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 = file_io +Function = SetCurrentDirectoryA +Name = Negative test for SetCurrentDirectoryA (test 3) +Type = DEFAULT +EXE1 = setcurrentdirectorya +Description += Try calling SetCurrentDirectoryA with an invalid path, += with a valid filename and with NULL |