Split Variant marshalling tests - #53035

Merged
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test
May 30, 2021
Merged

Split Variant marshalling tests#53035
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test

Conversation

@kant2002

Copy link
Copy Markdown
Contributor

These tests split to be able test ComWrappers,
built-in COM enabled/disable mode.
See #50500, #51265

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Initially discovered as part of dotnet/runtimelab#1142
I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.
This PR to gather feedback on the implementation details, code split approach.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.

Adding a feature flag to a test project is the same as passing it in the product. See https://github.com/dotnet/runtime/pull/52940/files#diff-c25cd81bf60eaf73ca87747baafae7fbfd0ac8a787da03b22382eff45316c9e5 and look for RuntimeHostConfigurationOption.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

/cc @LakshanF@elinor-fung

@kant2002

Copy link
Copy Markdown
ContributorAuthor

I think I overcomplicate PR. I will revert changes, and will create couple projects in same folder. Seems to be that would be easier to maintain.

@LakshanF

Copy link
Copy Markdown
Contributor

@kant2002, thanks for taking a look! Please also take a look at some test changes that are already present for library, and the pending PR, #52940, that has some tests for the runtime.

@kant2002
kant2002force-pushed the kant/split-variant-test branch from 9f6bd1e to 024ce9bCompareMay 21, 2021 13:45
@kant2002
kant2002force-pushed the kant/split-variant-test branch from 024ce9b to 6fa61f1CompareMay 21, 2021 13:45
@kant2002

Copy link
Copy Markdown
ContributorAuthor

@LakshanF this changes just for Variant marshalling. Hopefully current version is in spirit of what was for #52940

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Build was failed, since results was not sent to Helix

@LakshanF

Copy link
Copy Markdown
Contributor

I see these 2 tests failing when built-in COM is disabled,

Interop\PInvoke\Variant\VariantTestBuiltInComDisabled\VariantTestBuiltInComDisabled.cmd
Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd

The first test has the following output,

BEGIN EXECUTION
"C:\h\w\AC52093C\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestBuiltInComDisabled.dll
Built-in COM Disabled?: True
Test failed: System.NotSupportedException: Built-in COM has been disabled via a feature switch. See https://aka.ms/dotnet-illink/com for more information.
at System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)
at VariantNative.Marshal_ByValue_Object(Object obj)
at Test.TestByValue(Boolean hasComSupport) in VariantTestBuiltInComDisabled.dll:token 0x6000059+0x223
at Test.Main() in VariantTestBuiltInComDisabled.dll:token 0x600005e+0x34
Expected: 100
Actual: 101
END EXECUTION - FAILED

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me in the error log. I was able to find it afterwards. I see now only one error

 Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd [FAIL]
Return code: 1
Raw output file: C:\h\w\AF5C0958\w\B3E30948\e\Interop\PInvoke\Reports\Interop.PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.output.txt
Raw output:
BEGIN EXECUTION
"C:\h\w\AF5C0958\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestComWrappers.dll Test failed: TestLibrary.AssertTestException: Assert.IsTrue: at TestLibrary.Assert.HandleFail(String assertionName, String message) in TestLibrary.dll:token 0x6000021+0x11
at TestLibrary.Assert.IsTrue(Boolean condition, String message) in TestLibrary.dll:token 0x600000a+0x3
at Test.TestByValue(Boolean hasComSupport) in VariantTestComWrappers.dll:token 0x6000059+0x223
at Test.Main() in VariantTestComWrappers.dll:token 0x600005e+0xc
Invalid format. Expected VT_DISPATCH.

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

Comment threadsrc/tests/Interop/PInvoke/Variant/VariantTest.ComWrappers.cs Outdated
@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

@kant2002 It isn't clear to me which statement in the test is failing. Can you narrow it down to which one is the issue?

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT this line produce exception
https://github.com/dotnet/runtime/pull/53035/files#diff-1c679eb2a695bcba0de0c236544a305004b9e816151a677657a2528b2a039608R46
because there printed message from

printf("Invalid format. Expected VT_DISPATCH.\n");

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Honestly I did not run that. It's just reading logs. I'm yet to build single test project locally. Otherwise it's hard to me to allocate time (~1 hour). If you strictly need me to build, and validate my last statement, let me know. I will compile and troubleshoot in more details. But I think I point location to you properly.

@AaronRobinsonMSFT

AaronRobinsonMSFT commented May 25, 2021

Copy link
Copy Markdown
Member

@kant2002 The issue here is a bug in the ComWrappers conversion logic for IDispatch. It is a part of the absolute mess that is the OLE support and how enum values are used as both request and result – yuck.

In the both case we detect if IDispatch is implemented but don't reduce the returned enum value to just ComIpType_Dispatch but return the input - which is the request not the result. The solution here is to return either ComIpType_Dispatch or ComIpType_Unknown but not ComIpType_Both.

if (TryGetComIPFromObjectRefUsingComWrappers(*poref, &pUnk))
{
hr = S_OK;
IUnknown* pvObj;
if (ReqIpType & ComIpType_Dispatch)
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();
}
else
{
pvObj = pUnk;
}
if (FAILED(hr))
COMPlusThrowHR(hr);
if (pFetchedIpType != NULL)
*pFetchedIpType = ReqIpType;
RETURN pvObj;
}

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Should I fix that bug as part of PR?

Yes, that would be much appreciated.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT can you take a look?

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

Copy link
Copy Markdown
ContributorAuthor

Do not understand test failures. Please advice if this something which I'm responsible with?

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kant2002 I would take a step back here and walk through this logic more fully. I think there was some confusion on when this was originally written and support IDispatch has uncovered that in the ComWrappers scenario.

