From 7426072cdcbb97702cc724f6508593117e202367 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 30 Apr 2008 17:38:05 -0700 Subject: [PATCH 1/5] userenv: add tests for environment variables for CreateEnvironmentBlock. --- dlls/userenv/tests/userenv.c | 189 ++++++++++++++++++++++++++++++++++++++++- 1 files changed, 184 insertions(+), 5 deletions(-) diff --git a/dlls/userenv/tests/userenv.c b/dlls/userenv/tests/userenv.c index c50b0a2..e7f691d 100644 --- a/dlls/userenv/tests/userenv.c +++ b/dlls/userenv/tests/userenv.c @@ -18,39 +18,218 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include #include #include #include "windef.h" #include "winbase.h" +#include "winnls.h" #include "userenv.h" #include "wine/test.h" #define expect(EXPECTED,GOT) ok((GOT)==(EXPECTED), "Expected %d, got %d\n", (EXPECTED), (GOT)) +#define expect_env(EXPECTED,GOT,VAR) ok((GOT)==(EXPECTED), "Expected %d, got %d for %s (%d)\n", (EXPECTED), (GOT), (VAR), j) + +struct profile_item +{ + const char * name; + const int todo[4]; +}; + +/* Debugging functions from wine/libs/wine/debug.c, slightly modified */ + +/* allocate some tmp string space */ +/* FIXME: this is not 100% thread-safe */ +static char *get_tmp_space( int size ) +{ + static char *list[32]; + static long pos; + char *ret; + int idx; + + idx = ++pos % (sizeof(list)/sizeof(list[0])); + if ((ret = realloc( list[idx], size ))) list[idx] = ret; + return ret; +} + +/* default implementation of wine_dbgstr_wn */ +static const char *default_dbgstr_wn( const WCHAR *str, int n, BOOL quotes ) +{ + char *dst, *res; + + if (!HIWORD(str)) + { + if (!str) return "(null)"; + res = get_tmp_space( 6 ); + sprintf( res, "#%04x", LOWORD(str) ); + return res; + } + if (n == -1) n = lstrlenW(str); + if (n < 0) n = 0; + else if (n > 200) n = 200; + dst = res = get_tmp_space( n * 5 + 7 ); + if (quotes) + { + *dst++ = 'L'; + *dst++ = '"'; + } + while (n-- > 0) + { + WCHAR c = *str++; + switch (c) + { + case '\n': *dst++ = '\\'; *dst++ = 'n'; break; + case '\r': *dst++ = '\\'; *dst++ = 'r'; break; + case '\t': *dst++ = '\\'; *dst++ = 't'; break; + case '"': *dst++ = '\\'; *dst++ = '"'; break; + case '\\': *dst++ = '\\'; *dst++ = '\\'; break; + default: + if (c >= ' ' && c <= 126) + *dst++ = (char)c; + else + { + *dst++ = '\\'; + sprintf(dst,"%04x",c); + dst+=4; + } + } + } + if (quotes) *dst++ = '"'; + if (*str) + { + *dst++ = '.'; + *dst++ = '.'; + *dst++ = '.'; + } + *dst = 0; + return res; +} + +const char *wine_dbgstr_wn( const WCHAR *s, int n ) +{ + return default_dbgstr_wn(s, n, TRUE); +} + +const char *wine_dbgstr_w( const WCHAR *s ) +{ + return default_dbgstr_wn( s, -1, TRUE); +} + +const char *userenv_dbgstr_w( const WCHAR *s ) +{ + return default_dbgstr_wn( s, -1, FALSE); +} + +/* Helper function for retrieving environment variables */ +static BOOL get_env(const WCHAR * env, const char * var, char ** result) +{ + const WCHAR * p = env; + int envlen, varlen, buflen; + char buf[256]; + + if (!env || !var || !result) return FALSE; + + varlen = strlen(var); + do + { + envlen = lstrlenW(p); + sprintf(buf, "%s", userenv_dbgstr_w(p)); + if (CompareStringA(GetThreadLocale(), NORM_IGNORECASE|LOCALE_USE_CP_ACP, buf, varlen, var, varlen) == CSTR_EQUAL) + { + if (buf[varlen] == '=') + { + buflen = strlen(buf); + *result = HeapAlloc(GetProcessHeap(), 0, buflen + 1); + if (!*result) return FALSE; + memcpy(*result, buf, buflen + 1); + return TRUE; + } + } + p = p + envlen + 1; + } while (*p); + return FALSE; +} static void test_create_env(void) { BOOL r; HANDLE htok; - WCHAR * env; - WCHAR * env2; + WCHAR * env1, * env2, * env3, * env4; + char * st; + int i, j; + + static const struct profile_item common_vars[] = { + { "ALLUSERSPROFILE", { 1, 1, 1, 1 } }, + { "CommonProgramFiles", { 1, 1, 1, 1 } }, + { "ComSpec", { 1, 1, 0, 0 } }, + { "COMPUTERNAME", { 1, 1, 1, 1 } }, + { "NUMBER_OF_PROCESSORS", { 1, 1, 0, 0 } }, + { "OS", { 1, 1, 0, 0 } }, + { "PROCESSOR_ARCHITECTURE", { 1, 1, 0, 0 } }, + { "PROCESSOR_IDENTIFIER", { 1, 1, 0, 0 } }, + { "PROCESSOR_LEVEL", { 1, 1, 0, 0 } }, + { "PROCESSOR_REVISION", { 1, 1, 0, 0 } }, + { "SystemDrive", { 1, 1, 0, 0 } }, + { "SystemRoot", { 1, 1, 0, 0 } }, + { "windir", { 1, 1, 0, 0 } }, + { "ProgramFiles", { 1, 1, 0, 0 } }, + { 0, { 0, 0, 0, 0 } } + }; r = CreateEnvironmentBlock(NULL, NULL, FALSE); expect(FALSE, r); - r = CreateEnvironmentBlock((LPVOID) &env, NULL, FALSE); - expect(TRUE, r); - r = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &htok); expect(TRUE, r); r = CreateEnvironmentBlock(NULL, htok, FALSE); expect(FALSE, r); + r = CreateEnvironmentBlock((LPVOID) &env1, NULL, FALSE); + expect(TRUE, r); + r = CreateEnvironmentBlock((LPVOID) &env2, htok, FALSE); expect(TRUE, r); + + r = CreateEnvironmentBlock((LPVOID) &env3, NULL, TRUE); + expect(TRUE, r); + + r = CreateEnvironmentBlock((LPVOID) &env4, htok, TRUE); + expect(TRUE, r); + + /* Test for common environment variables */ + i = 0; + while (common_vars[i].name) + { + j = 0; + r = get_env(env1, common_vars[i].name, &st); + if (common_vars[i].todo[j]) + todo_wine expect_env(TRUE, r, common_vars[i].name); + else + expect_env(TRUE, r, common_vars[i].name); + j++; + r = get_env(env2, common_vars[i].name, &st); + if (common_vars[i].todo[j]) + todo_wine expect_env(TRUE, r, common_vars[i].name); + else + expect_env(TRUE, r, common_vars[i].name); + j++; + r = get_env(env3, common_vars[i].name, &st); + if (common_vars[i].todo[j]) + todo_wine expect_env(TRUE, r, common_vars[i].name); + else + expect_env(TRUE, r, common_vars[i].name); + j++; + r = get_env(env4, common_vars[i].name, &st); + if (common_vars[i].todo[j]) + todo_wine expect_env(TRUE, r, common_vars[i].name); + else + expect_env(TRUE, r, common_vars[i].name); + i++; + } } START_TEST(userenv) -- 1.5.2.2