Lei Zhang : userenv: Add tests for environment variables for CreateEnvironmentBlock.

Alexandre Julliard julliard at winehq.org
Thu May 1 06:39:16 CDT 2008


Module: wine
Branch: master
Commit: ed50b7746d99a50f985a9c7c20b5e17d1e2deb6e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ed50b7746d99a50f985a9c7c20b5e17d1e2deb6e

Author: Lei Zhang <thestig at google.com>
Date:   Wed Apr 30 17:38:05 2008 -0700

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 <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
 
 #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)




More information about the wine-cvs mailing list