/cc @elinor-fung

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated
@@ -189,17 +189,26 @@ IUnknown *GetComIPFromObjectRef(OBJECTREF *poref, ComIpType ReqIpType, ComIpType
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Release shouldn't be called indiscriminately here. We are checking for IDispatch now and it could fail, but ComIpType_Unknown must still be returned. Move this release into the success path below.

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

kant2002 commented May 27, 2021

Copy link
Copy Markdown
ContributorAuthor

Do I understand correctly that in discussed part of code, I should follow these rules?

ReqIpType = ComIpType_Both

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

ReqIpType = ComIpType_IDispatch

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
COMPlusThrowHR(hr); // ????

ReqIpType = ComIpType_IUnknown

pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 Yes.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT is it possible that ComIpType_OuterUnknown would be passed to that location? Technically that will be handled by IUnknown case, but maybe there special processing needed.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 I don't think that ComIpType_OuterUnknown should be a concern here. The ComWrappers API does support aggregation but at present I am not sure how we would integrate at this point. I am okay not dealing with it at present.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT then can you take a look?

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you.

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 8538a75 into dotnet:mainMay 30, 2021
@kant2002
kant2002 deleted the kant/split-variant-test branch May 31, 2021 09:38
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kant2002@AaronRobinsonMSFT@LakshanF
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Split Variant marshalling tests - #53035

Merged
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test
May 30, 2021
Merged

Split Variant marshalling tests#53035
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test

Conversation

@kant2002

Copy link
Copy Markdown
Contributor

These tests split to be able test ComWrappers,
built-in COM enabled/disable mode.
See #50500, #51265

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Initially discovered as part of dotnet/runtimelab#1142
I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.
This PR to gather feedback on the implementation details, code split approach.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.

Adding a feature flag to a test project is the same as passing it in the product. See https://github.com/dotnet/runtime/pull/52940/files#diff-c25cd81bf60eaf73ca87747baafae7fbfd0ac8a787da03b22382eff45316c9e5 and look for RuntimeHostConfigurationOption.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

/cc @LakshanF@elinor-fung

@kant2002

Copy link
Copy Markdown
ContributorAuthor

I think I overcomplicate PR. I will revert changes, and will create couple projects in same folder. Seems to be that would be easier to maintain.

@LakshanF

Copy link
Copy Markdown
Contributor

@kant2002, thanks for taking a look! Please also take a look at some test changes that are already present for library, and the pending PR, #52940, that has some tests for the runtime.

@kant2002
kant2002force-pushed the kant/split-variant-test branch from 9f6bd1e to 024ce9bCompareMay 21, 2021 13:45
@kant2002
kant2002force-pushed the kant/split-variant-test branch from 024ce9b to 6fa61f1CompareMay 21, 2021 13:45
@kant2002

Copy link
Copy Markdown
ContributorAuthor

@LakshanF this changes just for Variant marshalling. Hopefully current version is in spirit of what was for #52940

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Build was failed, since results was not sent to Helix

@LakshanF

Copy link
Copy Markdown
Contributor

I see these 2 tests failing when built-in COM is disabled,

Interop\PInvoke\Variant\VariantTestBuiltInComDisabled\VariantTestBuiltInComDisabled.cmd
Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd

The first test has the following output,

BEGIN EXECUTION
"C:\h\w\AC52093C\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestBuiltInComDisabled.dll
Built-in COM Disabled?: True
Test failed: System.NotSupportedException: Built-in COM has been disabled via a feature switch. See https://aka.ms/dotnet-illink/com for more information.
at System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)
at VariantNative.Marshal_ByValue_Object(Object obj)
at Test.TestByValue(Boolean hasComSupport) in VariantTestBuiltInComDisabled.dll:token 0x6000059+0x223
at Test.Main() in VariantTestBuiltInComDisabled.dll:token 0x600005e+0x34
Expected: 100
Actual: 101
END EXECUTION - FAILED

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me in the error log. I was able to find it afterwards. I see now only one error

 Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd [FAIL]
Return code: 1
Raw output file: C:\h\w\AF5C0958\w\B3E30948\e\Interop\PInvoke\Reports\Interop.PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.output.txt
Raw output:
BEGIN EXECUTION
"C:\h\w\AF5C0958\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestComWrappers.dll Test failed: TestLibrary.AssertTestException: Assert.IsTrue: at TestLibrary.Assert.HandleFail(String assertionName, String message) in TestLibrary.dll:token 0x6000021+0x11
at TestLibrary.Assert.IsTrue(Boolean condition, String message) in TestLibrary.dll:token 0x600000a+0x3
at Test.TestByValue(Boolean hasComSupport) in VariantTestComWrappers.dll:token 0x6000059+0x223
at Test.Main() in VariantTestComWrappers.dll:token 0x600005e+0xc
Invalid format. Expected VT_DISPATCH.

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

Comment threadsrc/tests/Interop/PInvoke/Variant/VariantTest.ComWrappers.cs Outdated
@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

@kant2002 It isn't clear to me which statement in the test is failing. Can you narrow it down to which one is the issue?

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT this line produce exception
https://github.com/dotnet/runtime/pull/53035/files#diff-1c679eb2a695bcba0de0c236544a305004b9e816151a677657a2528b2a039608R46
because there printed message from

printf("Invalid format. Expected VT_DISPATCH.\n");

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Honestly I did not run that. It's just reading logs. I'm yet to build single test project locally. Otherwise it's hard to me to allocate time (~1 hour). If you strictly need me to build, and validate my last statement, let me know. I will compile and troubleshoot in more details. But I think I point location to you properly.

@AaronRobinsonMSFT

AaronRobinsonMSFT commented May 25, 2021

Copy link
Copy Markdown
Member

@kant2002 The issue here is a bug in the ComWrappers conversion logic for IDispatch. It is a part of the absolute mess that is the OLE support and how enum values are used as both request and result – yuck.

In the both case we detect if IDispatch is implemented but don't reduce the returned enum value to just ComIpType_Dispatch but return the input - which is the request not the result. The solution here is to return either ComIpType_Dispatch or ComIpType_Unknown but not ComIpType_Both.

if (TryGetComIPFromObjectRefUsingComWrappers(*poref, &pUnk))
{
hr = S_OK;
IUnknown* pvObj;
if (ReqIpType & ComIpType_Dispatch)
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();
}
else
{
pvObj = pUnk;
}
if (FAILED(hr))
COMPlusThrowHR(hr);
if (pFetchedIpType != NULL)
*pFetchedIpType = ReqIpType;
RETURN pvObj;
}

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Should I fix that bug as part of PR?

Yes, that would be much appreciated.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT can you take a look?

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

Copy link
Copy Markdown
ContributorAuthor

Do not understand test failures. Please advice if this something which I'm responsible with?

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kant2002 I would take a step back here and walk through this logic more fully. I think there was some confusion on when this was originally written and support IDispatch has uncovered that in the ComWrappers scenario.

