| /* |
| * 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 <windows.h> |
| |
| #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); |
| |
| /* On Windows 2003 and older, xcopy.exe fails if stdin is not a console |
| * handle, even with '/I /Y' options. |
| */ |
| rc = CreateProcessA(NULL, wcmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, 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"); |
| } |