[KERNEL32_APITEST] -Make FindActCtxSectionStringW test less strict.
[reactos.git] / rostests / apitests / kernel32 / FindActCtxSectionStringW.c
index dbe8ec1..275bc69 100644 (file)
@@ -79,14 +79,22 @@ struct assemply_data
 
 HANDLE _CreateActCtxFromFile(LPCWSTR FileName, int line)
 {
-    ACTCTXW ActCtx = {sizeof(ACTCTX), 0, FileName};
+    ACTCTXW ActCtx = {sizeof(ACTCTX)};
     HANDLE h;
+    WCHAR buffer[MAX_PATH] , *separator;
+
+    ok (GetModuleFileNameW(NULL, buffer, MAX_PATH), "GetModuleFileName failed\n");
+    separator = wcsrchr(buffer, L'\\');
+    if (separator)
+        wcscpy(separator + 1, FileName);
+
+    ActCtx.lpSource = buffer;
 
     SetLastError(0xdeaddead);
     h = CreateActCtxW(&ActCtx);
-    ok_(__FILE__, line)(h != INVALID_HANDLE_VALUE, "CreateActCtx failed\n");
+    ok_(__FILE__, line)(h != INVALID_HANDLE_VALUE, "CreateActCtx failed for %S\n", FileName);
     // In win10 last error is unchanged and in win2k3 it is ERROR_BAD_EXE_FORMAT    
-    ok_(__FILE__, line)(GetLastError() == ERROR_BAD_EXE_FORMAT, "Wrong last error. Expected %d, got %lu\n", ERROR_BAD_EXE_FORMAT, GetLastError());
+    ok_(__FILE__, line)(GetLastError() == ERROR_BAD_EXE_FORMAT || GetLastError() == 0xdeaddead, "Wrong last error %lu\n", GetLastError());
 
     return h;
 }
@@ -111,7 +119,7 @@ VOID _DeactivateCtx(ULONG_PTR cookie, int line)
     ok_(__FILE__, line)(GetLastError() == 0xdeaddead, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(0xdeaddead), GetLastError());
 }
 