/cc @elinor-fung

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated
@@ -189,17 +189,26 @@ IUnknown *GetComIPFromObjectRef(OBJECTREF *poref, ComIpType ReqIpType, ComIpType
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Release shouldn't be called indiscriminately here. We are checking for IDispatch now and it could fail, but ComIpType_Unknown must still be returned. Move this release into the success path below.

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

kant2002 commented May 27, 2021

Copy link
Copy Markdown
ContributorAuthor

Do I understand correctly that in discussed part of code, I should follow these rules?

ReqIpType = ComIpType_Both

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

ReqIpType = ComIpType_IDispatch

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
COMPlusThrowHR(hr); // ????

ReqIpType = ComIpType_IUnknown

pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 Yes.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT is it possible that ComIpType_OuterUnknown would be passed to that location? Technically that will be handled by IUnknown case, but maybe there special processing needed.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 I don't think that ComIpType_OuterUnknown should be a concern here. The ComWrappers API does support aggregation but at present I am not sure how we would integrate at this point. I am okay not dealing with it at present.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT then can you take a look?

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you.

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 8538a75 into dotnet:mainMay 30, 2021
@kant2002
kant2002 deleted the kant/split-variant-test branch May 31, 2021 09:38
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kant2002@AaronRobinsonMSFT@LakshanF
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Split Variant marshalling tests - #53035

Merged
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test
May 30, 2021
Merged

Split Variant marshalling tests#53035
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test

Conversation

@kant2002

Copy link
Copy Markdown
Contributor

These tests split to be able test ComWrappers,
built-in COM enabled/disable mode.
See #50500, #51265

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Initially discovered as part of dotnet/runtimelab#1142
I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.
This PR to gather feedback on the implementation details, code split approach.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.

Adding a feature flag to a test project is the same as passing it in the product. See https://github.com/dotnet/runtime/pull/52940/files#diff-c25cd81bf60eaf73ca87747baafae7fbfd0ac8a787da03b22382eff45316c9e5 and look for RuntimeHostConfigurationOption.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

/cc @LakshanF@elinor-fung

@kant2002

Copy link
Copy Markdown
ContributorAuthor

I think I overcomplicate PR. I will revert changes, and will create couple projects in same folder. Seems to be that would be easier to maintain.

@LakshanF

Copy link
Copy Markdown
Contributor

@kant2002, thanks for taking a look! Please also take a look at some test changes that are already present for library, and the pending PR, #52940, that has some tests for the runtime.

@kant2002
kant2002force-pushed the kant/split-variant-test branch from 9f6bd1e to 024ce9bCompareMay 21, 2021 13:45
@kant2002
kant2002force-pushed the kant/split-variant-test branch from 024ce9b to 6fa61f1CompareMay 21, 2021 13:45
@kant2002

Copy link
Copy Markdown
ContributorAuthor

@LakshanF this changes just for Variant marshalling. Hopefully current version is in spirit of what was for #52940

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Build was failed, since results was not sent to Helix

@LakshanF

Copy link
Copy Markdown
Contributor

I see these 2 tests failing when built-in COM is disabled,

Interop\PInvoke\Variant\VariantTestBuiltInComDisabled\VariantTestBuiltInComDisabled.cmd
Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd

The first test has the following output,

BEGIN EXECUTION
"C:\h\w\AC52093C\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestBuiltInComDisabled.dll
Built-in COM Disabled?: True
Test failed: System.NotSupportedException: Built-in COM has been disabled via a feature switch. See https://aka.ms/dotnet-illink/com for more information.
at System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)
at VariantNative.Marshal_ByValue_Object(Object obj)
at Test.TestByValue(Boolean hasComSupport) in VariantTestBuiltInComDisabled.dll:token 0x6000059+0x223
at Test.Main() in VariantTestBuiltInComDisabled.dll:token 0x600005e+0x34
Expected: 100
Actual: 101
END EXECUTION - FAILED

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me in the error log. I was able to find it afterwards. I see now only one error

 Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd [FAIL]
Return code: 1
Raw output file: C:\h\w\AF5C0958\w\B3E30948\e\Interop\PInvoke\Reports\Interop.PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.output.txt
Raw output:
BEGIN EXECUTION
"C:\h\w\AF5C0958\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestComWrappers.dll Test failed: TestLibrary.AssertTestException: Assert.IsTrue: at TestLibrary.Assert.HandleFail(String assertionName, String message) in TestLibrary.dll:token 0x6000021+0x11
at TestLibrary.Assert.IsTrue(Boolean condition, String message) in TestLibrary.dll:token 0x600000a+0x3
at Test.TestByValue(Boolean hasComSupport) in VariantTestComWrappers.dll:token 0x6000059+0x223
at Test.Main() in VariantTestComWrappers.dll:token 0x600005e+0xc
Invalid format. Expected VT_DISPATCH.

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

Comment threadsrc/tests/Interop/PInvoke/Variant/VariantTest.ComWrappers.cs Outdated
@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

@kant2002 It isn't clear to me which statement in the test is failing. Can you narrow it down to which one is the issue?

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT this line produce exception
https://github.com/dotnet/runtime/pull/53035/files#diff-1c679eb2a695bcba0de0c236544a305004b9e816151a677657a2528b2a039608R46
because there printed message from

printf("Invalid format. Expected VT_DISPATCH.\n");

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Honestly I did not run that. It's just reading logs. I'm yet to build single test project locally. Otherwise it's hard to me to allocate time (~1 hour). If you strictly need me to build, and validate my last statement, let me know. I will compile and troubleshoot in more details. But I think I point location to you properly.

@AaronRobinsonMSFT

AaronRobinsonMSFT commented May 25, 2021

Copy link
Copy Markdown
Member

@kant2002 The issue here is a bug in the ComWrappers conversion logic for IDispatch. It is a part of the absolute mess that is the OLE support and how enum values are used as both request and result – yuck.

In the both case we detect if IDispatch is implemented but don't reduce the returned enum value to just ComIpType_Dispatch but return the input - which is the request not the result. The solution here is to return either ComIpType_Dispatch or ComIpType_Unknown but not ComIpType_Both.

if (TryGetComIPFromObjectRefUsingComWrappers(*poref, &pUnk))
{
hr = S_OK;
IUnknown* pvObj;
if (ReqIpType & ComIpType_Dispatch)
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();
}
else
{
pvObj = pUnk;
}
if (FAILED(hr))
COMPlusThrowHR(hr);
if (pFetchedIpType != NULL)
*pFetchedIpType = ReqIpType;
RETURN pvObj;
}

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Should I fix that bug as part of PR?

Yes, that would be much appreciated.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT can you take a look?

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

Copy link
Copy Markdown
ContributorAuthor

Do not understand test failures. Please advice if this something which I'm responsible with?

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kant2002 I would take a step back here and walk through this logic more fully. I think there was some confusion on when this was originally written and support IDispatch has uncovered that in the ComWrappers scenario.

