Module: wine
Branch: master
Commit: 42bd3bb79a10ca01363cd7c883ef5ddeb5472b85
URL: https://gitlab.winehq.org/wine/wine/-/commit/42bd3bb79a10ca01363cd7c883ef5d…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Fri Mar 17 14:42:43 2023 +0100
advapi32/tests: Enumerate the services using the Unicode API.
The ANSI one is broken in some UTF-8 locales which prevents most of the
tests from running. So use the Unicode API for most tests and just
confirm that it is consistent with the ANSI one instead of doing the
reverse.
Wine-Bug: https://bugs.winehq.org//show_bug.cgi?id=52895
---
dlls/advapi32/tests/service.c | 155 ++++++++++++++++++++++--------------------
1 file changed, 80 insertions(+), 75 deletions(-)
Module: wine
Branch: master
Commit: 81e33a34841a48beb1103bf967586f5a8d3c4e40
URL: https://gitlab.winehq.org/wine/wine/-/commit/81e33a34841a48beb1103bf967586f…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Thu Mar 16 20:18:13 2023 +0100
advapi32/tests: Take into account service start / stop race conditions.
Services sometimes start or stop between two EnumServicesStatus()
calls. Fortunately this is rare so the tests can just retry to get the
expected result.
Wine-Bug: https://bugs.winehq.org//show_bug.cgi?id=53460
---
dlls/advapi32/tests/service.c | 149 ++++++++++++++++++++++++++++++++----------
1 file changed, 115 insertions(+), 34 deletions(-)
Module: wine
Branch: master
Commit: 7b3f804606b2b3864cce6f53e9840482a963cbb8
URL: https://gitlab.winehq.org/wine/wine/-/commit/7b3f804606b2b3864cce6f53e98404…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Thu Mar 16 18:46:18 2023 +0100
advapi32/tests: Better account for starting and stopping services.
The START_PENDING and STOP_PENDING services don't always have a
process id. Also trace unusual service states so we can identify which
ones behave in unexpected ways.
Wine-Bug: https://bugs.winehq.org//show_bug.cgi?id=53460
---
dlls/advapi32/tests/service.c | 60 +++++++++++++++++++++++++++++++++++++------
1 file changed, 52 insertions(+), 8 deletions(-)
diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c
index 2527be27d5f..8a4fdec05ab 100644
--- a/dlls/advapi32/tests/service.c
+++ b/dlls/advapi32/tests/service.c
@@ -1420,10 +1420,30 @@ static void test_enum_svc(void)
*/
if (status.dwServiceType & (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS))
{
- if (status.dwCurrentState == SERVICE_STOPPED)
- servicecountinactive--;
- else
+ switch (status.dwCurrentState)
+ {
+ case SERVICE_START_PENDING:
+ case SERVICE_STOP_PENDING:
+ case SERVICE_PAUSE_PENDING:
+ case SERVICE_PAUSED:
+ case SERVICE_CONTINUE_PENDING:
+ trace("Got state %lx for service %s\n", status.dwCurrentState,
+ services[i].lpServiceName);
+ /* fall through */
+
+ case SERVICE_RUNNING:
servicecountactive--;
+ break;
+
+ case SERVICE_STOPPED:
+ servicecountinactive--;
+ break;
+
+ default:
+ ok(0, "Got unknown state %lx for service %s\n",
+ status.dwCurrentState, services[i].lpServiceName);
+ break;
+ }
}
}
HeapFree(GetProcessHeap(), 0, services);
@@ -1739,21 +1759,45 @@ static void test_enum_svc(void)
if (status.dwServiceType & (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS))
{
- if (status.dwCurrentState != SERVICE_STOPPED)
+ switch (status.dwCurrentState)
{
+ case SERVICE_START_PENDING:
+ case SERVICE_STOP_PENDING:
+ trace("Got state %lx (pid=%04lx) for service %s\n",
+ status.dwCurrentState, status.dwProcessId,
+ exservices[i].lpServiceName);
+ /* There may or may not be a process id */
+ servicecountactive--;
+ break;
+
+ case SERVICE_PAUSE_PENDING:
+ case SERVICE_PAUSED:
+ case SERVICE_CONTINUE_PENDING:
+ trace("Got state %lx (pid=%04lx) for service %s\n",
+ status.dwCurrentState, status.dwProcessId,
+ exservices[i].lpServiceName);
+ /* fall through */
+
+ case SERVICE_RUNNING:
/* We expect a process id for every running service */
ok(status.dwProcessId > 0, "Expected a process id for this running service (%s)\n",
exservices[i].lpServiceName);
-
servicecountactive--;
- }
- else
- {
+ break;
+
+ case SERVICE_STOPPED:
/* We shouldn't have a process id for inactive services */
ok(status.dwProcessId == 0, "Service %s state %lu shouldn't have an associated process id\n",
exservices[i].lpServiceName, status.dwCurrentState);
servicecountinactive--;
+ break;
+
+ default:
+ ok(0, "Got unknown state %lx (pid=%04lx) for service %s\n",
+ status.dwCurrentState, status.dwProcessId,
+ exservices[i].lpServiceName);
+ break;
}
}
}
Module: wine
Branch: master
Commit: eecb285841e336faa2fed43b53aa76916845e3bf
URL: https://gitlab.winehq.org/wine/wine/-/commit/eecb285841e336faa2fed43b53aa76…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Fri Mar 17 11:24:22 2023 +0100
advapi32/tests: Improve the resume handle service tests.
Fix the comments to not imply that the tests expect all services but
one to be returned.
Add a test of the needed buffer size to retrieve the remaining services
and document the limits of the test.
---
dlls/advapi32/tests/service.c | 30 +++++++++++++++++++++++-------
1 file changed, 23 insertions(+), 7 deletions(-)
diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c
index fbb18b048a0..2527be27d5f 100644
--- a/dlls/advapi32/tests/service.c
+++ b/dlls/advapi32/tests/service.c
@@ -1300,7 +1300,10 @@ static void test_enum_svc(void)
ok(returnedW != 0xdeadbeef && returnedW > 0, "Expected some returned services\n");
HeapFree(GetProcessHeap(), 0, servicesW);
- /* Allocate less than the needed bytes and don't specify a resume handle */
+ /* Allocate less than the needed bytes and don't specify a resume handle.
+ * More than one service will be missing because of the space needed for
+ * the strings.
+ */
services = HeapAlloc(GetProcessHeap(), 0, tempneeded);
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSA);
needed = 0xdeadbeef;
@@ -1309,7 +1312,11 @@ static void test_enum_svc(void)
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
services, bufsize, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
- ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for this one service\n");
+ ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n");
+ todo_wine ok(needed < tempneeded, "Expected a smaller needed buffer size for the missing services\n");
+ /* Experiments show bufsize + needed < tempneeded which proves the needed
+ * buffer size is an approximation. So it's best not to probe more.
+ */
ok(returned < tempreturned, "Expected fewer services to be returned\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
@@ -1323,7 +1330,8 @@ static void test_enum_svc(void)
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
services, bufsize, &needed, &returned, &resume);
ok(!ret, "Expected failure\n");
- ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for this one service\n");
+ ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for the missing services\n");
+ todo_wine ok(needed < tempneeded, "Expected a smaller needed buffer size for the missing services\n");
ok(returned < tempreturned, "Expected fewer services to be returned\n");
todo_wine ok(resume, "Expected a resume handle\n");
ok(GetLastError() == ERROR_MORE_DATA,
@@ -1615,7 +1623,10 @@ static void test_enum_svc(void)
/* Store the number of returned services */
tempreturned = returned;
- /* Allocate less than the needed bytes and don't specify a resume handle */
+ /* Allocate less than the needed bytes and don't specify a resume handle.
+ * More than one service will be missing because of the space needed for
+ * the strings.
+ */
exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded);
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSA);
needed = 0xdeadbeef;
@@ -1624,7 +1635,11 @@ static void test_enum_svc(void)
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
(BYTE*)exservices, bufsize, &needed, &returned, NULL, NULL);
ok(!ret, "Expected failure\n");
- ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n");
+ ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for the missing services\n");
+ todo_wine ok(needed < tempneeded, "Expected a smaller needed buffer size for the missing services\n");
+ /* Experiments show bufsize + needed < tempneeded which proves the needed
+ * buffer size is an approximation. So it's best not to probe more.
+ */
ok(returned < tempreturned, "Expected fewer services to be returned\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
@@ -1638,13 +1653,14 @@ static void test_enum_svc(void)
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
(BYTE*)exservices, bufsize, &needed, &returned, &resume, NULL);
ok(!ret, "Expected failure\n");
- ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n");
+ ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for the missing services\n");
+ todo_wine ok(needed < tempneeded, "Expected a smaller needed buffer size for the missing services\n");
ok(returned < tempreturned, "Expected fewer services to be returned\n");
todo_wine ok(resume, "Expected a resume handle\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
- /* Fetch that last service but pass a bigger buffer size */
+ /* Fetch the missing services but pass a bigger buffer size */
missing = tempreturned - returned;
bufsize = tempneeded;
needed = 0xdeadbeef;