WindowsXP/Source/XPSP1/NT/base/win32/client/tlfn.c
2024-08-03 16:30:48 +02:00

347 lines
7.6 KiB
C

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
tlfn.c
Abstract:
Test program for GetShortPathName and GetLongPathName
Author:
William Hsieh (williamh) 26-Mar-1997
Revision History:
--*/
#undef UNICODE
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <assert.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include "basedll.h"
BOOL
CreateTestDirs(LPSTR BasePath, DWORD Depth);
BOOL
DeleteTestDirs(LPSTR BasePath, DWORD Depth);
DWORD
DoTest(LPSTR BasePath, DWORD Depth);
BOOL
DoNullPathTest();
LPSTR g_BasePath = "C:\\LongDirectoryForTesting";
#define MAX_SUBDIRS 22
// Note that NT file APIs strips trailing white chars automatically,
// thus, path name such as "12345678.12 " will be created as
// "12345678.12". Do not put something like this in the following table
// or the test will fail.
// The TestDepth controls the depth of the testing sub-dirs this program
// creates. It could take a long time to complete the test if TestDepth
// is set to larger than 3. With TestDepth set to 1, the program only tests
// the BasePath. You can always manually test a particular pathname
// by running "tlfn 1 yourpath". In this case, the given directory will not
// be removed by this program.
//
LPSTR g_subdir[MAX_SUBDIRS] = {
"12345678.123",
"12345678.1",
"8.1",
"8.123",
"12345678.1",
"12345678",
" 2345678. 3",
" 8.1 3",
"1 8. 23",
"123 678.123",
"123 678.1 3",
".1",
"..2",
"...3",
"1 4 6 8........1 3",
"1 8..123",
"12345678..1 3",
"12345678.12345678",
"1234567890123456.1111",
"123456789.123",
"12345678.1234",
"12345 1"
};
CHAR g_ShortName[MAX_PATH + 1];
CHAR g_LongName[MAX_PATH + 1];
DWORD g_TestDepth = 3;
DWORD
_cdecl
main(
int argc,
char *argv[],
char *envp[]
)
{
DWORD FailCount;
LPSTR BasePath;
DWORD TestDepth;
TestDepth = g_TestDepth;
BasePath = g_BasePath;
if (argc > 1 && argv[1])
{
TestDepth = atoi(argv[1]);
}
if (argc > 2 && argv[2])
{
BasePath = argv[2];
}
printf("Test depth = %d, Base path = %s\n", TestDepth, BasePath);
if (!DoNullPathTest()) {
printf("NullPath test Failed\n");
return FALSE;
}
printf("Null Path test passed\n");
if (TestDepth != 1 || BasePath == g_BasePath) {
printf("\n\nCreating testing sub-directories.....\n\n\n");
if (!CreateTestDirs(BasePath, TestDepth))
{
printf("Unable to create test path names\n");
return FALSE;
}
}
printf("Start testing....\n");
FailCount = DoTest(BasePath, TestDepth);
if (!FailCount)
printf("Test passed\n");
else
printf("Test not passed, failed count = %ld\n", FailCount);
if (TestDepth != 1 || BasePath == g_BasePath) {
printf("Removing test sub-directories\n\n\n");
DeleteTestDirs(BasePath, TestDepth);
}
return TRUE;
}
BOOL
CreateTestDirs(
LPTSTR BasePath,
DWORD Depth
)
{
int len;
CHAR szBase[MAX_PATH + 1];
BOOL Result;
DWORD dw;
Result = TRUE;
dw = GetFileAttributes(BasePath);
if (dw == 0xFFFFFFFF)
{
if (!CreateDirectory(BasePath, NULL))
{
printf("CreateTestDirs::Unable to create base directory, error = %ld\n",
GetLastError());
return FALSE;
}
}
dw = GetFileAttributes(BasePath);
if (dw == 0xFFFFFFFF || !(dw & FILE_ATTRIBUTE_DIRECTORY))
return FALSE;
if (Depth > 1)
{
int i;
len = strlen(BasePath);
strcpy(szBase, BasePath);
for (i = 0; i < MAX_SUBDIRS; i++)
{
szBase[len] = '\\';
strcpy((szBase + len + 1), g_subdir[(Depth & 1) ? i : MAX_SUBDIRS - i - 1]);
if (!CreateTestDirs(szBase, Depth - 1))
{
Result = FALSE;
break;
}
}
}
return Result;
}
BOOL
DeleteTestDirs(
LPSTR BasePath,
DWORD Depth
)
{
int i, len;
CHAR Temp[MAX_PATH + 1];
strcpy(Temp, BasePath);
len = strlen(BasePath);
if (Depth)
{
for (i = 0; i < MAX_SUBDIRS; i++)
{
Temp[len] = '\\';
strcpy((Temp + len + 1), g_subdir[(Depth & 1) ?i : MAX_SUBDIRS - i - 1]);
DeleteTestDirs(Temp, Depth - 1);
}
}
RemoveDirectory(BasePath);
return TRUE;
}
DWORD
DoTest(
LPSTR BasePath,
DWORD Depth
)
{
DWORD dw, dwTemp;
DWORD FailCount;
LPSTR ShortPath, LongPath;
CHAR FunnyBuffer[1];
ASSERT(Depth >= 1);
ASSERT(BasePath);
FailCount = 0;
// this should fail
dw = GetShortPathName(BasePath, NULL, 0);
dwTemp = GetShortPathName(BasePath, FunnyBuffer, sizeof(FunnyBuffer) / sizeof(CHAR));
ASSERT(dw == dwTemp);
dwTemp = GetShortPathName(BasePath, NULL, 0xffff);
ASSERT(dw == dwTemp);
dwTemp = GetShortPathName(BasePath, FunnyBuffer, 0);
ASSERT(dwTemp == dw);
ShortPath = (LPTSTR)malloc(dw * sizeof(CHAR));
if (!ShortPath) {
printf("Not enough memory\n");
return 0;
}
dwTemp = GetShortPathName(BasePath, ShortPath, dw - 1);
ASSERT(dwTemp == dw);
dwTemp = GetShortPathName(BasePath, ShortPath, dw);
ASSERT(dwTemp && dwTemp + 1 == dw);
printf("\"%s\" L-S -> \"%s\"\n", BasePath, ShortPath);
strcpy(g_LongName, BasePath);
dw = GetShortPathName(g_LongName, g_LongName, dwTemp - 1);
if (_stricmp(BasePath, g_LongName))
{
printf("Overwrite source string\n");
ASSERT(FALSE);
strcpy(g_LongName, BasePath);
}
dw = GetShortPathName(g_LongName, g_LongName, dwTemp + 1);
ASSERT(dw == dwTemp);
if (_stricmp(ShortPath, g_LongName)) {
printf("GetShortPathName mismatch with different desitination buffer\n");
ASSERT(FALSE);
}
dw = GetLongPathName(ShortPath, NULL, 0);
dwTemp = GetLongPathName(ShortPath, FunnyBuffer, sizeof(FunnyBuffer) / sizeof(CHAR));
ASSERT(dw == dwTemp);
dwTemp = GetLongPathName(ShortPath, NULL, 0xffff);
ASSERT(dwTemp == dw);
dwTemp = GetLongPathName(ShortPath, FunnyBuffer, 0);
ASSERT(dw == dwTemp);
LongPath = (LPSTR)malloc(dw * sizeof(CHAR));
if (!LongPath) {
printf("Not enough memory\n");
free(ShortPath);
return(0);
}
dwTemp = GetLongPathName(ShortPath, LongPath, dw - 1);
ASSERT( dw == dwTemp);
dwTemp = GetLongPathName(ShortPath, LongPath, dw);
ASSERT(dwTemp && dwTemp + 1 == dw);
printf("\"%s\" S-L -> \"%s\"\n", ShortPath, LongPath);
strcpy(g_ShortName, ShortPath);
dw = GetLongPathName(g_ShortName, g_ShortName, dwTemp - 1);
if (_stricmp(ShortPath, g_ShortName))
{
printf("Overwrite source string\n");
ASSERT(FALSE);
strcpy(g_ShortName, ShortPath);
}
dw = GetLongPathName(g_ShortName, g_ShortName, dwTemp + 1);
ASSERT(dw == dwTemp);
if (_stricmp(LongPath, g_ShortName)) {
printf("GetLongPathName mismatch with different desitination buffer\n");
ASSERT(FALSE);
}
if (_stricmp(LongPath, BasePath))
{
FailCount++;
printf("round trip does not match\n");
ASSERT(FALSE);
}
if(Depth > 1) {
int i, len;
CHAR TempName[MAX_PATH + 1];
len = strlen(BasePath);
strcpy(TempName, BasePath);
for (i = 0; i < MAX_SUBDIRS; i++)
{
TempName[len] = '\\';
strcpy((TempName + len + 1), g_subdir[(Depth & 1) ?i : MAX_SUBDIRS - i - 1]);
FailCount += DoTest(TempName, Depth - 1);
}
}
free(ShortPath);
free(LongPath);
return FailCount;
}
BOOL
DoNullPathTest()
{
CHAR ShortName[1];
CHAR LongName[1];
DWORD dw;
LongName[0] = '\0';
dw = GetShortPathName(LongName, ShortName, 0);
ASSERT(dw == 1);
dw = GetShortPathName(LongName, ShortName, 1);
ASSERT(dw == 0);
ShortName[0] = '\0';
dw = GetLongPathName(ShortName, LongName, 0);
ASSERT(dw == 1);
dw = GetLongPathName(ShortName, LongName, 1);
ASSERT(dw == 0);
return (dw == 0);
}