/cc @elinor-fung

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated
@@ -189,17 +189,26 @@ IUnknown *GetComIPFromObjectRef(OBJECTREF *poref, ComIpType ReqIpType, ComIpType
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Release shouldn't be called indiscriminately here. We are checking for IDispatch now and it could fail, but ComIpType_Unknown must still be returned. Move this release into the success path below.

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

kant2002 commented May 27, 2021

Copy link
Copy Markdown
ContributorAuthor

Do I understand correctly that in discussed part of code, I should follow these rules?

ReqIpType = ComIpType_Both

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

ReqIpType = ComIpType_IDispatch

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
COMPlusThrowHR(hr); // ????

ReqIpType = ComIpType_IUnknown

pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 Yes.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT is it possible that ComIpType_OuterUnknown would be passed to that location? Technically that will be handled by IUnknown case, but maybe there special processing needed.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 I don't think that ComIpType_OuterUnknown should be a concern here. The ComWrappers API does support aggregation but at present I am not sure how we would integrate at this point. I am okay not dealing with it at present.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT then can you take a look?

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you.

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 8538a75 into dotnet:mainMay 30, 2021
@kant2002
kant2002 deleted the kant/split-variant-test branch May 31, 2021 09:38
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kant2002@AaronRobinsonMSFT@LakshanF
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Split Variant marshalling tests - #53035

Merged
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test
May 30, 2021
Merged

Split Variant marshalling tests#53035
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test

Conversation

@kant2002

Copy link
Copy Markdown
Contributor

These tests split to be able test ComWrappers,
built-in COM enabled/disable mode.
See #50500, #51265

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Initially discovered as part of dotnet/runtimelab#1142
I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.
This PR to gather feedback on the implementation details, code split approach.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.

Adding a feature flag to a test project is the same as passing it in the product. See https://github.com/dotnet/runtime/pull/52940/files#diff-c25cd81bf60eaf73ca87747baafae7fbfd0ac8a787da03b22382eff45316c9e5 and look for RuntimeHostConfigurationOption.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

/cc @LakshanF@elinor-fung

@kant2002

Copy link
Copy Markdown
ContributorAuthor

I think I overcomplicate PR. I will revert changes, and will create couple projects in same folder. Seems to be that would be easier to maintain.

@LakshanF

Copy link
Copy Markdown
Contributor

@kant2002, thanks for taking a look! Please also take a look at some test changes that are already present for library, and the pending PR, #52940, that has some tests for the runtime.

@kant2002
kant2002force-pushed the kant/split-variant-test branch from 9f6bd1e to 024ce9bCompareMay 21, 2021 13:45
@kant2002
kant2002force-pushed the kant/split-variant-test branch from 024ce9b to 6fa61f1CompareMay 21, 2021 13:45
@kant2002

Copy link
Copy Markdown
ContributorAuthor

@LakshanF this changes just for Variant marshalling. Hopefully current version is in spirit of what was for #52940

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Build was failed, since results was not sent to Helix

@LakshanF

Copy link
Copy Markdown
Contributor

I see these 2 tests failing when built-in COM is disabled,

Interop\PInvoke\Variant\VariantTestBuiltInComDisabled\VariantTestBuiltInComDisabled.cmd
Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd

The first test has the following output,

BEGIN EXECUTION
"C:\h\w\AC52093C\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestBuiltInComDisabled.dll
Built-in COM Disabled?: True
Test failed: System.NotSupportedException: Built-in COM has been disabled via a feature switch. See https://aka.ms/dotnet-illink/com for more information.
at System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)
at VariantNative.Marshal_ByValue_Object(Object obj)
at Test.TestByValue(Boolean hasComSupport) in VariantTestBuiltInComDisabled.dll:token 0x6000059+0x223
at Test.Main() in VariantTestBuiltInComDisabled.dll:token 0x600005e+0x34
Expected: 100
Actual: 101
END EXECUTION - FAILED

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me in the error log. I was able to find it afterwards. I see now only one error

 Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd [FAIL]
Return code: 1
Raw output file: C:\h\w\AF5C0958\w\B3E30948\e\Interop\PInvoke\Reports\Interop.PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.output.txt
Raw output:
BEGIN EXECUTION
"C:\h\w\AF5C0958\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestComWrappers.dll Test failed: TestLibrary.AssertTestException: Assert.IsTrue: at TestLibrary.Assert.HandleFail(String assertionName, String message) in TestLibrary.dll:token 0x6000021+0x11
at TestLibrary.Assert.IsTrue(Boolean condition, String message) in TestLibrary.dll:token 0x600000a+0x3
at Test.TestByValue(Boolean hasComSupport) in VariantTestComWrappers.dll:token 0x6000059+0x223
at Test.Main() in VariantTestComWrappers.dll:token 0x600005e+0xc
Invalid format. Expected VT_DISPATCH.

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

Comment threadsrc/tests/Interop/PInvoke/Variant/VariantTest.ComWrappers.cs Outdated
@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

@kant2002 It isn't clear to me which statement in the test is failing. Can you narrow it down to which one is the issue?

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT this line produce exception
https://github.com/dotnet/runtime/pull/53035/files#diff-1c679eb2a695bcba0de0c236544a305004b9e816151a677657a2528b2a039608R46
because there printed message from

printf("Invalid format. Expected VT_DISPATCH.\n");

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Honestly I did not run that. It's just reading logs. I'm yet to build single test project locally. Otherwise it's hard to me to allocate time (~1 hour). If you strictly need me to build, and validate my last statement, let me know. I will compile and troubleshoot in more details. But I think I point location to you properly.

@AaronRobinsonMSFT

AaronRobinsonMSFT commented May 25, 2021

Copy link
Copy Markdown
Member

@kant2002 The issue here is a bug in the ComWrappers conversion logic for IDispatch. It is a part of the absolute mess that is the OLE support and how enum values are used as both request and result – yuck.

In the both case we detect if IDispatch is implemented but don't reduce the returned enum value to just ComIpType_Dispatch but return the input - which is the request not the result. The solution here is to return either ComIpType_Dispatch or ComIpType_Unknown but not ComIpType_Both.

if (TryGetComIPFromObjectRefUsingComWrappers(*poref, &pUnk))
{
hr = S_OK;
IUnknown* pvObj;
if (ReqIpType & ComIpType_Dispatch)
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();
}
else
{
pvObj = pUnk;
}
if (FAILED(hr))
COMPlusThrowHR(hr);
if (pFetchedIpType != NULL)
*pFetchedIpType = ReqIpType;
RETURN pvObj;
}

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Should I fix that bug as part of PR?

Yes, that would be much appreciated.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT can you take a look?

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

Copy link
Copy Markdown
ContributorAuthor

Do not understand test failures. Please advice if this something which I'm responsible with?

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kant2002 I would take a step back here and walk through this logic more fully. I think there was some confusion on when this was originally written and support IDispatch has uncovered that in the ComWrappers scenario.

