[UTILDLL_APITEST] Create 'CachedGetUserFromSid()' test (#2954)
[reactos.git] / modules / rostests / apitests / utildll / CachedGetUserFromSid.c
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 <reactos-git_serge_171003@gautherie.fr>
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 }