Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update Xunit.StaFact to include bugfixes #3276

Merged
merged 5 commits into from
May 26, 2020
Merged

Conversation

weltkante
Copy link
Contributor

@weltkante weltkante commented May 13, 2020

Fixes #3122

Proposed changes

Update Xunit.StaFact package to consume bugfixes made upstream

Customer Impact

None, test infrastructure only

Regression?

No

Risk

Unknown issues may be introdcued by updating 3rd party packages, but getting fixes for already known issues should outweight that risk.

Before

Unable to run WinFormsTheory with complex MemberData inside VS

After

Able to run WinFormsTheory with complex MemberData inside VS

(+ various other fixes I don't know exactly how to test for, like calling OleRequired to initialize OLE on the STA thread)

Test methodology

Making sure one of the known issues is actually fixed. I didn't explicitly test for other fixes that have been merged.

Test environment

local

Microsoft Reviewers: Open in CodeFlow

@weltkante
Copy link
Contributor Author

weltkante commented May 13, 2020

Both tests timed out, any screenshots or other hint what was hanging? (I don't think I have access to these build artifacts)

@RussKie
Copy link
Member

RussKie commented May 15, 2020

I pulled down your branch, and run it locally build -test - the tests deadlocked and chewed ~25% of CPU
image

[EDIT]
Got a better view by inspecting a memory dump:

Not Flagged		26344	0	Main Thread	Main Thread	
Not Flagged		676	0	Worker Thread	<No Name>	
Not Flagged		1876	0	Worker Thread	.NET Finalizer	
Not Flagged		17572	0	Worker Thread	<No Name>	
Not Flagged		22236	0	Worker Thread	.NET Timer	
Not Flagged	>	19184	0	Worker Thread	.NET SystemEvents	Microsoft.Win32.SystemEvents.dll!Microsoft.Win32.SystemEvents.WindowThreadProc
Not Flagged		8340	0	Worker Thread	<No Name>	
Not Flagged		26160	0	Worker Thread	System.Windows.Forms.Design.Editors.Tests.EnsureEditorsTests.EnsureUITypeEditorForProperty	System.Private.CoreLib.dll!System.Number.TryFormatUInt64.__TryFormatUInt64Slow|39_0
Not Flagged		25692	0	Worker Thread	System.Windows.Forms.Design.Editors.Tests.EnsureEditorsTests.EnsureUITypeEditorForType	
Not Flagged		7428	0	Worker Thread	System.Windows.Forms.Design.Editors.Tests.EnsureEditorsTests.EnsureUITypeEditorForMethod	System.Private.CoreLib.dll!System.Text.ValueStringBuilder.AppendFormatHelper
Not Flagged		7996	0	Worker Thread	<No Name>	
Not Flagged		23648	0	Worker Thread	<No Name>	

These have stack traces available, and I suspect these busily chew the CPU

Not Flagged	>	19184	0	Worker Thread	.NET SystemEvents	Microsoft.Win32.SystemEvents.dll!Microsoft.Win32.SystemEvents.WindowThreadProc
Not Flagged		26160	0	Worker Thread	System.Windows.Forms.Design.Editors.Tests.EnsureEditorsTests.EnsureUITypeEditorForProperty	System.Private.CoreLib.dll!System.Number.TryFormatUInt64.__TryFormatUInt64Slow|39_0
Not Flagged		7428	0	Worker Thread	System.Windows.Forms.Design.Editors.Tests.EnsureEditorsTests.EnsureUITypeEditorForMethod	System.Private.CoreLib.dll!System.Text.ValueStringBuilder.AppendFormatHelper

This one doesn't have a stack trace available, I guess this one is what's locking up...

Not Flagged		25692	0	Worker Thread	System.Windows.Forms.Design.Editors.Tests.EnsureEditorsTests.EnsureUITypeEditorForType	

@weltkante
Copy link
Contributor Author

Thanks, I'll have a look

@weltkante
Copy link
Contributor Author

weltkante commented May 15, 2020

The three EnsureEditorsTests look like they finished but xunit/stafact is not recognizing it and still waiting for them. This only happens when running tests via build.cmd (arcade?) command line scripts, using dotnet test or running tests inside VS does not hang.

The CPU usage is a polling message loop, can be easily fixed on stafact side, but it doesn't affect the hang.

More notes in the issue for this PR, I also created stafact issues for further investigation.

@weltkante
Copy link
Contributor Author

Updating the package fails due to #3297, I've commented out the offending tests (can revert that if #3297 is fixed before this is merged), that did let the tests pass locally, we'll see how CI does.

PS: Skipping them doesn't work for weird reasons I don't understand, xunit complains about missing theory parameters on the skipped test, at least on my local run.

@weltkante
Copy link
Contributor Author

CI build seems to be still hanging even with the bugfixes, not sure how to diagnose, cannot reproduce locally. I opened #3298 as one suggestion how to diagnose these hangs better.

Copy link
Member

@RussKie RussKie left a comment

Choose a reason for hiding this comment

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

Happy to update, please skip tests instead of commenting out

@ghost ghost added the 📭 waiting-author-feedback The team requires more information from the author label May 18, 2020
@RussKie RussKie added the test-bug Problem in test source code (most likely) label May 18, 2020
@ghost ghost removed the 📭 waiting-author-feedback The team requires more information from the author label May 18, 2020
RussKie
RussKie previously approved these changes May 18, 2020
@RussKie
Copy link
Member

RussKie commented May 19, 2020

I commented out EnsureEditorsTests locally and ran tests in 392b013. They locked up again, this time here:

image

image

Not Flagged		51804	0	Worker Thread	.NET ThreadPool Worker	
Not Flagged		22228	0	Main Thread	Main Thread	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitOneNoCheck
Not Flagged		14776	0	Worker Thread	<No Name>	
Not Flagged		6516	0	Worker Thread	.NET Finalizer	
Not Flagged		20420	0	Worker Thread	<No Name>	
Not Flagged		712	0	Worker Thread	.NET Timer	
Not Flagged		13980	0	Worker Thread	<No Name>	
Not Flagged		20572	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitOneNoCheck
Not Flagged		20556	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		18092	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		18436	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		5620	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		21576	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		14048	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		21584	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		19260	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		3872	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		19860	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		16880	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		15144	0	Worker Thread	<No Name>	System.Private.CoreLib.dll!System.Threading.WaitHandle.WaitMultiple
Not Flagged		19128	0	Worker Thread	<No Name>	
Not Flagged		22692	0	Worker Thread	.NET SystemEvents	Microsoft.Win32.SystemEvents.dll!Microsoft.Win32.SystemEvents.WindowThreadProc
Not Flagged		35220	0	Worker Thread	<No Name>	
Not Flagged		35240	0	Worker Thread	.NET ThreadPool Worker	
Not Flagged		35276	0	Worker Thread	<No Name>	
Not Flagged	>	43188	0	Worker Thread	System.Windows.Forms.Tests.ControlTests.Control_DoDragDrop	System.Windows.Forms.dll!System.Windows.Forms.Control.DoDragDrop
Not Flagged		37740	0	Worker Thread	<No Name>	
Not Flagged		8808	0	Worker Thread	<No Name>	

@RussKie
Copy link
Member

RussKie commented May 19, 2020

These tests also started failing:

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_CreateInstance_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(39,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_CreateInstance_Invoke_Success()

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetDllEntry_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(81,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetDllEntry_Invoke_Success()

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_AddressOfMember_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(23,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_AddressOfMember_Invoke_Success()

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetMops_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(196,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetMops_Invoke_Success()

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetRefTypeInfo_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(236,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetRefTypeInfo_Invoke_Success()

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetFuncDesc_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(123,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetFuncDesc_Invoke_Success()

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_Invoke_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(368,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_Invoke_Invoke_Success()

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetIDsOfNames_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(159,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_GetIDsOfNames_Invoke_Success()

@RussKie
Copy link
Member

RussKie commented May 19, 2020

Once I have skipped Control_DoDragDrop - the tests completed successfully (i.e. the test process exited, some tests still failed).

I have also replaced InFormsFact with StaFact in ITypeInfoTests and they too all but one succeeded:

    System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_CreateInstance_Invoke_Success [FAIL]
      System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.
      Stack Trace:
           at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
           at Interop.Oleaut32.IDispatch.GetTypeInfo(UInt32 iTInfo, UInt32 lcid, ITypeInfo& ppTInfo)
        C:\Development\winforms\src\System.Windows.Forms.Primitives\tests\Interop\Oleaut32\ITypeInfoTests.cs(39,0): at System.Windows.Forms.Primitives.Tests.Interop.Oleaut32.ITypeInfoTests.ITypeInfo_CreateInstance_Invoke_Success()

I can't see what is so special about this test, all other tests have exactly the same arrangement to the same line...

@weltkante
Copy link
Contributor Author

weltkante commented May 19, 2020

22692 0 Worker Thread .NET SystemEvents Microsoft.Win32.SystemEvents.dll!Microsoft.Win32.SystemEvents.WindowThreadProc

SystemEvents had reliability issues because it creates a global HWND (outside WinForms codebase) on the first STA thread using it, ignoring the possibility that thread may shut down before the process exits. I didn't follow it closely but has something been turned to skipping in response to #3254 ? If not then this is probably a hang unrelated to upgrading xunit.stafact - the change in stafact implementation may just change the rate at which this triggers. Odd that it didn't trigger locally for me, did several test runs, none were hanging.

I'll try to identify responsible tests and mark them skipped, seeing if that makes CI stop hanging.

These tests also started failing:

I'll have to look into that and see if that fails locally. Not having clean test runs due to reliance on english locale makes it hard to notice new failures.

@weltkante
Copy link
Contributor Author

weltkante commented May 19, 2020

I didn't follow it closely but has something been turned to skipping in response to #3254 ?

The offending test seems to have been skipped, not sure about whether the hangs are related to SystemEvents. The thread seems to be in WndProc so that indicates it has a message loop, might be a false alarm. Still can't reproduce any hang locally.

System.Runtime.InteropServices.InvalidComObjectException : COM object that has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.

To my knowledge this only happens when you make inappropriate use of Marshal.ReleaseComObject or Marshal.FinalReleaseComObject, the exception indicates that the RCW got "disposed" but you still kept a reference around and are calling methods on it.

However when looking at the call chains this doesn't make any sense at all, nobody is calling either of those methods from what I can tell.

So I suspect its more likely related to these tests being flaky and previously being observed throwing ComException(E_FAIL) - my suspicion was that it has to do with the apartment they were called on, maybe they now fail slightly differently after updating xunit.stafact. Trying to switch them to WinFormsFact to see if that helps. WinFormsFact now calls OleRequired so if I'm right and OLE Initialization is the problem then it should stop being flaky. [edit] wasn't the reason

@weltkante
Copy link
Contributor Author

weltkante commented May 19, 2020

Trying to switch them to WinFormsFact to see if that helps. WinFormsFact now calls OleRequired so if I'm right and OLE Initialization is the problem then it should stop being flaky.

Not helping, still failing on STA threads with property disabled OLE, disabling those tests and creating an issue, this needs technical investigation, its beyond my level of expertise.

Also getting flaky clipboard tests. Multithreaded clipboard tests are silly, its a machine wide resource, tests are running over each other, disabling them as well to get the update passing CI in a stable way [edit] I'll not be skipping them just yet since I'm not sure if they are actually executed multithreaded, might have been some other influence interfering here

@weltkante
Copy link
Contributor Author

weltkante commented May 19, 2020

Cannot figure out whats up with that failing clipboard test. It seems consistent and not flaky. The test is a bit fishy by testing the clipboard before putting the text there, but I'd still have assumed VB and WinForms return consistent results (and they do locally, cannot reproduce CI failures)

@weltkante
Copy link
Contributor Author

The last puzzle piece that seems to be missing is that the [Collection("Sequential")] attribute is apparently broken now. Makes the test flaky and fail 1 out of 10 runs locally.

@weltkante
Copy link
Contributor Author

weltkante commented May 22, 2020

Rebased for second ITypeInfo PR and also removed some changes from WIP commit to start figuring out which of those changes are still significant.

@weltkante
Copy link
Contributor Author

weltkante commented May 22, 2020

DoDragDrop tests are definitely still hanging. Not sure if its good to have them either, they should be integration tests instead as proper drag'n'drop tests needs mouse interaction, otherwise OLE probably exits out very early. These tests basically just cover a failure case which in practice nobody is interested in (and can easily covered by the integration test as well). Sure its useful to ensure that a noop failure case stays a noop failure case but it may give a false sense of test coverage.

Not creating an issue yet, but if this still hangs after fixing the sequential execution in xunit.stafact I'd suggest removing them from unit tests and building an integration test instead.

@weltkante
Copy link
Contributor Author

This is weird, the last two CI runs have been passing. Not sure what changed since then.

I'm going to start removing skips and/or creating issues for them if we have to keep them.

@codecov
Copy link

codecov bot commented May 23, 2020

Codecov Report

Merging #3276 into master will increase coverage by 33.94867%.
The diff coverage is 100.00000%.

@@                 Coverage Diff                  @@
##              master       #3276          +/-   ##
====================================================
+ Coverage   64.68177%   98.63044%   +33.94866%     
====================================================
  Files           1318         430         -888     
  Lines         484206      230439      -253767     
  Branches       39910        3142       -36768     
====================================================
- Hits          313193      227283       -85910     
+ Misses        165638        2523      -163115     
+ Partials        5375         633        -4742     
Flag Coverage Δ
#Debug 98.63044% <100.00000%> (+33.94866%) ⬆️
#production ?
#test 98.63044% <100.00000%> (-0.05208%) ⬇️

@weltkante
Copy link
Contributor Author

weltkante commented May 23, 2020

@RussKie I have no idea what happened but the last three CI runs were successful and I don't have any local failures anymore either (did quite a few runs). I've cleaned up the PR and think its ready for review now.

If the ITypeInfo tests should become flaky again ping me, I still have an idea what to look for since I had it several times happen in my debugger, but now it doesn't.

The [Collection("Sequential")] thing was a red herring, it only is required to make tests across classes run sequentially, tests in the same class should always run sequentially. I have no idea how I ended up in the debugger with all test methods having a thread active. (I was doing "Debug tests" command from VS on the ITypeInfoTests, with break on exception active, and when the test failed all the other tests also had a thread - but I can't seem to repro that anymore.)

[edit] was able to repro the "having one thread per method in debugger" - all but one thread were ready to terminate so probably misinterpreted what was happening. Still don't know why the test failures suddenly disappeared, maybe #3321 was really all that was missing.

@dotnet dotnet deleted a comment from codecov bot May 26, 2020
@RussKie
Copy link
Member

RussKie commented May 26, 2020

Thank you for taking the initiative on this.

DoDragDrop tests are definitely still hanging. Not sure if its good to have them either, they should be integration tests instead as proper drag'n'drop tests needs mouse interaction, otherwise OLE probably exits out very early.

👍

@RussKie RussKie merged commit e9d6ccf into dotnet:master May 26, 2020
@ghost ghost added this to the 5.0 Preview6 milestone May 26, 2020
@weltkante weltkante deleted the issue3122 branch May 26, 2020 06:35
@ghost ghost locked as resolved and limited conversation to collaborators Feb 1, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
test-bug Problem in test source code (most likely)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bugfixes from Xunit.StaFact nuget package not consumed
2 participants