Skip to content

Commit 4ec63ee

Browse files
committed
[SERVICES_WINETEST] Sync with Wine Staging 1.9.18.
svn path=/trunk/; revision=72613
1 parent ae503d6 commit 4ec63ee

File tree

1 file changed

+45
-8
lines changed

1 file changed

+45
-8
lines changed

rostests/winetests/services/service.c

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_da
8282
SetServiceStatus(service_handle, &status);
8383
SetEvent(service_stop_event);
8484
return NO_ERROR;
85+
case 128:
86+
service_event("CUSTOM");
87+
return 0xdeadbeef;
8588
default:
8689
status.dwCurrentState = SERVICE_RUNNING;
8790
SetServiceStatus( service_handle, &status );
@@ -92,11 +95,17 @@ static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_da
9295
static void WINAPI service_main(DWORD argc, char **argv)
9396
{
9497
SERVICE_STATUS status;
98+
char buf[64];
9599
BOOL res;
96100

97-
service_ok(argc == 1, "argc = %d\n", argc);
98-
if(argc)
99-
service_ok(!strcmp(argv[0], service_name), "argv[0] = %s, expected %s\n", argv[0], service_name);
101+
service_ok(argc == 3, "argc = %u, expected 3\n", argc);
102+
service_ok(!strcmp(argv[0], service_name), "argv[0] = '%s', expected '%s'\n", argv[0], service_name);
103+
service_ok(!strcmp(argv[1], "param1"), "argv[1] = '%s', expected 'param1'\n", argv[1]);
104+
service_ok(!strcmp(argv[2], "param2"), "argv[2] = '%s', expected 'param2'\n", argv[2]);
105+
106+
buf[0] = 0;
107+
GetEnvironmentVariableA("PATHEXT", buf, sizeof(buf));
108+
service_ok(buf[0], "did not find PATHEXT environment variable\n");
100109

101110
service_handle = pRegisterServiceCtrlHandlerExA(service_name, service_handler, NULL);
102111
service_ok(service_handle != NULL, "RegisterServiceCtrlHandlerEx failed: %u\n", GetLastError());
@@ -190,9 +199,8 @@ static void WINAPI no_stop_main(DWORD argc, char **argv)
190199
SERVICE_STATUS status;
191200
BOOL res;
192201

193-
service_ok(argc == 1, "argc = %d\n", argc);
194-
if(argc)
195-
service_ok(!strcmp(argv[0], service_name), "argv[0] = %s, expected %s\n", argv[0], service_name);
202+
service_ok(argc == 1, "argc = %u, expected 1\n", argc);
203+
service_ok(!strcmp(argv[0], service_name), "argv[0] = '%s', expected '%s'\n", argv[0], service_name);
196204

197205
service_handle = pRegisterServiceCtrlHandlerExA(service_name, no_stop_handler, NULL);
198206
service_ok(service_handle != NULL, "RegisterServiceCtrlHandlerEx failed: %u\n", GetLastError());
@@ -274,7 +282,7 @@ static void expect_event(const char *event_name)
274282

275283
static DWORD WINAPI pipe_thread(void *arg)
276284
{
277-
char buf[257], *ptr;
285+
char buf[512], *ptr;
278286
DWORD read;
279287
BOOL res;
280288

@@ -316,15 +324,18 @@ static DWORD WINAPI pipe_thread(void *arg)
316324

317325
static void test_service(void)
318326
{
327+
static const char *argv[2] = {"param1", "param2"};
319328
SC_HANDLE service_handle = register_service("simple_service");
329+
SERVICE_STATUS_PROCESS status2;
320330
SERVICE_STATUS status;
331+
DWORD bytes;
321332
BOOL res;
322333

323334
if(!service_handle)
324335
return;
325336

326337
trace("starting...\n");
327-
res = StartServiceA(service_handle, 0, NULL);
338+
res = StartServiceA(service_handle, 2, argv);
328339
ok(res, "StartService failed: %u\n", GetLastError());
329340
if(!res) {
330341
DeleteService(service_handle);
@@ -345,6 +356,15 @@ static void test_service(void)
345356
ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint);
346357
todo_wine ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint);
347358

359+
res = QueryServiceStatusEx(service_handle, SC_STATUS_PROCESS_INFO, (BYTE *)&status2, sizeof(status2), &bytes);
360+
ok(res, "QueryServiceStatusEx failed: %u\n", GetLastError());
361+
ok(status2.dwCurrentState == SERVICE_RUNNING, "status2.dwCurrentState = %x\n", status2.dwCurrentState);
362+
ok(status2.dwProcessId != 0, "status2.dwProcessId = %d\n", status2.dwProcessId);
363+
364+
res = ControlService(service_handle, 128, &status);
365+
ok(res, "ControlService failed: %u\n", GetLastError());
366+
expect_event("CUSTOM");
367+
348368
res = ControlService(service_handle, SERVICE_CONTROL_STOP, &status);
349369
ok(res, "ControlService failed: %u\n", GetLastError());
350370
expect_event("STOP");
@@ -358,7 +378,9 @@ static void test_service(void)
358378
static inline void test_no_stop(void)
359379
{
360380
SC_HANDLE service_handle = register_service("no_stop");
381+
SERVICE_STATUS_PROCESS status2;
361382
SERVICE_STATUS status;
383+
DWORD bytes;
362384
BOOL res;
363385

364386
if(!service_handle)
@@ -389,6 +411,11 @@ static inline void test_no_stop(void)
389411
ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint);
390412
todo_wine ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint);
391413

414+
res = QueryServiceStatusEx(service_handle, SC_STATUS_PROCESS_INFO, (BYTE *)&status2, sizeof(status2), &bytes);
415+
ok(res, "QueryServiceStatusEx failed: %u\n", GetLastError());
416+
ok(status2.dwCurrentState == SERVICE_RUNNING, "status2.dwCurrentState = %x\n", status2.dwCurrentState);
417+
ok(status2.dwProcessId != 0, "status2.dwProcessId = %d\n", status2.dwProcessId);
418+
392419
res = ControlService(service_handle, SERVICE_CONTROL_STOP, &status);
393420
ok(res, "ControlService failed: %u\n", GetLastError());
394421
expect_event("STOP");
@@ -405,6 +432,11 @@ static inline void test_no_stop(void)
405432
ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint);
406433
ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint);
407434

435+
res = QueryServiceStatusEx(service_handle, SC_STATUS_PROCESS_INFO, (BYTE *)&status2, sizeof(status2), &bytes);
436+
ok(res, "QueryServiceStatusEx failed: %u\n", GetLastError());
437+
ok(status2.dwProcessId == 0 || broken(status2.dwProcessId != 0),
438+
"status2.dwProcessId = %d\n", status2.dwProcessId);
439+
408440
res = DeleteService(service_handle);
409441
ok(res, "DeleteService failed: %u\n", GetLastError());
410442

@@ -420,6 +452,11 @@ static inline void test_no_stop(void)
420452
ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint);
421453
ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint);
422454

455+
res = QueryServiceStatusEx(service_handle, SC_STATUS_PROCESS_INFO, (BYTE *)&status2, sizeof(status2), &bytes);
456+
ok(res, "QueryServiceStatusEx failed: %u\n", GetLastError());
457+
ok(status2.dwProcessId == 0 || broken(status2.dwProcessId != 0),
458+
"status2.dwProcessId = %d\n", status2.dwProcessId);
459+
423460
CloseServiceHandle(service_handle);
424461

425462
res = QueryServiceStatus(service_handle, &status);

0 commit comments

Comments
 (0)