/cc @elinor-fung

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated
@@ -189,17 +189,26 @@ IUnknown *GetComIPFromObjectRef(OBJECTREF *poref, ComIpType ReqIpType, ComIpType
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Release shouldn't be called indiscriminately here. We are checking for IDispatch now and it could fail, but ComIpType_Unknown must still be returned. Move this release into the success path below.

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

kant2002 commented May 27, 2021

Copy link
Copy Markdown
ContributorAuthor

Do I understand correctly that in discussed part of code, I should follow these rules?

ReqIpType = ComIpType_Both

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

ReqIpType = ComIpType_IDispatch

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
COMPlusThrowHR(hr); // ????

ReqIpType = ComIpType_IUnknown

pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 Yes.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT is it possible that ComIpType_OuterUnknown would be passed to that location? Technically that will be handled by IUnknown case, but maybe there special processing needed.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 I don't think that ComIpType_OuterUnknown should be a concern here. The ComWrappers API does support aggregation but at present I am not sure how we would integrate at this point. I am okay not dealing with it at present.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT then can you take a look?

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you.

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 8538a75 into dotnet:mainMay 30, 2021
@kant2002
kant2002 deleted the kant/split-variant-test branch May 31, 2021 09:38
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kant2002@AaronRobinsonMSFT@LakshanF
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Split Variant marshalling tests - #53035

Merged
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test
May 30, 2021
Merged

Split Variant marshalling tests#53035
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test

Conversation

@kant2002

Copy link
Copy Markdown
Contributor

These tests split to be able test ComWrappers,
built-in COM enabled/disable mode.
See #50500, #51265

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Initially discovered as part of dotnet/runtimelab#1142
I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.
This PR to gather feedback on the implementation details, code split approach.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.

Adding a feature flag to a test project is the same as passing it in the product. See https://github.com/dotnet/runtime/pull/52940/files#diff-c25cd81bf60eaf73ca87747baafae7fbfd0ac8a787da03b22382eff45316c9e5 and look for RuntimeHostConfigurationOption.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

/cc @LakshanF@elinor-fung

@kant2002

Copy link
Copy Markdown
ContributorAuthor

I think I overcomplicate PR. I will revert changes, and will create couple projects in same folder. Seems to be that would be easier to maintain.

@LakshanF

Copy link
Copy Markdown
Contributor

@kant2002, thanks for taking a look! Please also take a look at some test changes that are already present for library, and the pending PR, #52940, that has some tests for the runtime.

@kant2002
kant2002force-pushed the kant/split-variant-test branch from 9f6bd1e to 024ce9bCompareMay 21, 2021 13:45
@kant2002
kant2002force-pushed the kant/split-variant-test branch from 024ce9b to 6fa61f1CompareMay 21, 2021 13:45
@kant2002

Copy link
Copy Markdown
ContributorAuthor

@LakshanF this changes just for Variant marshalling. Hopefully current version is in spirit of what was for #52940

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Build was failed, since results was not sent to Helix

@LakshanF

Copy link
Copy Markdown
Contributor

I see these 2 tests failing when built-in COM is disabled,

Interop\PInvoke\Variant\VariantTestBuiltInComDisabled\VariantTestBuiltInComDisabled.cmd
Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd

The first test has the following output,

BEGIN EXECUTION
"C:\h\w\AC52093C\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestBuiltInComDisabled.dll
Built-in COM Disabled?: True
Test failed: System.NotSupportedException: Built-in COM has been disabled via a feature switch. See https://aka.ms/dotnet-illink/com for more information.
at System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)
at VariantNative.Marshal_ByValue_Object(Object obj)
at Test.TestByValue(Boolean hasComSupport) in VariantTestBuiltInComDisabled.dll:token 0x6000059+0x223
at Test.Main() in VariantTestBuiltInComDisabled.dll:token 0x600005e+0x34
Expected: 100
Actual: 101
END EXECUTION - FAILED

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me in the error log. I was able to find it afterwards. I see now only one error

 Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd [FAIL]
Return code: 1
Raw output file: C:\h\w\AF5C0958\w\B3E30948\e\Interop\PInvoke\Reports\Interop.PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.output.txt
Raw output:
BEGIN EXECUTION
"C:\h\w\AF5C0958\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestComWrappers.dll Test failed: TestLibrary.AssertTestException: Assert.IsTrue: at TestLibrary.Assert.HandleFail(String assertionName, String message) in TestLibrary.dll:token 0x6000021+0x11
at TestLibrary.Assert.IsTrue(Boolean condition, String message) in TestLibrary.dll:token 0x600000a+0x3
at Test.TestByValue(Boolean hasComSupport) in VariantTestComWrappers.dll:token 0x6000059+0x223
at Test.Main() in VariantTestComWrappers.dll:token 0x600005e+0xc
Invalid format. Expected VT_DISPATCH.

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

Comment threadsrc/tests/Interop/PInvoke/Variant/VariantTest.ComWrappers.cs Outdated
@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

@kant2002 It isn't clear to me which statement in the test is failing. Can you narrow it down to which one is the issue?

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT this line produce exception
https://github.com/dotnet/runtime/pull/53035/files#diff-1c679eb2a695bcba0de0c236544a305004b9e816151a677657a2528b2a039608R46
because there printed message from

printf("Invalid format. Expected VT_DISPATCH.\n");

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Honestly I did not run that. It's just reading logs. I'm yet to build single test project locally. Otherwise it's hard to me to allocate time (~1 hour). If you strictly need me to build, and validate my last statement, let me know. I will compile and troubleshoot in more details. But I think I point location to you properly.

@AaronRobinsonMSFT

AaronRobinsonMSFT commented May 25, 2021

Copy link
Copy Markdown
Member

@kant2002 The issue here is a bug in the ComWrappers conversion logic for IDispatch. It is a part of the absolute mess that is the OLE support and how enum values are used as both request and result – yuck.

In the both case we detect if IDispatch is implemented but don't reduce the returned enum value to just ComIpType_Dispatch but return the input - which is the request not the result. The solution here is to return either ComIpType_Dispatch or ComIpType_Unknown but not ComIpType_Both.

if (TryGetComIPFromObjectRefUsingComWrappers(*poref, &pUnk))
{
hr = S_OK;
IUnknown* pvObj;
if (ReqIpType & ComIpType_Dispatch)
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();
}
else
{
pvObj = pUnk;
}
if (FAILED(hr))
COMPlusThrowHR(hr);
if (pFetchedIpType != NULL)
*pFetchedIpType = ReqIpType;
RETURN pvObj;
}

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Should I fix that bug as part of PR?

Yes, that would be much appreciated.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT can you take a look?

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

Copy link
Copy Markdown
ContributorAuthor

Do not understand test failures. Please advice if this something which I'm responsible with?

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kant2002 I would take a step back here and walk through this logic more fully. I think there was some confusion on when this was originally written and support IDispatch has uncovered that in the ComWrappers scenario.

/cc @elinor-fung

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated
@@ -189,17 +189,26 @@ IUnknown *GetComIPFromObjectRef(OBJECTREF *poref, ComIpType ReqIpType, ComIpType
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Release shouldn't be called indiscriminately here. We are checking for IDispatch now and it could fail, but ComIpType_Unknown must still be returned. Move this release into the success path below.

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

kant2002 commented May 27, 2021

Copy link
Copy Markdown
ContributorAuthor

Do I understand correctly that in discussed part of code, I should follow these rules?

ReqIpType = ComIpType_Both

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

ReqIpType = ComIpType_IDispatch

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
COMPlusThrowHR(hr); // ????

ReqIpType = ComIpType_IUnknown

pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 Yes.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT is it possible that ComIpType_OuterUnknown would be passed to that location? Technically that will be handled by IUnknown case, but maybe there special processing needed.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 I don't think that ComIpType_OuterUnknown should be a concern here. The ComWrappers API does support aggregation but at present I am not sure how we would integrate at this point. I am okay not dealing with it at present.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT then can you take a look?

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you.

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 8538a75 into dotnet:mainMay 30, 2021
@kant2002
kant2002 deleted the kant/split-variant-test branch May 31, 2021 09:38
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kant2002@AaronRobinsonMSFT@LakshanF
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Split Variant marshalling tests - #53035

Merged
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test
May 30, 2021
Merged

Split Variant marshalling tests#53035
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test

Conversation

@kant2002

Copy link
Copy Markdown
Contributor

These tests split to be able test ComWrappers,
built-in COM enabled/disable mode.
See #50500, #51265

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Initially discovered as part of dotnet/runtimelab#1142
I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.
This PR to gather feedback on the implementation details, code split approach.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.

Adding a feature flag to a test project is the same as passing it in the product. See https://github.com/dotnet/runtime/pull/52940/files#diff-c25cd81bf60eaf73ca87747baafae7fbfd0ac8a787da03b22382eff45316c9e5 and look for RuntimeHostConfigurationOption.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

/cc @LakshanF@elinor-fung

@kant2002

Copy link
Copy Markdown
ContributorAuthor

I think I overcomplicate PR. I will revert changes, and will create couple projects in same folder. Seems to be that would be easier to maintain.

@LakshanF

Copy link
Copy Markdown
Contributor

@kant2002, thanks for taking a look! Please also take a look at some test changes that are already present for library, and the pending PR, #52940, that has some tests for the runtime.

@kant2002
kant2002force-pushed the kant/split-variant-test branch from 9f6bd1e to 024ce9bCompareMay 21, 2021 13:45
@kant2002
kant2002force-pushed the kant/split-variant-test branch from 024ce9b to 6fa61f1CompareMay 21, 2021 13:45
@kant2002

Copy link
Copy Markdown
ContributorAuthor

@LakshanF this changes just for Variant marshalling. Hopefully current version is in spirit of what was for #52940

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Build was failed, since results was not sent to Helix

@LakshanF

Copy link
Copy Markdown
Contributor

I see these 2 tests failing when built-in COM is disabled,

Interop\PInvoke\Variant\VariantTestBuiltInComDisabled\VariantTestBuiltInComDisabled.cmd
Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd

The first test has the following output,

BEGIN EXECUTION
"C:\h\w\AC52093C\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestBuiltInComDisabled.dll
Built-in COM Disabled?: True
Test failed: System.NotSupportedException: Built-in COM has been disabled via a feature switch. See https://aka.ms/dotnet-illink/com for more information.
at System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)
at VariantNative.Marshal_ByValue_Object(Object obj)
at Test.TestByValue(Boolean hasComSupport) in VariantTestBuiltInComDisabled.dll:token 0x6000059+0x223
at Test.Main() in VariantTestBuiltInComDisabled.dll:token 0x600005e+0x34
Expected: 100
Actual: 101
END EXECUTION - FAILED

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me in the error log. I was able to find it afterwards. I see now only one error

 Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd [FAIL]
