From c345f7b95345d6ea2ffa77ef55cc08591a4bc80c Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 10 Jul 2002 03:30:14 +0000 Subject: [PATCH] Created registry unit test and added tests for RegEnumValue[AW]. --- configure | 5 + configure.ac | 1 + dlls/advapi32/Makefile.in | 6 +- dlls/advapi32/tests/.cvsignore | 3 + dlls/advapi32/tests/registry.c | 206 +++++++++++++++++++++++++++++++++ 5 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 dlls/advapi32/tests/.cvsignore create mode 100644 dlls/advapi32/tests/registry.c diff --git a/configure b/configure index 979b3d97fbe..15fb355fadf 100755 --- a/configure +++ b/configure @@ -13222,6 +13222,8 @@ fi ac_config_commands="$ac_config_commands controls" +ac_config_commands="$ac_config_commands dlls/advapi32/tests" + ac_config_commands="$ac_config_commands dlls/ddraw/d3ddevice" ac_config_commands="$ac_config_commands dlls/ddraw/dclipper" @@ -13927,6 +13929,7 @@ do "tsx11/Makefile" ) CONFIG_FILES="$CONFIG_FILES tsx11/Makefile" ;; "unicode/Makefile" ) CONFIG_FILES="$CONFIG_FILES unicode/Makefile" ;; "controls" ) CONFIG_COMMANDS="$CONFIG_COMMANDS controls" ;; + "dlls/advapi32/tests" ) CONFIG_COMMANDS="$CONFIG_COMMANDS dlls/advapi32/tests" ;; "dlls/ddraw/d3ddevice" ) CONFIG_COMMANDS="$CONFIG_COMMANDS dlls/ddraw/d3ddevice" ;; "dlls/ddraw/dclipper" ) CONFIG_COMMANDS="$CONFIG_COMMANDS dlls/ddraw/dclipper" ;; "dlls/ddraw/ddraw" ) CONFIG_COMMANDS="$CONFIG_COMMANDS dlls/ddraw/ddraw" ;; @@ -14607,6 +14610,8 @@ echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in controls ) test -d "controls" || ({ echo "$as_me:$LINENO: creating controls" >&5 echo "$as_me: creating controls" >&6;} && mkdir "controls") ;; + dlls/advapi32/tests ) test -d "dlls/advapi32/tests" || ({ echo "$as_me:$LINENO: creating dlls/advapi32/tests" >&5 +echo "$as_me: creating dlls/advapi32/tests" >&6;} && mkdir "dlls/advapi32/tests") ;; dlls/ddraw/d3ddevice ) test -d "dlls/ddraw/d3ddevice" || ({ echo "$as_me:$LINENO: creating dlls/ddraw/d3ddevice" >&5 echo "$as_me: creating dlls/ddraw/d3ddevice" >&6;} && mkdir "dlls/ddraw/d3ddevice") ;; dlls/ddraw/dclipper ) test -d "dlls/ddraw/dclipper" || ({ echo "$as_me:$LINENO: creating dlls/ddraw/dclipper" >&5 diff --git a/configure.ac b/configure.ac index 6a250ea9f0a..f064a98d4e0 100644 --- a/configure.ac +++ b/configure.ac @@ -1192,6 +1192,7 @@ dnl **** Generate output files **** AH_TOP([#define __WINE_CONFIG_H]) WINE_CONFIG_EXTRA_DIR(controls) +WINE_CONFIG_EXTRA_DIR(dlls/advapi32/tests) WINE_CONFIG_EXTRA_DIR(dlls/ddraw/d3ddevice) WINE_CONFIG_EXTRA_DIR(dlls/ddraw/dclipper) WINE_CONFIG_EXTRA_DIR(dlls/ddraw/ddraw) diff --git a/dlls/advapi32/Makefile.in b/dlls/advapi32/Makefile.in index d652fb2baee..8c703dd07c9 100644 --- a/dlls/advapi32/Makefile.in +++ b/dlls/advapi32/Makefile.in @@ -17,7 +17,11 @@ C_SRCS = \ security.c \ service.c +CTESTS = \ + tests/registry.c + +EXTRASUBDIRS = tests + @MAKE_DLL_RULES@ ### Dependencies: - diff --git a/dlls/advapi32/tests/.cvsignore b/dlls/advapi32/tests/.cvsignore new file mode 100644 index 00000000000..b5e478bdc35 --- /dev/null +++ b/dlls/advapi32/tests/.cvsignore @@ -0,0 +1,3 @@ +advapi32_test.exe.spec.c +registry.ok +testlist.c diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c new file mode 100644 index 00000000000..191fb0ddc9b --- /dev/null +++ b/dlls/advapi32/tests/registry.c @@ -0,0 +1,206 @@ +/* + * Unit tests for registry functions + * + * Copyright (c) 2002 Alexandre Julliard + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "wine/test.h" +#include "winreg.h" +#include "winerror.h" + +static HKEY hkey_main; + +/* delete key and all its subkeys */ +static DWORD delete_key( HKEY hkey ) +{ + WCHAR name[MAX_PATH]; + DWORD ret; + + while (!(ret = RegEnumKeyW(hkey, 0, name, sizeof(name)))) + { + if ((ret = delete_key( hkey ))) break; + } + if (ret != ERROR_NO_MORE_ITEMS) return ret; + RegDeleteKeyA( hkey, NULL ); + return 0; +} + +static void setup_main_key(void) +{ + if (RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\Test", &hkey_main )) delete_key( hkey_main ); + + assert (!RegCreateKeyExA( HKEY_CURRENT_USER, "Software\\Wine\\Test", 0, NULL, + REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey_main, NULL )); +} + +static void test_enum_value(void) +{ + DWORD res; + char value[20], data[20]; + WCHAR valueW[20], dataW[20]; + DWORD val_count, data_count, type; + static const WCHAR foobarW[] = {'f','o','o','b','a','r',0}; + static const WCHAR testW[] = {'T','e','s','t',0}; + static const WCHAR xxxW[] = {'x','x','x','x','x','x','x','x',0}; + + res = RegSetValueExA( hkey_main, "Test", 0, REG_SZ, (BYTE *)"foobar", 7 ); + ok( res == 0, "RegSetValueExA failed error %ld", res ); + + /* overflow both name and data */ + val_count = 2; + data_count = 2; + type = 1234; + strcpy( value, "xxxxxxxxxx" ); + strcpy( data, "xxxxxxxxxx" ); + res = RegEnumValueA( hkey_main, 0, value, &val_count, NULL, &type, data, &data_count ); + ok( res == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %ld", res ); + ok( val_count == 2, "val_count set to %ld", val_count ); + ok( data_count == 7, "data_count set to %ld instead of 7", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !strcmp( value, "xxxxxxxxxx" ), "value set to '%s'", value ); + ok( !strcmp( data, "xxxxxxxxxx" ), "data set to '%s'", data ); + + /* overflow name */ + val_count = 3; + data_count = 20; + type = 1234; + strcpy( value, "xxxxxxxxxx" ); + strcpy( data, "xxxxxxxxxx" ); + res = RegEnumValueA( hkey_main, 0, value, &val_count, NULL, &type, data, &data_count ); + ok( res == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %ld", res ); + ok( val_count == 3, "val_count set to %ld", val_count ); + ok( data_count == 7, "data_count set to %ld instead of 7", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !strcmp( value, "Te" ), "value set to '%s' instead of 'Te'", value ); + ok( !strcmp( data, "foobar" ), "data set to '%s' instead of 'foobar'", data ); + + /* overflow empty name */ + val_count = 0; + data_count = 20; + type = 1234; + strcpy( value, "xxxxxxxxxx" ); + strcpy( data, "xxxxxxxxxx" ); + res = RegEnumValueA( hkey_main, 0, value, &val_count, NULL, &type, data, &data_count ); + ok( res == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %ld", res ); + ok( val_count == 0, "val_count set to %ld", val_count ); + ok( data_count == 7, "data_count set to %ld instead of 7", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !strcmp( value, "xxxxxxxxxx" ), "value set to '%s'", value ); + ok( !strcmp( data, "foobar" ), "data set to '%s' instead of 'foobar'", data ); + + /* overflow data */ + val_count = 20; + data_count = 2; + type = 1234; + strcpy( value, "xxxxxxxxxx" ); + strcpy( data, "xxxxxxxxxx" ); + res = RegEnumValueA( hkey_main, 0, value, &val_count, NULL, &type, data, &data_count ); + ok( res == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %ld", res ); + ok( val_count == 20, "val_count set to %ld", val_count ); + ok( data_count == 7, "data_count set to %ld instead of 7", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !strcmp( value, "xxxxxxxxxx" ), "value set to '%s'", value ); + ok( !strcmp( data, "xxxxxxxxxx" ), "data set to '%s'", data ); + + /* no overflow */ + val_count = 20; + data_count = 20; + type = 1234; + strcpy( value, "xxxxxxxxxx" ); + strcpy( data, "xxxxxxxxxx" ); + res = RegEnumValueA( hkey_main, 0, value, &val_count, NULL, &type, data, &data_count ); + ok( res == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld", res ); + ok( val_count == 4, "val_count set to %ld instead of 4", val_count ); + ok( data_count == 7, "data_count set to %ld instead of 7", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !strcmp( value, "Test" ), "value is '%s' instead of Test", value ); + ok( !strcmp( data, "foobar" ), "data is '%s' instead of foobar", data ); + + /* Unicode tests */ + + res = RegSetValueExW( hkey_main, testW, 0, REG_SZ, (BYTE *)foobarW, 7*sizeof(WCHAR) ); + ok( res == 0, "RegSetValueExW failed error %ld", res ); + + /* overflow both name and data */ + val_count = 2; + data_count = 2; + type = 1234; + memcpy( valueW, xxxW, sizeof(xxxW) ); + memcpy( dataW, xxxW, sizeof(xxxW) ); + res = RegEnumValueW( hkey_main, 0, valueW, &val_count, NULL, &type, (BYTE*)dataW, &data_count ); + ok( res == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %ld", res ); + ok( val_count == 2, "val_count set to %ld", val_count ); + ok( data_count == 7*sizeof(WCHAR), "data_count set to %ld instead of 7*sizeof(WCHAR)", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !memcmp( valueW, xxxW, sizeof(xxxW) ), "value modified" ); + ok( !memcmp( dataW, xxxW, sizeof(xxxW) ), "data modified" ); + + /* overflow name */ + val_count = 3; + data_count = 20; + type = 1234; + memcpy( valueW, xxxW, sizeof(xxxW) ); + memcpy( dataW, xxxW, sizeof(xxxW) ); + res = RegEnumValueW( hkey_main, 0, valueW, &val_count, NULL, &type, (BYTE*)dataW, &data_count ); + ok( res == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %ld", res ); + ok( val_count == 3, "val_count set to %ld", val_count ); + ok( data_count == 7*sizeof(WCHAR), "data_count set to %ld instead of 7*sizeof(WCHAR)", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !memcmp( valueW, xxxW, sizeof(xxxW) ), "value modified" ); + ok( !memcmp( dataW, xxxW, sizeof(xxxW) ), "data modified" ); + + /* overflow data */ + val_count = 20; + data_count = 2; + type = 1234; + memcpy( valueW, xxxW, sizeof(xxxW) ); + memcpy( dataW, xxxW, sizeof(xxxW) ); + res = RegEnumValueW( hkey_main, 0, valueW, &val_count, NULL, &type, (BYTE*)dataW, &data_count ); + ok( res == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %ld", res ); + ok( val_count == 4, "val_count set to %ld instead of 4", val_count ); + ok( data_count == 7*sizeof(WCHAR), "data_count set to %ld instead of 7*sizeof(WCHAR)", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !memcmp( valueW, testW, sizeof(testW) ), "value is not 'Test'" ); + ok( !memcmp( dataW, xxxW, sizeof(xxxW) ), "data modified" ); + + /* no overflow */ + val_count = 20; + data_count = 20; + type = 1234; + memcpy( valueW, xxxW, sizeof(xxxW) ); + memcpy( dataW, xxxW, sizeof(xxxW) ); + res = RegEnumValueW( hkey_main, 0, valueW, &val_count, NULL, &type, (BYTE*)dataW, &data_count ); + ok( res == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld", res ); + ok( val_count == 4, "val_count set to %ld instead of 4", val_count ); + ok( data_count == 7*sizeof(WCHAR), "data_count set to %ld instead of 7*sizeof(WCHAR)", data_count ); + ok( type == REG_SZ, "type %ld is not REG_SZ", type ); + ok( !memcmp( valueW, testW, sizeof(testW) ), "value is not 'Test'" ); + ok( !memcmp( dataW, foobarW, sizeof(foobarW) ), "data is not 'foobar'" ); + + /* cleanup */ + RegDeleteValueA( hkey_main, "Test" ); +} + +START_TEST(registry) +{ + setup_main_key(); + test_enum_value(); + + /* cleanup */ + delete_key( hkey_main ); +}