Jacek Caban : schtasks/tests: Added /change command tests.

Alexandre Julliard julliard at winehq.org
Mon Jan 8 16:08:07 CST 2018


Module: wine
Branch: master
Commit: 0219ebc5377a439ed8991f1fcdbbf5673dcfa843
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0219ebc5377a439ed8991f1fcdbbf5673dcfa843

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jan  5 23:12:48 2018 +0100

schtasks/tests: Added /change command tests.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 configure                           |   1 +
 configure.ac                        |   1 +
 programs/schtasks/tests/Makefile.in |   6 ++
 programs/schtasks/tests/schtasks.c  | 189 ++++++++++++++++++++++++++++++++++++
 4 files changed, 197 insertions(+)

diff --git a/configure b/configure
index 424b2e3..399bc3b 100755
--- a/configure
+++ b/configure
@@ -19154,6 +19154,7 @@ wine_fn_config_program rundll.exe16 enable_win16 install
 wine_fn_config_program rundll32 enable_rundll32 install
 wine_fn_config_program sc enable_sc install
 wine_fn_config_program schtasks enable_schtasks install
+wine_fn_config_test programs/schtasks/tests schtasks.exe_test
 wine_fn_config_program sdbinst enable_sdbinst install
 wine_fn_config_program secedit enable_secedit install
 wine_fn_config_program servicemodelreg enable_servicemodelreg install
diff --git a/configure.ac b/configure.ac
index 62ad8db..9aa3228 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3793,6 +3793,7 @@ WINE_CONFIG_PROGRAM(rundll.exe16,enable_win16,[install])
 WINE_CONFIG_PROGRAM(rundll32,,[install])
 WINE_CONFIG_PROGRAM(sc,,[install])
 WINE_CONFIG_PROGRAM(schtasks,,[install])
+WINE_CONFIG_TEST(programs/schtasks/tests)
 WINE_CONFIG_PROGRAM(sdbinst,,[install])
 WINE_CONFIG_PROGRAM(secedit,,[install])
 WINE_CONFIG_PROGRAM(servicemodelreg,,[install])
