Skip to content

Commit 092e245

Browse files
[UTILDLL_APITEST] Create 'CachedGetUserFromSid()' test (reactos#2954)
1 parent 7187b4d commit 092e245

File tree

4 files changed

+116
-0
lines changed

4 files changed

+116
-0
lines changed

modules/rostests/apitests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ add_subdirectory(psapi)
4545
add_subdirectory(user32)
4646
add_subdirectory(user32_dynamic)
4747
add_subdirectory(userenv)
48+
add_subdirectory(utildll)
4849
add_subdirectory(uxtheme)
4950
if(NOT CMAKE_BUILD_TYPE STREQUAL "Release")
5051
add_subdirectory(win32u)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
list(APPEND SOURCE
3+
CachedGetUserFromSid.c)
4+
5+
add_executable(utildll_apitest
6+
${SOURCE}
7+
testlist.c)
8+
9+
set_module_type(utildll_apitest win32cui)
10+
add_importlibs(utildll_apitest msvcrt kernel32)
11+
add_rostests_file(TARGET utildll_apitest)
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* PROJECT: ReactOS API Tests
3+
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4+
* PURPOSE: Tests for CachedGetUserFromSid
5+
* COPYRIGHT: Copyright 2020 Serge Gautherie <[email protected]>
6+
*/
7+
8+
#include <apitest.h>
9+
10+
#include <lmcons.h>
11+
#include <wchar.h>
12+
13+
static VOID (WINAPI *pCachedGetUserFromSid)(PSID pSid, LPWSTR pUserName, PULONG pcwcUserName);
14+
15+
static void test_Sid_Null(void)
16+
{
17+
const WCHAR szUserNameFromNull[] = L"(unknown)";
18+
const ULONG cchUserNameFromNull = (ULONG)wcslen(szUserNameFromNull);
19+
20+
WCHAR szUserName[UNLEN + 1];
21+
ULONG cchUserName;
22+
23+
// First, full success case, to load result into cache.
24+
// Otherwise, expect misbehavior/corruption/crash!
25+
// Same issues with 'NULL' or '0' arguments.
26+
// Behavior changed on NT6.0 then NT6.1+...
27+
28+
wmemset(szUserName, L'?', _countof(szUserName));
29+
cchUserName = _countof(szUserName);
30+
pCachedGetUserFromSid(NULL, szUserName, &cchUserName);
31+
ok(cchUserName == cchUserNameFromNull, "cchUserName: expected %lu, got %lu\n", cchUserNameFromNull, cchUserName);
32+
ok(wcscmp(szUserName, szUserNameFromNull) == 0, "szUserName: expected \"%S\", got \"%.*S\"\n", szUserNameFromNull, (int)cchUserName, szUserName);
33+
34+
wmemset(szUserName, L'?', _countof(szUserName));
35+
cchUserName = 1;
36+
pCachedGetUserFromSid(NULL, szUserName, &cchUserName);
37+
ok(cchUserName == 0, "cchUserName: expected 0, got %lu\n", cchUserName);
38+
ok(szUserName[0] == UNICODE_NULL, "szUserName: missing UNICODE_NULL, got \"%.*S\"\n", (int)cchUserName, szUserName);
39+
40+
wmemset(szUserName, L'?', _countof(szUserName));
41+
cchUserName = 2;
42+
pCachedGetUserFromSid(NULL, szUserName, &cchUserName);
43+
ok(cchUserName == 1, "cchUserName: expected 0, got %lu\n", cchUserName);
44+
ok(szUserName[1] == UNICODE_NULL, "szUserName: missing UNICODE_NULL, got \"%.*S\"\n", (int)cchUserName, szUserName);
45+
ok(wcsncmp(szUserName, szUserNameFromNull, 1) == 0, "szUserName: expected \"%.*S\", got \"%.*S\"\n", 1, szUserNameFromNull, (int)cchUserName, szUserName);
46+
47+
wmemset(szUserName, L'?', _countof(szUserName));
48+
cchUserName = cchUserNameFromNull;
49+
pCachedGetUserFromSid(NULL, szUserName, &cchUserName);
50+
ok(cchUserName == cchUserNameFromNull - 1, "cchUserName: expected %lu, got %lu\n", cchUserNameFromNull - 1, cchUserName);
51+
ok(szUserName[cchUserNameFromNull - 1] == UNICODE_NULL, "szUserName: missing UNICODE_NULL, got \"%.*S\"\n", (int)cchUserName, szUserName);
52+
ok(wcsncmp(szUserName, szUserNameFromNull, cchUserNameFromNull - 1) == 0, "szUserName: expected \"%.*S\", got \"%.*S\"\n", (int)cchUserNameFromNull - 1, szUserNameFromNull, (int)cchUserName, szUserName);
53+
54+
wmemset(szUserName, L'?', _countof(szUserName));
55+
cchUserName = cchUserNameFromNull + 1;
56+
pCachedGetUserFromSid(NULL, szUserName, &cchUserName);
57+
ok(cchUserName == cchUserNameFromNull, "cchUserName: expected %lu, got %lu\n", cchUserNameFromNull, cchUserName);
58+
ok(wcscmp(szUserName, szUserNameFromNull) == 0, "szUserName: expected \"%S\", got \"%.*S\"\n", szUserNameFromNull, (int)cchUserName, szUserName);
59+
}
60+
61+
START_TEST(CachedGetUserFromSid)
62+
{
63+
const char szFunction[] = "CachedGetUserFromSid";
64+
65+
// TODO: Dynamically checking, until ReactOS implements this dll.
66+
HMODULE hModule = LoadLibraryW(L"utildll.dll");
67+
DWORD dwLE = GetLastError();
68+
69+
if (!hModule)
70+
{
71+
ok(FALSE, "LoadLibraryW(\"%S\") failed! (dwLE = %lu)\n", L"utildll.dll", dwLE);
72+
73+
skip("No DLL\n");
74+
return;
75+
}
76+
77+
void *pFunction = (void *)GetProcAddress(hModule, szFunction);
78+
dwLE = GetLastError();
79+
80+
if (!pFunction)
81+
{
82+
ok(FALSE, "GetProcAddress(\"%s\") failed! (dwLE = %lu)\n", szFunction, dwLE);
83+
84+
skip("No function\n");
85+
FreeLibrary(hModule);
86+
return;
87+
}
88+
89+
pCachedGetUserFromSid = pFunction;
90+
91+
test_Sid_Null();
92+
93+
FreeLibrary(hModule);
94+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#define STANDALONE
2+
#include <apitest.h>
3+
4+
extern void func_CachedGetUserFromSid(void);
5+
6+
const struct test winetest_testlist[] =
7+
{
8+
{ "CachedGetUserFromSid", func_CachedGetUserFromSid },
9+
{ 0, 0 }
10+
};

0 commit comments

Comments
 (0)