[PATCH 2/2] msvcrt/tests: Add tests for _searchenv, _searchenv_s, _wsearchenv, _wsearchenv_s
Kirill Erofeev
erofeev.info at gmail.com
Thu Feb 15 03:46:58 CST 2018
Signed-off-by: Kirill Erofeev <erofeev.info at gmail.com>
---
dlls/msvcrt/tests/dir.c | 194 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 194 insertions(+)
diff --git a/dlls/msvcrt/tests/dir.c b/dlls/msvcrt/tests/dir.c
index aa273ea..948b506 100644
--- a/dlls/msvcrt/tests/dir.c
+++ b/dlls/msvcrt/tests/dir.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
+#include <direct.h>
#include <sys/stat.h>
#include <io.h>
#include <mbctype.h>
@@ -35,12 +36,18 @@
static int (__cdecl *p_makepath_s)(char *, size_t, const char *, const char *, const char *, const char *);
static int (__cdecl *p_wmakepath_s)(wchar_t *, size_t, const wchar_t *,const wchar_t *, const wchar_t *, const wchar_t *);
+static int (__cdecl *p_searchenv_s)(const char*, const char*, char*, size_t);
+static int (__cdecl *p_wsearchenv_s)(const wchar_t*, const wchar_t*, wchar_t*, size_t);
+
static void init(void)
{
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
p_makepath_s = (void *)GetProcAddress(hmod, "_makepath_s");
p_wmakepath_s = (void *)GetProcAddress(hmod, "_wmakepath_s");
+
+ p_searchenv_s = (void *)GetProcAddress(hmod, "_searchenv_s");
+ p_wsearchenv_s = (void *)GetProcAddress(hmod, "_wsearchenv_s");
}
typedef struct
@@ -416,6 +423,191 @@ static void test_splitpath(void)
_setmbcp(prev_cp);
}
+static void test_search_environment(void)
+{
+ const char* dirs[] = {
+ "c:\\search_env_test",
+ "c:\\search_env_test\\dir1",
+ "c:\\search_env_test\\dir2",
+ "c:\\search_env_test\\dir3longer",
+ NULL };
+
+ const char* files[] = {
+ "c:\\search_env_test\\dir1\\1.dat",
+ "c:\\search_env_test\\dir1\\2.dat",
+ "c:\\search_env_test\\dir2\\1.dat",
+ "c:\\search_env_test\\dir2\\3.dat",
+ "c:\\search_env_test\\dir3longer\\3.dat",
+ NULL };
+
+ FILE* tmp_file = NULL;
+ const char** file_name = files;
+ const char** dir_name = dirs;
+ char result[MAX_PATH];
+ WCHAR result_w[MAX_PATH];
+ WCHAR filename_w[MAX_PATH];
+ const WCHAR env_w[] = {'T', 'E', 'S', 'T', '_', 'P', 'A', 'T', 'H', '\0'};
+
+ const char eraser[] = "TEST_PATH=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ while (*dir_name){
+ ok(!mkdir(*dir_name), "Failed to setup test environment (dir = %s)\n", *dir_name);
+ dir_name++;
+ }
+
+ while (*file_name){
+ tmp_file = fopen(*file_name, "wb");
+ ok(tmp_file != NULL, "Failed to setup test environment (file = %s)\n", *file_name);
+ if (tmp_file)
+ fclose(tmp_file);
+ file_name++;
+ }
+
+
+ /*To catch some errors (usage of uninitialized memory) we will trick searchenv to set up memory to predefined values*/
+ putenv(eraser);
+ _searchenv("1.dat", "TEST_PATH", result);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ _searchenv("1.dat", "TEST_PATH", result);
+ ok(!strcmp(result, "c:\\search_env_test\\dir1\\1.dat"), "Failed to found %s in %s got in %s\n", "1.dat", "c:\\search_env_test\\dir1", result);
+
+ putenv(eraser);
+ _searchenv("1.dat", "TEST_PATH", result);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ _searchenv("3.dat", "TEST_PATH", result);
+ ok(!strcmp(result, "c:\\search_env_test\\dir2\\3.dat"), "Failed to found %s in %s got in %s\n", "3.dat", "c:\\search_env_test\\dir2", result);
+
+ putenv(eraser);
+ _searchenv("1.dat", "TEST_PATH", result);
+ putenv("TEST_PATH=;c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ _searchenv("1.dat", "TEST_PATH", result);
+ ok(!strcmp(result, "c:\\search_env_test\\dir1\\1.dat"), "Failed to found %s in %s got in %s\n", "1.dat", "c:\\search_env_test\\dir1", result);
+
+ putenv(eraser);
+ _searchenv("1.dat", "TEST_PATH", result);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ _searchenv("3.dat", "TEST_PATH", result);
+ ok(!strcmp(result, "c:\\search_env_test\\dir2\\3.dat"), "Failed to found %s in %s got in %s\n", "3.dat", "c:\\search_env_test\\dir2", result);
+
+
+
+
+
+ putenv(eraser);
+ MultiByteToWideChar( CP_ACP, 0, "1.dat", -1, filename_w, MAX_PATH);
+ _wsearchenv(filename_w, env_w, result_w);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ _wsearchenv(filename_w, env_w, result_w);
+ WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL);
+ ok(!strcmp(result, "c:\\search_env_test\\dir1\\1.dat"), "Failed to found %s in %s got in %s\n", "1.dat", "c:\\search_env_test\\dir1", result);
+
+ putenv(eraser);
+ MultiByteToWideChar( CP_ACP, 0, "3.dat", -1, filename_w, MAX_PATH);
+ _wsearchenv(filename_w, env_w, result_w);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ _wsearchenv(filename_w, env_w, result_w);
+ WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL);
+ ok(!strcmp(result, "c:\\search_env_test\\dir2\\3.dat"), "Failed to found %s in %s got in %s\n", "3.dat", "c:\\search_env_test\\dir2", result);
+
+ putenv(eraser);
+ MultiByteToWideChar( CP_ACP, 0, "1.dat", -1, filename_w, MAX_PATH);
+ _wsearchenv(filename_w, env_w, result_w);
+ putenv("TEST_PATH=;c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ _wsearchenv(filename_w, env_w, result_w);
+ WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL);
+ ok(!strcmp(result, "c:\\search_env_test\\dir1\\1.dat"), "Failed to found %s in %s got in %s\n", "1.dat", "c:\\search_env_test\\dir1", result);
+
+ putenv(eraser);
+ MultiByteToWideChar( CP_ACP, 0, "3.dat", -1, filename_w, MAX_PATH);
+ _wsearchenv(filename_w, env_w, result_w);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ _wsearchenv(filename_w, env_w, result_w);
+ WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL);
+ ok(!strcmp(result, "c:\\search_env_test\\dir2\\3.dat"), "Failed to found %s in %s got in %s\n", "3.dat", "c:\\search_env_test\\dir2", result);
+
+
+
+
+ if(p_searchenv_s){
+ putenv(eraser);
+ p_searchenv_s("1.dat", "TEST_PATH", result, MAX_PATH);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ p_searchenv_s("1.dat", "TEST_PATH", result, MAX_PATH);
+ ok(!strcmp(result, "c:\\search_env_test\\dir1\\1.dat"), "Failed to found %s in %s got in %s\n", "1.dat", "c:\\search_env_test\\dir1", result);
+
+ putenv(eraser);
+ p_searchenv_s("1.dat", "TEST_PATH", result, MAX_PATH);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ p_searchenv_s("3.dat", "TEST_PATH", result, MAX_PATH);
+ ok(!strcmp(result, "c:\\search_env_test\\dir2\\3.dat"), "Failed to found %s in %s got in %s\n", "3.dat", "c:\\search_env_test\\dir2", result);
+
+ putenv(eraser);
+ p_searchenv_s("1.dat", "TEST_PATH", result, MAX_PATH);
+ putenv("TEST_PATH=;c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ p_searchenv_s("1.dat", "TEST_PATH", result, MAX_PATH);
+ ok(!strcmp(result, "c:\\search_env_test\\dir1\\1.dat"), "Failed to found %s in %s got in %s\n", "1.dat", "c:\\search_env_test\\dir1", result);
+
+ putenv(eraser);
+ p_searchenv_s("1.dat", "TEST_PATH", result, MAX_PATH);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ p_searchenv_s("3.dat", "TEST_PATH", result, MAX_PATH);
+ ok(!strcmp(result, "c:\\search_env_test\\dir2\\3.dat"), "Failed to found %s in %s got in %s\n", "3.dat", "c:\\search_env_test\\dir2", result);
+ }else{
+ win_skip("Safe searchenv function is not available\n");
+ }
+
+
+
+ if(p_wsearchenv_s){
+ putenv(eraser);
+ MultiByteToWideChar( CP_ACP, 0, "1.dat", -1, filename_w, MAX_PATH);
+ p_wsearchenv_s(filename_w, env_w, result_w, MAX_PATH);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ p_wsearchenv_s(filename_w, env_w, result_w, MAX_PATH);
+ WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL);
+ ok(!strcmp(result, "c:\\search_env_test\\dir1\\1.dat"), "Failed to found %s in %s got in %s\n", "1.dat", "c:\\search_env_test\\dir1", result);
+
+ putenv(eraser);
+ MultiByteToWideChar( CP_ACP, 0, "3.dat", -1, filename_w, MAX_PATH);
+ p_wsearchenv_s(filename_w, env_w, result_w, MAX_PATH);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ p_wsearchenv_s(filename_w, env_w, result_w, MAX_PATH);
+ WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL);
+ ok(!strcmp(result, "c:\\search_env_test\\dir2\\3.dat"), "Failed to found %s in %s got in %s\n", "3.dat", "c:\\search_env_test\\dir2", result);
+
+ putenv(eraser);
+ MultiByteToWideChar( CP_ACP, 0, "1.dat", -1, filename_w, MAX_PATH);
+ p_wsearchenv_s(filename_w, env_w, result_w, MAX_PATH);
+ putenv("TEST_PATH=;c:\\search_env_test\\dir1;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ p_wsearchenv_s(filename_w, env_w, result_w, MAX_PATH);
+ WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL);
+ ok(!strcmp(result, "c:\\search_env_test\\dir1\\1.dat"), "Failed to found %s in %s got in %s\n", "1.dat", "c:\\search_env_test\\dir1", result);
+
+ putenv(eraser);
+ MultiByteToWideChar( CP_ACP, 0, "3.dat", -1, filename_w, MAX_PATH);
+ p_wsearchenv_s(filename_w, env_w, result_w, MAX_PATH);
+ putenv("TEST_PATH=c:\\search_env_test\\dir1;;c:\\search_env_test\\dir2;c:\\search_env_test\\dir3longer");
+ p_wsearchenv_s(filename_w, env_w, result_w, MAX_PATH);
+ WideCharToMultiByte(CP_ACP, 0, result_w, -1, result, MAX_PATH, NULL, NULL);
+ ok(!strcmp(result, "c:\\search_env_test\\dir2\\3.dat"), "Failed to found %s in %s got in %s\n", "3.dat", "c:\\search_env_test\\dir2", result);
+ }else{
+ win_skip("Safe wsearchenv function is not available\n");
+ }
+
+
+
+ putenv("TEST_PATH=");
+
+ do {
+ file_name--;
+ ok(!remove(*file_name), "Failed cleanup test (file = %s)\n", *file_name);
+ }while(files != file_name);
+
+ do {
+ dir_name--;
+ ok(!rmdir(*dir_name), "Failed cleanup test (dir = %s)\n", *dir_name);
+ }while(dirs != dir_name);
+}
+
START_TEST(dir)
{
init();
@@ -424,4 +616,6 @@ START_TEST(dir)
test_makepath();
test_makepath_s();
test_splitpath();
+
+ test_search_environment();
}
--
2.7.4
More information about the wine-devel
mailing list