Module: wine Branch: master Commit: 90f79099a45437b9a3a0127eaf5d45f8b49b2fec URL: https://source.winehq.org/git/wine.git/?a=commit;h=90f79099a45437b9a3a0127ea...
Author: Akihiro Sagawa sagawa.aki@gmail.com Date: Sun May 26 21:15:01 2019 +0900
advapi32/tests: Add more RegLoadMUIString tests.
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/advapi32/tests/Makefile.in | 2 ++ dlls/advapi32/tests/registry.c | 79 ++++++++++++++++++++++++++++++++++++++++- dlls/advapi32/tests/rsrc.rc | 22 ++++++++++++ 3 files changed, 102 insertions(+), 1 deletion(-)
diff --git a/dlls/advapi32/tests/Makefile.in b/dlls/advapi32/tests/Makefile.in index 36ce031..12583e5 100644 --- a/dlls/advapi32/tests/Makefile.in +++ b/dlls/advapi32/tests/Makefile.in @@ -13,3 +13,5 @@ C_SRCS = \ registry.c \ security.c \ service.c + +RC_SRCS = rsrc.rc diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index c178e39..911186f 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -3836,17 +3836,42 @@ todo_wine
static void test_RegLoadMUIString(void) { - HMODULE hUser32, hResDll; + HMODULE hUser32, hResDll, hFile; int (WINAPI *pLoadStringW)(HMODULE, UINT, WCHAR *, int); LONG ret; HKEY hkey; DWORD type, size, text_size; UINT i; char buf[64], *p, sysdir[MAX_PATH]; + char with_env_var[128], filename[MAX_PATH], tmp_path[MAX_PATH]; WCHAR textW[64], bufW[64]; WCHAR curdirW[MAX_PATH], sysdirW[MAX_PATH]; const static char tz_value[] = "MUI_Std"; const static WCHAR tz_valueW[] = {'M','U','I','_','S','t','d', 0}; + struct { + const char* value; + DWORD type; + BOOL use_sysdir; + DWORD expected; + DWORD broken_ret; + BOOL todo; + } test_case[] = { + /* 0 */ + { "", REG_SZ, FALSE, ERROR_INVALID_DATA, 0, TRUE }, + { "not a MUI string", REG_SZ, FALSE, ERROR_INVALID_DATA, 0, TRUE }, + { "@unknown.dll", REG_SZ, TRUE, ERROR_INVALID_DATA, 0, TRUE }, + { "@unknown.dll,-10", REG_SZ, TRUE, ERROR_FILE_NOT_FOUND }, + /* 4 */ + { with_env_var, REG_SZ, FALSE, ERROR_SUCCESS, 0, TRUE }, + { with_env_var, REG_EXPAND_SZ, FALSE, ERROR_SUCCESS }, + { "%WineMuiTest1%", REG_EXPAND_SZ, TRUE, ERROR_INVALID_DATA, 0, TRUE }, + { "@%WineMuiTest2%", REG_EXPAND_SZ, TRUE, ERROR_SUCCESS }, + /* 8 */ + { "@%WineMuiExe%,a", REG_SZ, FALSE, ERROR_INVALID_DATA, 0, TRUE }, + { "@%WineMuiExe%,-4", REG_SZ, FALSE, ERROR_NOT_FOUND, ERROR_FILE_NOT_FOUND, TRUE }, + { "@%WineMuiExe%,-39", REG_SZ, FALSE, ERROR_RESOURCE_NAME_NOT_FOUND, 0, TRUE }, + { "@%WineMuiDat%,-16", REG_EXPAND_SZ, FALSE, ERROR_BAD_EXE_FORMAT, ERROR_FILE_NOT_FOUND, TRUE }, + };
if (!pRegLoadMUIStringA || !pRegLoadMUIStringW) { @@ -3869,6 +3894,13 @@ static void test_RegLoadMUIString(void) ok(ret == ERROR_SUCCESS, "got %d\n", ret); ok(buf[0] == '@', "got %s\n", buf);
+ /* setup MUI string for tests */ + strcpy(with_env_var, "@%windir%\system32\"); + strcat(with_env_var, &buf[1]); + SetEnvironmentVariableA("WineMuiTest1", buf); + SetEnvironmentVariableA("WineMuiTest2", &buf[1]); + + /* load expecting text */ p = strrchr(buf, ','); *p = '\0'; i = atoi(p + 2); /* skip ',-' */ @@ -3955,7 +3987,52 @@ static void test_RegLoadMUIString(void) ok(ret == ERROR_CALL_NOT_IMPLEMENTED, "got %d, expected ERROR_CALL_NOT_IMPLEMENTED\n", ret);
RegCloseKey(hkey); + + GetModuleFileNameA(NULL, filename, ARRAY_SIZE(filename)); + SetEnvironmentVariableA("WineMuiExe", filename); + + GetTempPathA(ARRAY_SIZE(tmp_path), tmp_path); + GetTempFileNameA(tmp_path, "mui", 0, filename); + SetEnvironmentVariableA("WineMuiDat", filename); + + /* write dummy data to the file, i.e. it's not a PE file. */ + hFile = CreateFileA(filename, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + ok(hFile != INVALID_HANDLE_VALUE, "can't open %s\n", filename); + WriteFile(hFile, filename, strlen(filename), &size, NULL); + CloseHandle(hFile); + + for (i = 0; i < ARRAY_SIZE(test_case); i++) + { + size = test_case[i].value ? strlen(test_case[i].value) + 1 : 0; + ret = RegSetValueExA(hkey_main, tz_value, 0, test_case[i].type, + (const BYTE *)test_case[i].value, size); + ok(ret == ERROR_SUCCESS, "[%2u] got %d\n", i, ret); + + size = 0xdeadbeef; + memset(bufW, 0xff, sizeof(bufW)); + ret = pRegLoadMUIStringW(hkey_main, tz_valueW, bufW, ARRAY_SIZE(bufW), + &size, 0, + test_case[i].use_sysdir ? sysdirW : NULL); + todo_wine_if(test_case[i].todo) + ok(ret == test_case[i].expected || + broken(test_case[i].value[0] == '%' && ret == ERROR_SUCCESS /* vista */) || + broken(test_case[i].broken_ret && ret == test_case[i].broken_ret /* vista */), + "[%2u] expected %d, got %d\n", i, test_case[i].expected, ret); + if (ret == ERROR_SUCCESS && test_case[i].expected == ERROR_SUCCESS) + { + ok(size == text_size, "[%2u] got %u, expected %u\n", i, size, text_size); + ok(!memcmp(bufW, textW, size), "[%2u] got %s, expected %s\n", i, + wine_dbgstr_wn(bufW, size/sizeof(WCHAR)), + wine_dbgstr_wn(textW, text_size/sizeof(WCHAR))); + } + } + SetCurrentDirectoryW(curdirW); + DeleteFileA(filename); + SetEnvironmentVariableA("WineMuiTest1", NULL); + SetEnvironmentVariableA("WineMuiTest2", NULL); + SetEnvironmentVariableA("WineMuiExe", NULL); + SetEnvironmentVariableA("WineMuiDat", NULL); }
START_TEST(registry) diff --git a/dlls/advapi32/tests/rsrc.rc b/dlls/advapi32/tests/rsrc.rc new file mode 100644 index 0000000..35b6171 --- /dev/null +++ b/dlls/advapi32/tests/rsrc.rc @@ -0,0 +1,22 @@ +/* + * Copyright 2019 Akihiro Sagawa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +STRINGTABLE +{ + 1 "dummy" +}