Return code: 1
Raw output file: C:\h\w\AF5C0958\w\B3E30948\e\Interop\PInvoke\Reports\Interop.PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.output.txt
Raw output:
BEGIN EXECUTION
"C:\h\w\AF5C0958\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestComWrappers.dll Test failed: TestLibrary.AssertTestException: Assert.IsTrue: at TestLibrary.Assert.HandleFail(String assertionName, String message) in TestLibrary.dll:token 0x6000021+0x11
at TestLibrary.Assert.IsTrue(Boolean condition, String message) in TestLibrary.dll:token 0x600000a+0x3
at Test.TestByValue(Boolean hasComSupport) in VariantTestComWrappers.dll:token 0x6000059+0x223
at Test.Main() in VariantTestComWrappers.dll:token 0x600005e+0xc
Invalid format. Expected VT_DISPATCH.

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

Comment threadsrc/tests/Interop/PInvoke/Variant/VariantTest.ComWrappers.cs Outdated
@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

@kant2002 It isn't clear to me which statement in the test is failing. Can you narrow it down to which one is the issue?

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT this line produce exception
https://github.com/dotnet/runtime/pull/53035/files#diff-1c679eb2a695bcba0de0c236544a305004b9e816151a677657a2528b2a039608R46
because there printed message from

printf("Invalid format. Expected VT_DISPATCH.\n");

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Honestly I did not run that. It's just reading logs. I'm yet to build single test project locally. Otherwise it's hard to me to allocate time (~1 hour). If you strictly need me to build, and validate my last statement, let me know. I will compile and troubleshoot in more details. But I think I point location to you properly.

@AaronRobinsonMSFT

AaronRobinsonMSFT commented May 25, 2021

Copy link
Copy Markdown
Member

@kant2002 The issue here is a bug in the ComWrappers conversion logic for IDispatch. It is a part of the absolute mess that is the OLE support and how enum values are used as both request and result – yuck.

In the both case we detect if IDispatch is implemented but don't reduce the returned enum value to just ComIpType_Dispatch but return the input - which is the request not the result. The solution here is to return either ComIpType_Dispatch or ComIpType_Unknown but not ComIpType_Both.

if (TryGetComIPFromObjectRefUsingComWrappers(*poref, &pUnk))
{
hr = S_OK;
IUnknown* pvObj;
if (ReqIpType & ComIpType_Dispatch)
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();
}
else
{
pvObj = pUnk;
}
if (FAILED(hr))
COMPlusThrowHR(hr);
if (pFetchedIpType != NULL)
*pFetchedIpType = ReqIpType;
RETURN pvObj;
}

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Should I fix that bug as part of PR?

Yes, that would be much appreciated.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT can you take a look?

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

Copy link
Copy Markdown
ContributorAuthor

Do not understand test failures. Please advice if this something which I'm responsible with?

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kant2002 I would take a step back here and walk through this logic more fully. I think there was some confusion on when this was originally written and support IDispatch has uncovered that in the ComWrappers scenario.

/cc @elinor-fung

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated
@@ -189,17 +189,26 @@ IUnknown *GetComIPFromObjectRef(OBJECTREF *poref, ComIpType ReqIpType, ComIpType
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Release shouldn't be called indiscriminately here. We are checking for IDispatch now and it could fail, but ComIpType_Unknown must still be returned. Move this release into the success path below.

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

kant2002 commented May 27, 2021

Copy link
Copy Markdown
ContributorAuthor

Do I understand correctly that in discussed part of code, I should follow these rules?

ReqIpType = ComIpType_Both

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

ReqIpType = ComIpType_IDispatch

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
COMPlusThrowHR(hr); // ????

ReqIpType = ComIpType_IUnknown

pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 Yes.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT is it possible that ComIpType_OuterUnknown would be passed to that location? Technically that will be handled by IUnknown case, but maybe there special processing needed.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 I don't think that ComIpType_OuterUnknown should be a concern here. The ComWrappers API does support aggregation but at present I am not sure how we would integrate at this point. I am okay not dealing with it at present.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT then can you take a look?

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you.

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 8538a75 into dotnet:mainMay 30, 2021
@kant2002
kant2002 deleted the kant/split-variant-test branch May 31, 2021 09:38
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kant2002@AaronRobinsonMSFT@LakshanF
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Split Variant marshalling tests - #53035

Merged
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test
May 30, 2021
Merged

Split Variant marshalling tests#53035
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test

Conversation

@kant2002

Copy link
Copy Markdown
Contributor

These tests split to be able test ComWrappers,
built-in COM enabled/disable mode.
See #50500, #51265

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Initially discovered as part of dotnet/runtimelab#1142
I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.
This PR to gather feedback on the implementation details, code split approach.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.

Adding a feature flag to a test project is the same as passing it in the product. See https://github.com/dotnet/runtime/pull/52940/files#diff-c25cd81bf60eaf73ca87747baafae7fbfd0ac8a787da03b22382eff45316c9e5 and look for RuntimeHostConfigurationOption.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

/cc @LakshanF@elinor-fung

@kant2002

Copy link
Copy Markdown
ContributorAuthor

I think I overcomplicate PR. I will revert changes, and will create couple projects in same folder. Seems to be that would be easier to maintain.

@LakshanF

Copy link
Copy Markdown
Contributor

@kant2002, thanks for taking a look! Please also take a look at some test changes that are already present for library, and the pending PR, #52940, that has some tests for the runtime.

@kant2002
kant2002force-pushed the kant/split-variant-test branch from 9f6bd1e to 024ce9bCompareMay 21, 2021 13:45
@kant2002
kant2002force-pushed the kant/split-variant-test branch from 024ce9b to 6fa61f1CompareMay 21, 2021 13:45
@kant2002

Copy link
Copy Markdown
ContributorAuthor

@LakshanF this changes just for Variant marshalling. Hopefully current version is in spirit of what was for #52940

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Build was failed, since results was not sent to Helix

@LakshanF

Copy link
Copy Markdown
Contributor

I see these 2 tests failing when built-in COM is disabled,

Interop\PInvoke\Variant\VariantTestBuiltInComDisabled\VariantTestBuiltInComDisabled.cmd
Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd

The first test has the following output,

BEGIN EXECUTION
"C:\h\w\AC52093C\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestBuiltInComDisabled.dll
Built-in COM Disabled?: True
Test failed: System.NotSupportedException: Built-in COM has been disabled via a feature switch. See https://aka.ms/dotnet-illink/com for more information.
at System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)
at VariantNative.Marshal_ByValue_Object(Object obj)
at Test.TestByValue(Boolean hasComSupport) in VariantTestBuiltInComDisabled.dll:token 0x6000059+0x223
at Test.Main() in VariantTestBuiltInComDisabled.dll:token 0x600005e+0x34
Expected: 100
Actual: 101
END EXECUTION - FAILED

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me in the error log. I was able to find it afterwards. I see now only one error

 Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd [FAIL]
