Module: wine Branch: master Commit: c74770c51bf47335471b136f6eda41e0955904b2 URL: https://source.winehq.org/git/wine.git/?a=commit;h=c74770c51bf47335471b136f6...
Author: Fabian Maurer dark.shadow4@web.de Date: Tue Jan 28 21:41:00 2020 +0100
find/tests: Add tests for file based search.
Signed-off-by: Fabian Maurer dark.shadow4@web.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
programs/find/tests/find.c | 120 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 111 insertions(+), 9 deletions(-)
diff --git a/programs/find/tests/find.c b/programs/find/tests/find.c index 147b59c8ce..b8345034b5 100644 --- a/programs/find/tests/find.c +++ b/programs/find/tests/find.c @@ -180,10 +180,44 @@ static void run_find_stdin_(const WCHAR *commandline, const BYTE *input, int inp heap_free(child_output); }
+static void run_find_file_(const WCHAR *commandline, const BYTE *input, int input_len, const BYTE *out_expected, int out_expected_len, int exitcode_expected, const char *file, int line) +{ + char path_temp_file[MAX_PATH]; + char path_temp_dir[MAX_PATH]; + HANDLE handle_file; + WCHAR commandline_new[MAX_PATH]; + BYTE *out_expected_new; + char header[MAX_PATH]; + int header_len; + + GetTempPathA(ARRAY_SIZE(path_temp_dir), path_temp_dir); + GetTempFileNameA(path_temp_dir, "", 0, path_temp_file); + handle_file = CreateFileA(path_temp_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + write_to_handle(handle_file, input, input_len); + CloseHandle(handle_file); + + wsprintfW(commandline_new, L"%s %hs", commandline, path_temp_file); + + CharUpperA(path_temp_file); + wsprintfA(header, "\r\n---------- %s\r\n", path_temp_file); + header_len = lstrlenA(header); + out_expected_new = heap_alloc(header_len + out_expected_len); + memcpy(out_expected_new, header, header_len); + memcpy(out_expected_new + header_len, out_expected, out_expected_len); + + run_find_stdin_(commandline_new, (BYTE*)"", 0, out_expected_new, header_len + out_expected_len, exitcode_expected, file, line); + heap_free(out_expected_new); + + DeleteFileA(path_temp_file); +} + #define run_find_stdin_str(commandline, input, out_expected, exitcode_expected) \ - run_find_stdin_str_(commandline, input, out_expected, exitcode_expected, __FILE__, __LINE__) + run_find_str_(commandline, input, out_expected, exitcode_expected, 0, __FILE__, __LINE__)
-static void run_find_stdin_str_(const char *commandline, const char *input, const char *out_expected, int exitcode_expected, const char *file, int line) +#define run_find_file_str(commandline, input, out_expected, exitcode_expected) \ + run_find_str_(commandline, input, out_expected, exitcode_expected, 1, __FILE__, __LINE__) + +static void run_find_str_(const char *commandline, const char *input, const char *out_expected, int exitcode_expected, BOOL is_file, const char *file, int line) { WCHAR *commandlineW; int len_commandlineW; @@ -193,15 +227,20 @@ static void run_find_stdin_str_(const char *commandline, const char *input, cons commandlineW = heap_alloc(len_commandlineW * sizeof(WCHAR)); MultiByteToWideChar(CP_UTF8, 0, commandline, -1, commandlineW, len_commandlineW);
- run_find_stdin_(commandlineW, (BYTE *)input, lstrlenA(input), (BYTE *)out_expected, lstrlenA(out_expected), exitcode_expected, file, line); - + if (is_file) + run_find_file_(commandlineW, (BYTE *)input, lstrlenA(input), (BYTE *)out_expected, lstrlenA(out_expected), exitcode_expected, file, line); + else + run_find_stdin_(commandlineW, (BYTE *)input, lstrlenA(input), (BYTE *)out_expected, lstrlenA(out_expected), exitcode_expected, file, line); heap_free(commandlineW); }
#define run_find_stdin_unicode(input, out_expected, exitcode_expected) \ - run_find_stdin_unicode_(input, sizeof(input), out_expected, sizeof(out_expected), exitcode_expected, __FILE__, __LINE__) + run_find_unicode_(input, sizeof(input), out_expected, sizeof(out_expected), exitcode_expected, 0, __FILE__, __LINE__)
-static void run_find_stdin_unicode_(const BYTE *input, int input_len, const BYTE *out_expected, int out_expected_len, int exitcode_expected, const char *file, int line) +#define run_find_file_unicode(input, out_expected, exitcode_expected) \ + run_find_unicode_(input, sizeof(input), out_expected, sizeof(out_expected), exitcode_expected, 1, __FILE__, __LINE__) + +static void run_find_unicode_(const BYTE *input, int input_len, const BYTE *out_expected, int out_expected_len, int exitcode_expected, BOOL is_file, const char *file, int line) { /* Need "test" as char and quoted wchar */ static const WCHAR wstr_quoted_test[] = { '"','t', 'e', 's', 't','"',0 }; @@ -219,7 +258,10 @@ static void run_find_stdin_unicode_(const BYTE *input, int input_len, const BYTE exitcode_expected = 1; }
- run_find_stdin_(wstr_quoted_test, input, input_len, out_expected_mangled, out_expected_mangled_len, exitcode_expected, file, line); + if (is_file) + run_find_file_(wstr_quoted_test, input, input_len, out_expected_mangled, out_expected_mangled_len, exitcode_expected, file, line); + else + run_find_stdin_(wstr_quoted_test, input, input_len, out_expected_mangled, out_expected_mangled_len, exitcode_expected, file, line); }
static void test_errors(void) @@ -230,6 +272,8 @@ static void test_errors(void) todo_wine /* Quotes are not properly passed into wine yet */ run_find_stdin_str(""test", "", "FIND: Parameter format not correct\r\n", 2); run_find_stdin_str(""test" /XYZ", "", "FIND: Invalid switch\r\n", 2); + todo_wine + run_find_stdin_str(""test" C:\doesnotexist.dat", "", "File not found - C:\DOESNOTEXIST.DAT\r\n", 1); }
static void test_singleline_without_switches(void) @@ -272,7 +316,7 @@ static const BYTE str_rus_utf8_nobom[] = { 0xD0,0xBF,0xD1,0x static const BYTE str_en_utf8_bom[] = { 0xEF,0xBB,0xBF,'e','n','t','e','s','t','\r','\n' }; static const BYTE str_en_utf8_nobom[] = { 'e','n','t','e','s','t','\r','\n' };
-static void test_unicode_support(void) +static void test_unicode_support_stdin(void) { /* Test unicode support on STDIN * Those depend on the active codepage - e.g. 932 (japanese) behaves different from 1252 (latin) @@ -302,6 +346,62 @@ static void test_unicode_support(void) run_find_stdin_unicode(str_jap_utf16le_bom, str_jap_utf16le_bom, 0); }
+static void test_file_search(void) +{ + todo_wine + run_find_file_str("""", "test", "", 1); + todo_wine + run_find_file_str(""test"", "", "", 1); + todo_wine + run_find_file_str(""test"", "test", "test\r\n", 0); + todo_wine + run_find_file_str(""test"", "test2", "test2\r\n", 0); + todo_wine + run_find_file_str(""test"", "test\r2", "test\r2\r\n", 0); + todo_wine + run_find_file_str(""test2"", "test", "", 1); + todo_wine + run_find_file_str(""test"", "test\nother\ntest2\ntest3", "test\r\ntest2\r\ntest3\r\n", 0); +} + +static void test_unicode_support_file(void) +{ + /* Test unicode support on files */ + + /* Test UTF-8 BOM */ + todo_wine + run_find_file_unicode(str_en_utf8_nobom, str_en_utf8_nobom, 0); + todo_wine + run_find_file_unicode(str_en_utf8_bom, str_en_utf8_bom, 0); + + /* Test russian characters */ + todo_wine + run_find_file_unicode(str_rus_utf8_bom, str_rus_utf8_bom, 0); + todo_wine + run_find_file_unicode(str_rus_utf8_nobom, str_rus_utf8_nobom, 0); + + /* Test japanese characters */ + todo_wine + run_find_file_unicode(str_jap_utf8_nobom, str_jap_utf8_nobom, 0); + todo_wine + run_find_file_unicode(str_jap_utf8_bom, str_jap_utf8_bom, 0); + todo_wine + run_find_file_unicode(str_jap_shiftjis, str_jap_shiftjis, 0); + + /* Test unsupported encodings */ + todo_wine + run_find_file_unicode(str_jap_utf16le_nobom, str_empty, 1); + todo_wine + run_find_file_unicode(str_jap_utf16be_bom, str_empty, 1); + todo_wine + run_find_file_unicode(str_jap_utf16be_nobom, str_empty, 1); + + /* Test utf16le */ + todo_wine + run_find_file_unicode(str_jap_utf16le_bom, str_jap_utf16le_bom, 0); +} + + START_TEST(find) { if (PRIMARYLANGID(GetUserDefaultUILanguage()) != LANG_ENGLISH) @@ -314,5 +414,7 @@ START_TEST(find) } test_singleline_without_switches(); test_multiline(); - test_unicode_support(); + test_unicode_support_stdin(); + test_file_search(); + test_unicode_support_file(); }