-void TestClassRedirection(HANDLE h, LPCWSTR ClassToTest, LPCWSTR ExpectedClassName, LPCWSTR ExpectedModule, ULONG ExpectedClassCount)
+void TestClassRedirection(HANDLE h, LPCWSTR ClassToTest, LPCWSTR ExpectedClassPart, LPCWSTR ExpectedModule, ULONG ExpectedClassCount)
 {
     ACTCTX_SECTION_KEYED_DATA KeyedData = { 0 };
     BOOL res;
@@ -130,27 +138,34 @@ void TestClassRedirection(HANDLE h, LPCWSTR ClassToTest, LPCWSTR ExpectedClassNa
     ok(res == TRUE, "FindActCtxSectionString failed\n");
     ok(GetLastError() == 0xdeaddead, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(0xdeaddead), GetLastError());
     
-    ok(KeyedData.ulDataFormatVersion == 1, "Wrong format version: %lu", KeyedData.ulDataFormatVersion);
+    ok(KeyedData.ulDataFormatVersion == 1, "Wrong format version: %lu\n", KeyedData.ulDataFormatVersion);
     ok(KeyedData.hActCtx == h, "Wrong handle\n");
     ok(KeyedData.lpSectionBase != NULL, "Expected non null lpSectionBase\n");
     ok(KeyedData.lpData != NULL, "Expected non null lpData\n");
     header = (struct strsection_header*)KeyedData.lpSectionBase;
     classData = (struct wndclass_redirect_data*)KeyedData.lpData;
     
-    ok(header->magic == STRSECTION_MAGIC, "%lu\n", header->magic );
-    ok(header->size == sizeof(*header), "Got %lu instead of %d\n", header->size, sizeof(*header));
-    ok(header->count == ExpectedClassCount, "Expected %lu classes, got %lu\n", ExpectedClassCount, header->count );
-    
-    VersionedClass = (WCHAR*)((BYTE*)classData + classData->name_offset);
-    ClassLib = (WCHAR*)((BYTE*)header + classData->module_offset);
-    data_lenght = classData->size + classData->name_len + classData->module_len + 2*sizeof(WCHAR);
-    ok(KeyedData.ulLength == data_lenght, "Got lenght %lu instead of %d\n", KeyedData.ulLength, data_lenght);
-    ok(classData->size == sizeof(*classData), "Got %lu instead of %d\n", classData->size, sizeof(*classData));
-    ok(classData->res == 0, "Got res %lu\n", classData->res);
-    ok(classData->name_len == wcslen(ExpectedClassName) * 2, "Got name len %lu, expected %d\n", classData->name_len, wcslen(ExpectedClassName) *2);
-    ok(classData->module_len == wcslen(ExpectedModule) * 2, "Got name len %lu, expected %d\n", classData->module_len, wcslen(ExpectedModule) *2);
-    ok(wcscmp(VersionedClass, ExpectedClassName) == 0, "Got %S, expected %S\n", VersionedClass, ExpectedClassName);
-    ok(wcscmp(ClassLib, ExpectedModule) == 0, "Got %S, expected %S\n", ClassLib, ExpectedModule);
+    if(res == FALSE || KeyedData.ulDataFormatVersion != 1 || header == NULL || classData == NULL)
+    {
+        skip("Can't read data for class. Skipping\n");
+    }
+    else
+    {
+        ok(header->magic == STRSECTION_MAGIC, "%lu\n", header->magic );
+        ok(header->size == sizeof(*header), "Got %lu instead of %d\n", header->size, sizeof(*header));
+        ok(header->count == ExpectedClassCount, "Expected %lu classes, got %lu\n", ExpectedClassCount, header->count );
+
+        VersionedClass = (WCHAR*)((BYTE*)classData + classData->name_offset);
+        ClassLib = (WCHAR*)((BYTE*)header + classData->module_offset);
+        data_lenght = classData->size + classData->name_len + classData->module_len + 2*sizeof(WCHAR);
+        ok(KeyedData.ulLength == data_lenght, "Got lenght %lu instead of %d\n", KeyedData.ulLength, data_lenght);
+        ok(classData->size == sizeof(*classData), "Got %lu instead of %d\n", classData->size, sizeof(*classData));
+        ok(classData->res == 0, "Got res %lu\n", classData->res);
+        ok(classData->module_len == wcslen(ExpectedModule) * 2, "Got name len %lu, expected %d\n", classData->module_len, wcslen(ExpectedModule) *2);
+        ok(wcscmp(ClassLib, ExpectedModule) == 0, "Got %S, expected %S\n", ClassLib, ExpectedModule);
+        /* compare only if VersionedClass starts with ExpectedClassPart */
+        ok(memcmp(VersionedClass, ExpectedClassPart, sizeof(WCHAR) * wcslen(ExpectedClassPart)) == 0, "Expected %S to start with %S\n", VersionedClass, ExpectedClassPart);
+    }
 }
 
 VOID TestLibDependency(HANDLE h)
@@ -178,7 +193,7 @@ VOID TestLibDependency(HANDLE h)
     SectionHeader = (struct strsection_header*)KeyedData.lpSectionBase;
     redirData = (struct dllredirect_data *)KeyedData.lpData;
 
-    if(res == FALSE || KeyedData.ulDataFormatVersion != 1)
+    if(res == FALSE || KeyedData.ulDataFormatVersion != 1 || SectionHeader == NULL || redirData == NULL)
     {
         skip("Can't read data for dep1.dll. Skipping\n");
     }
@@ -206,7 +221,7 @@ VOID TestLibDependency(HANDLE h)
     SectionHeader = (struct strsection_header*)KeyedData.lpSectionBase;
     assemplyData = (struct assemply_data*)KeyedData.lpData;;
 
-    if(res == FALSE || KeyedData.ulDataFormatVersion != 1)
+    if(res == FALSE || KeyedData.ulDataFormatVersion != 1 || SectionHeader == NULL || assemplyData == NULL)
     {
         skip("Can't read data for dep1. Skipping\n");
     }
@@ -265,22 +280,42 @@ START_TEST(FindActCtxSectionStringW)
     
     /* Class redirection tests */
     h = _CreateActCtxFromFile(L"classtest.manifest", __LINE__);
-    _ActivateCtx(h, &cookie, __LINE__);
-    TestClassRedirection(h, L"Button", L"2.2.2.2!Button", L"testlib.dll", 5);
-    _DeactivateCtx(cookie, __LINE__);
+    if (h != INVALID_HANDLE_VALUE)
+    {
+        _ActivateCtx(h, &cookie, __LINE__);
+        TestClassRedirection(h, L"Button", L"2.2.2.2!Button", L"testlib.dll", 5);
+        _DeactivateCtx(cookie, __LINE__);
+    }
+    else
+    {
+        skip("Failed to create context for classtest.manifest\n");
+    }
     
     /* Dependency tests */
     h = _CreateActCtxFromFile(L"deptest.manifest", __LINE__);
-    _ActivateCtx(h, &cookie, __LINE__);
-    TestLibDependency(h);
-    _DeactivateCtx(cookie, __LINE__);
+    if (h != INVALID_HANDLE_VALUE)
+    {
+        _ActivateCtx(h, &cookie, __LINE__);
+        TestLibDependency(h);
+        _DeactivateCtx(cookie, __LINE__);
+    }
+    else
+    {
+        skip("Failed to create context for deptest.manifest\n");
+    }    
     
     /* Activate a context that depends on comctl32 v6 and run class tests again */
     h = _CreateActCtxFromFile(L"comctl32dep.manifest", __LINE__);
-    _ActivateCtx(h, &cookie, __LINE__);
-    TestClassRedirection(h, L"Button", L"6.0.3790.1830!Button", L"comctl32.dll", 29);
-    ok( GetModuleHandleW(L"comctl32.dll") == NULL, "Expected comctl32 not to be loaded\n");
-    ok( GetModuleHandleW(L"user32.dll") == NULL, "Expected user32 not to be loaded\n");
-    _DeactivateCtx(cookie, __LINE__);
-    
+    if (h != INVALID_HANDLE_VALUE)
+    {
+        _ActivateCtx(h, &cookie, __LINE__);
+        TestClassRedirection(h, L"Button", L"6.0.", L"comctl32.dll", 29);
+        ok( GetModuleHandleW(L"comctl32.dll") == NULL, "Expected comctl32 not to be loaded\n");
+        ok( GetModuleHandleW(L"user32.dll") == NULL, "Expected user32 not to be loaded\n");
+        _DeactivateCtx(cookie, __LINE__);
+    }
+    else
+    {
+        skip("Failed to create context for comctl32dep.manifest\n");
+    }
 }
\ No newline at end of file