diff --git a/programs/schtasks/tests/Makefile.in b/programs/schtasks/tests/Makefile.in
new file mode 100644
index 0000000..dcf641c
--- /dev/null
+++ b/programs/schtasks/tests/Makefile.in
@@ -0,0 +1,6 @@
+TESTDLL   = schtasks.exe
+IMPORTS   = ole32
+
+
+C_SRCS = \
+	schtasks.c
diff --git a/programs/schtasks/tests/schtasks.c b/programs/schtasks/tests/schtasks.c
new file mode 100644
index 0000000..b8a9739
--- /dev/null
+++ b/programs/schtasks/tests/schtasks.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2018 Jacek Caban for CodeWeavers
+ *
+ * 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
+ */
+
+#define COBJMACROS
+
+#include "initguid.h"
+#include "taskschd.h"
+
+#include "wine/test.h"
+
+static ITaskService *service;
+static ITaskFolder *root;
+
+static WCHAR *a2w(const char *str)
+{
+    WCHAR *ret;
+    int len;
+
+    if(!str)
+        return NULL;
+
+    len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
+    ret = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+    MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
+
+    return ret;
+}
+
+#define run_command(a) _run_command(__LINE__,a)
+static DWORD _run_command(unsigned line, const char *cmd)
+{
+    STARTUPINFOA si = {sizeof(STARTUPINFOA)};
+    PROCESS_INFORMATION pi;
+    char command[1024];
+    BOOL r;
+    DWORD ret;
+
+    si.dwFlags = STARTF_USESTDHANDLES;
+    si.hStdInput  = INVALID_HANDLE_VALUE;
+    si.hStdOutput = INVALID_HANDLE_VALUE;
+    si.hStdError  = INVALID_HANDLE_VALUE;
+
+    strcpy(command, cmd);
+    r = CreateProcessA(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
+    ok_(__FILE__,line)(r, "CreateProcess failed: %u\n", GetLastError());
+    if(!r) return -1;
+
+    ret = WaitForSingleObject(pi.hProcess, 10000);
+    ok_(__FILE__,line)(ret == WAIT_OBJECT_0, "wait failed\n");
+    if (ret == WAIT_TIMEOUT)
+        TerminateProcess(pi.hProcess, -1);
+
+    r = GetExitCodeProcess(pi.hProcess, &ret);
+    ok_(__FILE__,line)(r, "GetExitCodeProcess failed: %u\n", GetLastError());
+
+    CloseHandle(pi.hThread);
+    CloseHandle(pi.hProcess);
+    return ret;
+}
+
+#define register_task(a) _register_task(__LINE__,a)
+static void _register_task(unsigned line, const char *task_name_a)
+{
+    IRegisteredTask *task;
+    VARIANT empty;
+    WCHAR *task_name, *xml;
+    HRESULT hres;
+
+    static const char xml_a[] =
+        "<?xml version=\"1.0\"?>\n"
+        "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
+        "  <RegistrationInfo>\n"
+        "    <Description>\"Task1\"</Description>\n"
+        "  </RegistrationInfo>\n"
+        "  <Settings>\n"
+        "    <Enabled>false</Enabled>\n"
+        "    <Hidden>false</Hidden>\n"
+        "  </Settings>\n"
+        "  <Actions>\n"
+        "    <Exec>\n"
+        "      <Command>\"task1.exe\"</Command>\n"
+        "    </Exec>\n"
+        "  </Actions>\n"
+        "</Task>\n";
+
+    V_VT(&empty) = VT_EMPTY;
+    task_name = a2w(task_name_a);
+    xml = a2w(xml_a);
+
+    /* make sure it's not registered */
+    ITaskFolder_DeleteTask(root, task_name, 0);
+
+    hres = ITaskFolder_RegisterTask(root, task_name, xml, TASK_CREATE, empty, empty,
+                                    TASK_LOGON_NONE, empty, &task);
+    ok_(__FILE__,line)(hres == S_OK, "RegisterTask failed: %08x\n", hres);
+    HeapFree(GetProcessHeap(), 0, task_name);
+    HeapFree(GetProcessHeap(), 0, xml);
+
+    IRegisteredTask_Release(task);
+}
+
+#define unregister_task(a) _unregister_task(__LINE__,a)
+static void _unregister_task(unsigned line, const char *task_name_a)
+{
+    WCHAR *task_name;
+    HRESULT hres;
+
+    task_name = a2w(task_name_a);
+
+    hres = ITaskFolder_DeleteTask(root, task_name, 0);
+    ok_(__FILE__,line)(hres == S_OK, "DeleteTask failed: %08x\n", hres);
+
+    HeapFree(GetProcessHeap(), 0, task_name);
+}
+
+static BOOL initialize_task_service(void)
+{
+    VARIANT empty;
+    HRESULT hres;
+
+    hres = CoCreateInstance(&CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER,
+                            &IID_ITaskService, (void **)&service);
+    if(hres != S_OK) {
+        ok(hres == REGDB_E_CLASSNOTREG, "Could not create task service: %08x\n", hres);
+        win_skip("Task service not available\n");
+        return FALSE;
+    }
+
+    V_VT(&empty) = VT_EMPTY;
+    hres = ITaskService_Connect(service, empty, empty, empty, empty);
+    ok(hres == S_OK, "Connect failed: %08x\n", hres);
+
+    hres = ITaskService_GetFolder(service, NULL, &root);
+    ok(hres == S_OK, "GetFolder error %08x\n", hres);
+    return TRUE;
+}
+
+START_TEST(schtasks)
+{
+    DWORD r;
+
+    CoInitialize(NULL);
+    if(!initialize_task_service()) {
+        CoUninitialize();
+        return;
+    }
+
+    r = run_command("schtasks");
+    ok(r == 0, "r = %u\n", r);
+
+    register_task("winetest");
+
+    r = run_command("schtasks /change /tn winetest /enable");
+    ok(r == 0, "r = %u\n", r);
+
+    unregister_task("winetest");
+
+    r = run_command("schtasks /change /tn winetest /enable");
+    ok(r == 1, "r = %u\n", r);
+
+    register_task("wine\\test\\winetest");
+
+    r = run_command("schtasks /change /tn wine\\test\\winetest /enable");
+    ok(r == 0, "r = %u\n", r);
+
+    unregister_task("wine\\test\\winetest");
+
+    r = run_command("schtasks /change /tn wine\\test\\winetest /enable");
+    ok(r == 1, "r = %u\n", r);
+
+    ITaskFolder_Release(root);
+    ITaskService_Release(service);
+    CoUninitialize();
+}




More information about the wine-cvs mailing list