Return code: 1
Raw output file: C:\h\w\AF5C0958\w\B3E30948\e\Interop\PInvoke\Reports\Interop.PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.output.txt
Raw output:
BEGIN EXECUTION
"C:\h\w\AF5C0958\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestComWrappers.dll Test failed: TestLibrary.AssertTestException: Assert.IsTrue: at TestLibrary.Assert.HandleFail(String assertionName, String message) in TestLibrary.dll:token 0x6000021+0x11
at TestLibrary.Assert.IsTrue(Boolean condition, String message) in TestLibrary.dll:token 0x600000a+0x3
at Test.TestByValue(Boolean hasComSupport) in VariantTestComWrappers.dll:token 0x6000059+0x223
at Test.Main() in VariantTestComWrappers.dll:token 0x600005e+0xc
Invalid format. Expected VT_DISPATCH.

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

Comment threadsrc/tests/Interop/PInvoke/Variant/VariantTest.ComWrappers.cs Outdated
@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

@kant2002 It isn't clear to me which statement in the test is failing. Can you narrow it down to which one is the issue?

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT this line produce exception
https://github.com/dotnet/runtime/pull/53035/files#diff-1c679eb2a695bcba0de0c236544a305004b9e816151a677657a2528b2a039608R46
because there printed message from

printf("Invalid format. Expected VT_DISPATCH.\n");

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Honestly I did not run that. It's just reading logs. I'm yet to build single test project locally. Otherwise it's hard to me to allocate time (~1 hour). If you strictly need me to build, and validate my last statement, let me know. I will compile and troubleshoot in more details. But I think I point location to you properly.

@AaronRobinsonMSFT

AaronRobinsonMSFT commented May 25, 2021

Copy link
Copy Markdown
Member

@kant2002 The issue here is a bug in the ComWrappers conversion logic for IDispatch. It is a part of the absolute mess that is the OLE support and how enum values are used as both request and result – yuck.

In the both case we detect if IDispatch is implemented but don't reduce the returned enum value to just ComIpType_Dispatch but return the input - which is the request not the result. The solution here is to return either ComIpType_Dispatch or ComIpType_Unknown but not ComIpType_Both.

if (TryGetComIPFromObjectRefUsingComWrappers(*poref, &pUnk))
{
hr = S_OK;
IUnknown* pvObj;
if (ReqIpType & ComIpType_Dispatch)
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();
}
else
{
pvObj = pUnk;
}
if (FAILED(hr))
COMPlusThrowHR(hr);
if (pFetchedIpType != NULL)
*pFetchedIpType = ReqIpType;
RETURN pvObj;
}

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Should I fix that bug as part of PR?

Yes, that would be much appreciated.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT can you take a look?

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

Copy link
Copy Markdown
ContributorAuthor

Do not understand test failures. Please advice if this something which I'm responsible with?

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kant2002 I would take a step back here and walk through this logic more fully. I think there was some confusion on when this was originally written and support IDispatch has uncovered that in the ComWrappers scenario.

/cc @elinor-fung

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated
@@ -189,17 +189,26 @@ IUnknown *GetComIPFromObjectRef(OBJECTREF *poref, ComIpType ReqIpType, ComIpType
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Release shouldn't be called indiscriminately here. We are checking for IDispatch now and it could fail, but ComIpType_Unknown must still be returned. Move this release into the success path below.

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

kant2002 commented May 27, 2021

Copy link
Copy Markdown
ContributorAuthor

Do I understand correctly that in discussed part of code, I should follow these rules?

ReqIpType = ComIpType_Both

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

ReqIpType = ComIpType_IDispatch

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
COMPlusThrowHR(hr); // ????

ReqIpType = ComIpType_IUnknown

pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 Yes.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT is it possible that ComIpType_OuterUnknown would be passed to that location? Technically that will be handled by IUnknown case, but maybe there special processing needed.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 I don't think that ComIpType_OuterUnknown should be a concern here. The ComWrappers API does support aggregation but at present I am not sure how we would integrate at this point. I am okay not dealing with it at present.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT then can you take a look?

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you.

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 8538a75 into dotnet:mainMay 30, 2021
@kant2002
kant2002 deleted the kant/split-variant-test branch May 31, 2021 09:38
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kant2002@AaronRobinsonMSFT@LakshanF
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Split Variant marshalling tests - #53035

Merged
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test
May 30, 2021
Merged

Split Variant marshalling tests#53035
AaronRobinsonMSFT merged 9 commits into
dotnet:mainfrom
kant2002:kant/split-variant-test

Conversation

@kant2002

Copy link
Copy Markdown
Contributor

These tests split to be able test ComWrappers,
built-in COM enabled/disable mode.
See #50500, #51265

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Initially discovered as part of dotnet/runtimelab#1142
I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.
This PR to gather feedback on the implementation details, code split approach.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

I do not know how to pass IsComSupported to test and how to read. Would like that somebody help me with that.

Adding a feature flag to a test project is the same as passing it in the product. See https://github.com/dotnet/runtime/pull/52940/files#diff-c25cd81bf60eaf73ca87747baafae7fbfd0ac8a787da03b22382eff45316c9e5 and look for RuntimeHostConfigurationOption.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

/cc @LakshanF@elinor-fung

@kant2002

Copy link
Copy Markdown
ContributorAuthor

I think I overcomplicate PR. I will revert changes, and will create couple projects in same folder. Seems to be that would be easier to maintain.

@LakshanF

Copy link
Copy Markdown
Contributor

@kant2002, thanks for taking a look! Please also take a look at some test changes that are already present for library, and the pending PR, #52940, that has some tests for the runtime.

@kant2002
kant2002force-pushed the kant/split-variant-test branch from 9f6bd1e to 024ce9bCompareMay 21, 2021 13:45
@kant2002
kant2002force-pushed the kant/split-variant-test branch from 024ce9b to 6fa61f1CompareMay 21, 2021 13:45
@kant2002

Copy link
Copy Markdown
ContributorAuthor

@LakshanF this changes just for Variant marshalling. Hopefully current version is in spirit of what was for #52940

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Build was failed, since results was not sent to Helix

@LakshanF

Copy link
Copy Markdown
Contributor

I see these 2 tests failing when built-in COM is disabled,

Interop\PInvoke\Variant\VariantTestBuiltInComDisabled\VariantTestBuiltInComDisabled.cmd
Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd

The first test has the following output,

BEGIN EXECUTION
"C:\h\w\AC52093C\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestBuiltInComDisabled.dll
Built-in COM Disabled?: True
Test failed: System.NotSupportedException: Built-in COM has been disabled via a feature switch. See https://aka.ms/dotnet-illink/com for more information.
at System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)
at VariantNative.Marshal_ByValue_Object(Object obj)
at Test.TestByValue(Boolean hasComSupport) in VariantTestBuiltInComDisabled.dll:token 0x6000059+0x223
at Test.Main() in VariantTestBuiltInComDisabled.dll:token 0x600005e+0x34
Expected: 100
Actual: 101
END EXECUTION - FAILED

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me in the error log. I was able to find it afterwards. I see now only one error

 Interop\PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.cmd [FAIL]
