diff --git a/configure b/configure index 5ec15e93f92..80348f32bbe 100755 --- a/configure +++ b/configure @@ -17459,6 +17459,7 @@ wine_fn_config_program wscript enable_wscript clean,install wine_fn_config_test programs/wscript/tests wscript.exe_test wine_fn_config_program wusa enable_wusa install wine_fn_config_program xcopy enable_xcopy install,po +wine_fn_config_test programs/xcopy/tests xcopy.exe_test wine_fn_config_makefile server enable_server clean,install-lib,manpage wine_fn_config_tool tools clean,install-dev,install-lib,manpage wine_fn_config_tool tools/widl clean,install-dev,manpage diff --git a/configure.ac b/configure.ac index 7f3165b4718..81b7027cd40 100644 --- a/configure.ac +++ b/configure.ac @@ -3414,6 +3414,7 @@ WINE_CONFIG_PROGRAM(wscript,,[clean,install]) WINE_CONFIG_TEST(programs/wscript/tests) WINE_CONFIG_PROGRAM(wusa,,[install]) WINE_CONFIG_PROGRAM(xcopy,,[install,po]) +WINE_CONFIG_TEST(programs/xcopy/tests) WINE_CONFIG_MAKEFILE([server],,[clean,install-lib,manpage]) WINE_CONFIG_TOOL(tools,[clean,install-dev,install-lib,manpage]) WINE_CONFIG_TOOL(tools/widl,[clean,install-dev,manpage]) diff --git a/programs/xcopy/tests/Makefile.in b/programs/xcopy/tests/Makefile.in new file mode 100644 index 00000000000..40a53b92f5c --- /dev/null +++ b/programs/xcopy/tests/Makefile.in @@ -0,0 +1,6 @@ +TESTDLL = xcopy.exe + +C_SRCS = \ + xcopy.c + +@MAKE_TEST_RULES@ diff --git a/programs/xcopy/tests/xcopy.c b/programs/xcopy/tests/xcopy.c new file mode 100644 index 00000000000..4cd6b1aa07c --- /dev/null +++ b/programs/xcopy/tests/xcopy.c @@ -0,0 +1,96 @@ +/* + * Copyright 2013 Francois Gouget + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#include "wine/test.h" + + +static DWORD runcmd(const char* cmd) +{ + STARTUPINFOA si = {sizeof(STARTUPINFOA)}; + PROCESS_INFORMATION pi; + char* wcmd; + DWORD rc; + + /* Create a writable copy for CreateProcessA() */ + wcmd = HeapAlloc(GetProcessHeap(), 0, strlen(cmd) + 1); + strcpy(wcmd, cmd); + rc = CreateProcessA(NULL, wcmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + HeapFree(GetProcessHeap(), 0, wcmd); + if (!rc) + return 260; + + rc = WaitForSingleObject(pi.hProcess, 5000); + if (rc == WAIT_OBJECT_0) + GetExitCodeProcess(pi.hProcess, &rc); + else + TerminateProcess(pi.hProcess, 1); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + + return rc; +} + +static void test_date_format(void) +{ + DWORD rc; + + rc = runcmd("xcopy /D:20-01-2000 xcopy1 xcopytest"); + ok(rc == 4, "xcopy /D:d-m-y test returned rc=%u\n", rc); + ok(GetFileAttributesA("xcopytest\\xcopy1") == INVALID_FILE_ATTRIBUTES, + "xcopy should not have created xcopytest\\xcopy1\n"); + + rc = runcmd("xcopy /D:01-20-2000 xcopy1 xcopytest"); + ok(rc == 0, "xcopy /D:m-d-y test failed rc=%u\n", rc); + ok(GetFileAttributesA("xcopytest\\xcopy1") != INVALID_FILE_ATTRIBUTES, + "xcopy did not create xcopytest\\xcopy1\n"); + DeleteFileA("xcopytest\\xcopy1"); + + rc = runcmd("xcopy /D:1-20-2000 xcopy1 xcopytest"); + ok(rc == 0, "xcopy /D:m-d-y test failed rc=%u\n", rc); + ok(GetFileAttributesA("xcopytest\\xcopy1") != INVALID_FILE_ATTRIBUTES, + "xcopy did not create xcopytest\\xcopy1\n"); + DeleteFileA("xcopytest\\xcopy1"); +} + +START_TEST(xcopy) +{ + char tmpdir[MAX_PATH]; + HANDLE hfile; + + GetTempPathA(MAX_PATH, tmpdir); + SetCurrentDirectoryA(tmpdir); + trace("%s\n", tmpdir); + + CreateDirectoryA("xcopytest", NULL); + hfile = CreateFileA("xcopy1", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, NULL); + ok(hfile != INVALID_HANDLE_VALUE, "Failed to create xcopy1 file\n"); + if (hfile == INVALID_HANDLE_VALUE) + { + skip("skipping xcopy tests\n"); + return; + } + CloseHandle(hfile); + + test_date_format(); + + DeleteFileA("xcopy1"); + RemoveDirectoryA("xcopytest"); +} diff --git a/programs/xcopy/xcopy.c b/programs/xcopy/xcopy.c index 3967b185339..e424eea56d3 100644 --- a/programs/xcopy/xcopy.c +++ b/programs/xcopy/xcopy.c @@ -778,19 +778,20 @@ static int XCOPY_ParseCommandLine(WCHAR *suppliedsource, BOOL isError = FALSE; memset(&st, 0x00, sizeof(st)); - /* Parse the arg : Month */ + /* Microsoft's xcopy's usage implies that the date + * format depends on the locale but that false. + * It is hardcoded to month-day-year + */ st.wMonth = _wtol(pos); while (*pos && isdigit(*pos)) pos++; if (*pos++ != '-') isError = TRUE; - /* Parse the arg : Day */ if (!isError) { st.wDay = _wtol(pos); while (*pos && isdigit(*pos)) pos++; if (*pos++ != '-') isError = TRUE; } - /* Parse the arg : Year */ if (!isError) { st.wYear = _wtol(pos); while (*pos && isdigit(*pos)) pos++;