[PATCH 2/3] kernel32/tests: Add some activatableClass manifest attribute tests.
Rémi Bernon
rbernon at codeweavers.com
Wed Apr 6 09:09:28 CDT 2022
And the matching ACTIVATION_CONTEXT_SECTION_WINRT_ACTIVATABLE_CLASSES
activation context section.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/kernel32/tests/actctx.c | 85 ++++++++++++++++++++++++++++++++++++
1 file changed, 85 insertions(+)
diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c
index 8f925b0500f..e296ac40ced 100644
--- a/dlls/kernel32/tests/actctx.c
+++ b/dlls/kernel32/tests/actctx.c
@@ -120,6 +120,12 @@ static const char manifest3[] =
" numMethods=\"10\""
" baseInterface=\"{66666666-8888-7777-6666-555555555557}\""
" />"
+" <activatableClass name=\"Wine.Test.Class1\" threadingModel=\"mta\" xmlns=\"urn:schemas-microsoft-com:winrt.v1\"/>"
+" <activatableClass name=\"Wine.Test.Class2\" threadingModel=\"both\" xmlns=\"urn:schemas-microsoft-com:winrt.v1\"/>"
+" <activatableClass name=\"Wine.Test.Class3\" threadingModel=\"sta\" xmlns=\"urn:schemas-microsoft-com:winrt.v1\"/>"
+"</file>"
+"<file name=\"Wine.Test.dll\">"
+" <activatableClass name=\"Wine.Test.Class4\" threadingModel=\"sta\" xmlns=\"urn:schemas-microsoft-com:winrt.v1\"/>"
"</file>"
" <comInterfaceExternalProxyStub "
" name=\"Iifaceps2\""
@@ -395,6 +401,15 @@ static const char wrong_manifest10[] =
"</trustInfo>"
"</assembly>";
+/* activatableClass with the wrong xmlns is invalid */
+static const char wrong_manifest11[] =
+"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
+"<assemblyIdentity version=\"1.0.0.0\" name=\"Wine.Test\" type=\"win32\" />"
+"<file name=\"testlib.dll\">"
+" <activatableClass name=\"Wine.Test.Class1\" threadingModel=\"both\" />"
+"</file>"
+"</assembly>";
+
static const char wrong_depmanifest1[] =
"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
"<assemblyIdentity type=\"win32\" name=\"testdep\" version=\"6.5.4.4\" processorArchitecture=\"" ARCH "\" />"
@@ -1092,6 +1107,8 @@ static void test_create_fail(void)
test_create_and_fail(wrong_manifest9, NULL, 0, TRUE /* WinXP */);
trace("wrong_manifest10\n");
test_create_and_fail(wrong_manifest10, NULL, 0, TRUE /* WinXP */);
+ trace("wrong_manifest11\n");
+ test_create_and_fail(wrong_manifest11, NULL, 1, FALSE);
trace("UTF-16 manifest1 without BOM\n");
test_create_wide_and_fail(manifest1, FALSE );
trace("manifest2\n");
@@ -1352,6 +1369,70 @@ static void test_find_window_class(HANDLE handle, LPCWSTR clsname, ULONG exid, i
ReleaseActCtx(handle);
}
+enum winrt_threading_model
+{
+ WINRT_THREADING_MODEL_BOTH = 0,
+ WINRT_THREADING_MODEL_STA = 1,
+ WINRT_THREADING_MODEL_MTA = 2,
+};
+
+struct activatable_class_data
+{
+ ULONG size;
+ DWORD unk;
+ DWORD module_len;
+ DWORD module_offset;
+ DWORD threading_model;
+};
+
+static void test_find_activatable_class(HANDLE handle, const WCHAR *classid, enum winrt_threading_model threading_model,
+ const WCHAR *file, ULONG exid, int line)
+{
+ struct activatable_class_data *activatable_class;
+ struct strsection_header *header;
+ ACTCTX_SECTION_KEYED_DATA data;
+ void *ptr;
+ BOOL ret;
+
+ memset(&data, 0xfe, sizeof(data));
+ data.cbSize = sizeof(data);
+
+ ret = FindActCtxSectionStringW(0, NULL, ACTIVATION_CONTEXT_SECTION_WINRT_ACTIVATABLE_CLASSES, classid, &data);
+ todo_wine
+ ok_(__FILE__, line)(ret || broken(!ret) /* <= Win10 v1809 */, "FindActCtxSectionStringW failed, error %lu\n", GetLastError());
+ if (!ret)
+ {
+ ok_(__FILE__, line)(GetLastError() == ERROR_SXS_SECTION_NOT_FOUND, "got error %lu\n", GetLastError());
+ return;
+ }
+
+ ok_(__FILE__, line)(data.cbSize == sizeof(data), "got cbSize %lu\n", data.cbSize);
+ ok_(__FILE__, line)(data.ulDataFormatVersion == 1, "got ulDataFormatVersion %lu\n", data.ulDataFormatVersion);
+ ok_(__FILE__, line)(data.lpData != NULL, "got lpData %p\n", data.lpData);
+
+ header = (struct strsection_header *)data.lpSectionBase;
+ ok_(__FILE__, line)(header->magic == 0x64487353, "got wrong magic 0x%08lx\n", header->magic);
+ ok_(__FILE__, line)(data.lpSectionBase != NULL, "got lpSectionBase %p\n", data.lpSectionBase);
+ ok_(__FILE__, line)(data.ulSectionTotalLength > 0, "got ulSectionTotalLength %lu\n", data.ulSectionTotalLength);
+ ok_(__FILE__, line)(data.lpSectionGlobalData == (BYTE *)header + header->global_offset,
+ "got lpSectionGlobalData %p\n", data.lpSectionGlobalData);
+ ok_(__FILE__, line)(data.ulSectionGlobalDataLength == header->global_len,
+ "got ulSectionGlobalDataLength %lu\n", data.ulSectionGlobalDataLength);
+ ok_(__FILE__, line)(data.hActCtx == NULL, "got hActCtx %p\n", data.hActCtx);
+ ok_(__FILE__, line)(data.ulAssemblyRosterIndex == exid, "got ulAssemblyRosterIndex %lu\n", data.ulAssemblyRosterIndex);
+
+ activatable_class = (struct activatable_class_data *)data.lpData;
+ ok_(__FILE__, line)(activatable_class->size == sizeof(*activatable_class), "got size %lu\n",
+ activatable_class->size);
+ ok_(__FILE__, line)(activatable_class->threading_model == threading_model, "got threading_model %lu\n",
+ activatable_class->threading_model);
+
+ ptr = (BYTE *)header + activatable_class->module_offset;
+ ok_(__FILE__, line)(wcslen(ptr) * sizeof(WCHAR) == activatable_class->module_len,
+ "got module_len %lu\n", activatable_class->module_len);
+ ok_(__FILE__, line)(!wcscmp(ptr, file), "got data.lpSectionGlobalData %s\n", debugstr_w(ptr));
+}
+
static void test_find_string_fail(void)
{
ACTCTX_SECTION_KEYED_DATA data = {sizeof(data)};
@@ -2180,6 +2261,10 @@ static void test_actctx(void)
test_find_ifaceps_redirection(handle, &IID_Iifaceps2, &IID_TlibTest4, &IID_Ibifaceps, &IID_PS32, 1, __LINE__);
test_find_ifaceps_redirection(handle, &IID_Iifaceps3, &IID_TlibTest4, &IID_Ibifaceps, NULL, 1, __LINE__);
test_find_string_fail();
+ test_find_activatable_class(handle, L"Wine.Test.Class1", WINRT_THREADING_MODEL_MTA, L"testlib.dll", 1, __LINE__);
+ test_find_activatable_class(handle, L"Wine.Test.Class2", WINRT_THREADING_MODEL_BOTH, L"testlib.dll", 1, __LINE__);
+ test_find_activatable_class(handle, L"Wine.Test.Class3", WINRT_THREADING_MODEL_STA, L"testlib.dll", 1, __LINE__);
+ test_find_activatable_class(handle, L"Wine.Test.Class4", WINRT_THREADING_MODEL_STA, L"Wine.Test.dll", 1, __LINE__);
b = DeactivateActCtx(0, cookie);
ok(b, "DeactivateActCtx failed: %lu\n", GetLastError());
--
2.35.1
More information about the wine-devel
mailing list