Return code: 1
Raw output file: C:\h\w\AF5C0958\w\B3E30948\e\Interop\PInvoke\Reports\Interop.PInvoke\Variant\VariantTestComWrappers\VariantTestComWrappers.output.txt
Raw output:
BEGIN EXECUTION
"C:\h\w\AF5C0958\p\corerun.exe" -p "System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false" VariantTestComWrappers.dll Test failed: TestLibrary.AssertTestException: Assert.IsTrue: at TestLibrary.Assert.HandleFail(String assertionName, String message) in TestLibrary.dll:token 0x6000021+0x11
at TestLibrary.Assert.IsTrue(Boolean condition, String message) in TestLibrary.dll:token 0x600000a+0x3
at Test.TestByValue(Boolean hasComSupport) in VariantTestComWrappers.dll:token 0x6000059+0x223
at Test.Main() in VariantTestComWrappers.dll:token 0x600005e+0xc
Invalid format. Expected VT_DISPATCH.

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

Comment threadsrc/tests/Interop/PInvoke/Variant/VariantTest.ComWrappers.cs Outdated
@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Does that means that ComWrappers has slightly different marshalling, or this is a bug? Should I fix that bug as part of PR?

@kant2002 It isn't clear to me which statement in the test is failing. Can you narrow it down to which one is the issue?

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT this line produce exception
https://github.com/dotnet/runtime/pull/53035/files#diff-1c679eb2a695bcba0de0c236544a305004b9e816151a677657a2528b2a039608R46
because there printed message from

printf("Invalid format. Expected VT_DISPATCH.\n");

@kant2002

Copy link
Copy Markdown
ContributorAuthor

Honestly I did not run that. It's just reading logs. I'm yet to build single test project locally. Otherwise it's hard to me to allocate time (~1 hour). If you strictly need me to build, and validate my last statement, let me know. I will compile and troubleshoot in more details. But I think I point location to you properly.

@AaronRobinsonMSFT

AaronRobinsonMSFT commented May 25, 2021

Copy link
Copy Markdown
Member

@kant2002 The issue here is a bug in the ComWrappers conversion logic for IDispatch. It is a part of the absolute mess that is the OLE support and how enum values are used as both request and result – yuck.

In the both case we detect if IDispatch is implemented but don't reduce the returned enum value to just ComIpType_Dispatch but return the input - which is the request not the result. The solution here is to return either ComIpType_Dispatch or ComIpType_Unknown but not ComIpType_Both.

if (TryGetComIPFromObjectRefUsingComWrappers(*poref, &pUnk))
{
hr = S_OK;
IUnknown* pvObj;
if (ReqIpType & ComIpType_Dispatch)
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();
}
else
{
pvObj = pUnk;
}
if (FAILED(hr))
COMPlusThrowHR(hr);
if (pFetchedIpType != NULL)
*pFetchedIpType = ReqIpType;
RETURN pvObj;
}

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Should I fix that bug as part of PR?

Yes, that would be much appreciated.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT can you take a look?

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

Copy link
Copy Markdown
ContributorAuthor

Do not understand test failures. Please advice if this something which I'm responsible with?

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kant2002 I would take a step back here and walk through this logic more fully. I think there was some confusion on when this was originally written and support IDispatch has uncovered that in the ComWrappers scenario.

/cc @elinor-fung

Comment threadsrc/coreclr/vm/interopconverter.cpp Outdated
@@ -189,17 +189,26 @@ IUnknown *GetComIPFromObjectRef(OBJECTREF *poref, ComIpType ReqIpType, ComIpType
{
hr = SafeQueryInterface(pUnk, IID_IDispatch, &pvObj);
pUnk->Release();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Release shouldn't be called indiscriminately here. We are checking for IDispatch now and it could fail, but ComIpType_Unknown must still be returned. Move this release into the success path below.

Comment threadsrc/coreclr/vm/interopconverter.cpp
@kant2002

kant2002 commented May 27, 2021

Copy link
Copy Markdown
ContributorAuthor

Do I understand correctly that in discussed part of code, I should follow these rules?

ReqIpType = ComIpType_Both

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

ReqIpType = ComIpType_IDispatch

  1. QI to IDispatch - ok
pUnk->Release();
FetchedIpType = ComIpType_Dispatch;
  1. QI to IDispatch - failed
COMPlusThrowHR(hr); // ????

ReqIpType = ComIpType_IUnknown

pvObj = pUnk;
FetchedIpType = ComIpType_Unknown;

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 Yes.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT is it possible that ComIpType_OuterUnknown would be passed to that location? Technically that will be handled by IUnknown case, but maybe there special processing needed.

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

@kant2002 I don't think that ComIpType_OuterUnknown should be a concern here. The ComWrappers API does support aggregation but at present I am not sure how we would integrate at this point. I am okay not dealing with it at present.

@kant2002

Copy link
Copy Markdown
ContributorAuthor

@AaronRobinsonMSFT then can you take a look?

@AaronRobinsonMSFTAaronRobinsonMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you.

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 8538a75 into dotnet:mainMay 30, 2021
@kant2002
kant2002 deleted the kant/split-variant-test branch May 31, 2021 09:38
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kant2002@AaronRobinsonMSFT@LakshanF