https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f941c78f50cb138840c68…
commit f941c78f50cb138840c68c2756a583e8d8ceb105
Author: Mark Jansen <mark.jansen(a)reactos.org>
AuthorDate: Wed Dec 20 22:06:44 2017 +0100
[ATL_APITEST] Show that CComObject's COM_MAP continues enumeration after a failing
blind function.
---
modules/rostests/apitests/atl/CComObject.cpp | 149 +++++++++++++++++++++
modules/rostests/apitests/atl/CMakeLists.txt | 1 +
modules/rostests/apitests/atl/devenv/ATLTest.sln | 10 ++
.../devenv/{CImage.vcxproj => CComObject.vcxproj} | 9 +-
.../rostests/apitests/atl/devenv/CImage.vcxproj | 2 +-
modules/rostests/apitests/atl/testlist.c | 2 +
6 files changed, 166 insertions(+), 7 deletions(-)
diff --git a/modules/rostests/apitests/atl/CComObject.cpp
b/modules/rostests/apitests/atl/CComObject.cpp
new file mode 100644
index 0000000000..f7d16e1e69
--- /dev/null
+++ b/modules/rostests/apitests/atl/CComObject.cpp
@@ -0,0 +1,149 @@
+/*
+ * PROJECT: ReactOS api tests
+ * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE: Test for CComObject
+ * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen(a)reactos.org)
+ */
+
+
+#include <atlbase.h>
+#include <atlcom.h>
+
+#ifdef __REACTOS__
+ #include <apitest.h>
+#else
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <stdarg.h>
+ int g_tests_executed = 0;
+ int g_tests_failed = 0;
+ void ok_func(const char *file, int line, BOOL value, const char *fmt, ...)
+ {
+ va_list va;
+ va_start(va, fmt);
+ if (!value)
+ {
+ printf("%s (%d): ", file, line);
+ vprintf(fmt, va);
+ g_tests_failed++;
+ }
+ g_tests_executed++;
+ va_end(va);
+ }
+ #undef ok
+ #define ok(value, ...) ok_func(__FILE__, __LINE__, value, __VA_ARGS__)
+ #define START_TEST(x) int main(void)
+#endif
+
+
+static LONG g_CTOR = 0;
+static LONG g_DTOR = 0;
+static LONG g_BLIND = 0;
+
+class CTestObject :
+ public CComObjectRootEx<CComMultiThreadModelNoCS>,
+ public IPersist,
+ public IStdMarshalInfo
+{
+public:
+ CTestObject()
+ {
+ InterlockedIncrement(&g_CTOR);
+ }
+ ~CTestObject()
+ {
+ InterlockedIncrement(&g_DTOR);
+ }
+
+ // *** IPersist methods ***
+ virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID)
+ {
+ return E_NOTIMPL;
+ }
+
+ // *** IStdMarshalInfo methods ***
+ virtual HRESULT STDMETHODCALLTYPE GetClassForHandler(DWORD dwDestContext, void
*pvDestContext, CLSID *pClsid)
+ {
+ return E_NOTIMPL;
+ }
+
+ static HRESULT WINAPI FuncBlind(void* pv, REFIID riid, LPVOID* ppv, DWORD dw)
+ {
+ InterlockedIncrement(&g_BLIND);
+ return E_FAIL;
+ }
+
+ DECLARE_NOT_AGGREGATABLE(CTestObject)
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+ BEGIN_COM_MAP(CTestObject)
+ COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) /* First entry has to be a simple
entry, otherwise ATL asserts */
+ COM_INTERFACE_ENTRY_FUNC_BLIND(0, FuncBlind) /* Showing that even after a
Blind func, entryies can be found */
+ COM_INTERFACE_ENTRY_IID(IID_IStdMarshalInfo, IStdMarshalInfo)
+ END_COM_MAP()
+};
+
+
+class CDumExe: public CAtlExeModuleT<CDumExe>
+{
+
+};
+CDumExe dum;
+
+
+START_TEST(CComObject)
+{
+ g_CTOR = g_DTOR = g_BLIND = 0;
+
+ CComObject<CTestObject>* pTest;
+ HRESULT hr = CComObject<CTestObject>::CreateInstance(&pTest);
+
+ ok(hr == S_OK, "Expected S_OK, got 0x%lx\n", hr);
+
+ ok(g_CTOR == 1, "Expected 1, got %lu\n", g_CTOR);
+ ok(g_DTOR == 0, "Expected 0, got %lu\n", g_DTOR);
+ ok(g_BLIND == 0, "Expected 0, got %lu\n", g_BLIND);
+
+ if (hr == S_OK)
+ {
+ ULONG ref = pTest->AddRef();
+ ok(ref == 1, "Expected 1, got %lu\n", ref);
+
+ {
+ CComPtr<IUnknown> ppv;
+ hr = pTest->QueryInterface(IID_IUnknown, (void **) &ppv);
+ ok(hr == S_OK, "Expected S_OK, got 0x%lx\n", hr);
+ ok(g_CTOR == 1, "Expected 1, got %lu\n", g_CTOR);
+ ok(g_DTOR == 0, "Expected 0, got %lu\n", g_DTOR);
+ ok(g_BLIND == 0, "Expected 0, got %lu\n", g_BLIND);
+
+ CComPtr<IPersist> ppersist;
+ hr = pTest->QueryInterface(IID_IPersist, (void **)&ppersist);
+ ok(hr == S_OK, "Expected S_OK, got 0x%lx\n", hr);
+ ok(g_CTOR == 1, "Expected 1, got %lu\n", g_CTOR);
+ ok(g_DTOR == 0, "Expected 0, got %lu\n", g_DTOR);
+ ok(g_BLIND == 0, "Expected 0, got %lu\n", g_BLIND);
+
+ }
+
+ {
+ CComPtr<IStdMarshalInfo> pstd;
+ hr = pTest->QueryInterface(IID_IStdMarshalInfo, (void **)&pstd);
+ ok(hr == S_OK, "Expected S_OK, got 0x%lx\n", hr);
+ ok(g_CTOR == 1, "Expected 1, got %lu\n", g_CTOR);
+ ok(g_DTOR == 0, "Expected 0, got %lu\n", g_DTOR);
+ ok(g_BLIND == 1, "Expected 1, got %lu\n", g_BLIND);
+ }
+
+ ref = pTest->Release();
+ ok(ref == 0, "Expected 0, got %lu\n", ref);
+ ok(g_CTOR == 1, "Expected 1, got %lu\n", g_CTOR);
+ ok(g_DTOR == 1, "Expected 1, got %lu\n", g_DTOR);
+ ok(g_BLIND == 1, "Expected 1, got %lu\n", g_BLIND);
+ }
+
+#ifndef __REACTOS__
+ printf("CImage: %i tests executed (0 marked as todo, %i failures), 0
skipped.\n", g_tests_executed, g_tests_failed);
+ return g_tests_failed;
+#endif
+}
diff --git a/modules/rostests/apitests/atl/CMakeLists.txt
b/modules/rostests/apitests/atl/CMakeLists.txt
index 9c9ed6ddec..fbc1420dec 100644
--- a/modules/rostests/apitests/atl/CMakeLists.txt
+++ b/modules/rostests/apitests/atl/CMakeLists.txt
@@ -8,6 +8,7 @@ list(APPEND SOURCE
atltypes.cpp
CComBSTR.cpp
CComHeapPtr.cpp
+ CComObject.cpp
CImage.cpp
CRegKey.cpp
CSimpleArray.cpp
diff --git a/modules/rostests/apitests/atl/devenv/ATLTest.sln
b/modules/rostests/apitests/atl/devenv/ATLTest.sln
index 1384c080a6..d9d18dddb6 100644
--- a/modules/rostests/apitests/atl/devenv/ATLTest.sln
+++ b/modules/rostests/apitests/atl/devenv/ATLTest.sln
@@ -11,6 +11,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") =
"CSimpleMap", "CSimpleMap.vc
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CString",
"CString.vcxproj", "{FBA6DAE7-7996-4DE1-BD03-9E44F7DB4ABD}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CComObject",
"CComObject.vcxproj", "{408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@@ -51,6 +53,14 @@ Global
{FBA6DAE7-7996-4DE1-BD03-9E44F7DB4ABD}.Release|x64.Build.0 = Release|x64
{FBA6DAE7-7996-4DE1-BD03-9E44F7DB4ABD}.Release|x86.ActiveCfg = Release|Win32
{FBA6DAE7-7996-4DE1-BD03-9E44F7DB4ABD}.Release|x86.Build.0 = Release|Win32
+ {408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}.Debug|x64.ActiveCfg = Debug|x64
+ {408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}.Debug|x64.Build.0 = Debug|x64
+ {408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}.Debug|x86.ActiveCfg = Debug|Win32
+ {408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}.Debug|x86.Build.0 = Debug|Win32
+ {408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}.Release|x64.ActiveCfg = Release|x64
+ {408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}.Release|x64.Build.0 = Release|x64
+ {408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}.Release|x86.ActiveCfg = Release|Win32
+ {408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/modules/rostests/apitests/atl/devenv/CImage.vcxproj
b/modules/rostests/apitests/atl/devenv/CComObject.vcxproj
similarity index 97%
copy from modules/rostests/apitests/atl/devenv/CImage.vcxproj
copy to modules/rostests/apitests/atl/devenv/CComObject.vcxproj
index 427a8a371c..ac525e52d9 100644
--- a/modules/rostests/apitests/atl/devenv/CImage.vcxproj
+++ b/modules/rostests/apitests/atl/devenv/CComObject.vcxproj
@@ -19,7 +19,7 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectGuid>{AE520E17-2DAE-40FF-B082-F32A7A935FB2}</ProjectGuid>
+ <ProjectGuid>{408AEF87-D169-4A2F-A9E3-FF3DD1D59E65}</ProjectGuid>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<Keyword>AtlProj</Keyword>
</PropertyGroup>
@@ -98,7 +98,7 @@
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <RegisterOutput>true</RegisterOutput>
+ <RegisterOutput>false</RegisterOutput>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup
Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -163,7 +163,7 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
- <ClCompile Include="../CImage.cpp">
+ <ClCompile Include="../CComObject.cpp">
<RuntimeLibrary
Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MultiThreaded</RuntimeLibrary>
<RuntimeLibrary
Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MultiThreaded</RuntimeLibrary>
<RuntimeLibrary
Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MultiThreadedDebug</RuntimeLibrary>
@@ -174,9 +174,6 @@
<PrecompiledHeader
Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
</ItemGroup>
- <ItemGroup>
- <ResourceCompile Include="../atl_apitest.rc" />
- </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
diff --git a/modules/rostests/apitests/atl/devenv/CImage.vcxproj
b/modules/rostests/apitests/atl/devenv/CImage.vcxproj
index 427a8a371c..5c77112862 100644
--- a/modules/rostests/apitests/atl/devenv/CImage.vcxproj
+++ b/modules/rostests/apitests/atl/devenv/CImage.vcxproj
@@ -98,7 +98,7 @@
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <RegisterOutput>true</RegisterOutput>
+ <RegisterOutput>false</RegisterOutput>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup
Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
diff --git a/modules/rostests/apitests/atl/testlist.c
b/modules/rostests/apitests/atl/testlist.c
index f154b0d06c..0c40c3b140 100644
--- a/modules/rostests/apitests/atl/testlist.c
+++ b/modules/rostests/apitests/atl/testlist.c
@@ -4,6 +4,7 @@
extern void func_atltypes(void);
extern void func_CComBSTR(void);
extern void func_CComHeapPtr(void);
+extern void func_CComObject(void);
extern void func_CComVariant(void);
extern void func_CImage(void);
extern void func_CRegKey(void);
@@ -16,6 +17,7 @@ const struct test winetest_testlist[] =
{ "atltypes", func_atltypes },
{ "CComBSTR", func_CComBSTR },
{ "CComHeapPtr", func_CComHeapPtr },
+ { "CComObject", func_CComObject },
{ "CComVariant", func_CComVariant },
{ "CImage", func_CImage },
{ "CRegKey", func_CRegKey },