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

don't run LongModuleFileNamesAreSupported test on x86 #57471

Merged
merged 5 commits into from
Aug 17, 2021

Conversation

adamsitnik
Copy link
Member

@adamsitnik adamsitnik commented Aug 16, 2021

This particular tests uses Assembly.LoadFile(path) to load a test assembly:

[ConditionalFact(typeof(ProcessModuleTests), nameof(Is_LongModuleFileNamesAreSupported_TestEnabled))]
public void LongModuleFileNamesAreSupported()
{
// To be able to test Long Path support for ProcessModule.FileName we need a .dll that has a path > 260 chars.
// Since Long Paths support can be disabled (see the ConditionalFact attribute usage above),
// we just copy "LongName.dll" from bin to a temp directory with a long name and load it from there.
// Loading from new path is possible because the type exposed by the assembly is not referenced in any explicit way.

for some reason it's flaky on x86. I've tried to repro it on two Windows machines and failed. Since I don't have better idea, I think it's just OK not to run this test on x86.

The previous check of Windows version (OperatingSystem.IsWindowsVersionAtLeast(8)) can be removed as in the past this test was failing only on Windows 7 x86.

fixes #57452

@ghost
Copy link

ghost commented Aug 16, 2021

Tagging subscribers to this area: @dotnet/area-system-diagnostics-process
See info in area-owners.md if you want to be subscribed.

Issue Details

for some reason it's flaky

fixes #57452

Author: adamsitnik
Assignees: -
Labels:

area-System.Diagnostics.Process

Milestone: 6.0.0

&& !PlatformDetection.IsMonoRuntime // Assembly.LoadFile used the way this test is implemented fails on Mono
&& OperatingSystem.IsWindowsVersionAtLeast(8); // it's specific to Windows and does not work on Windows 7
&& PlatformDetection.Is64BitProcess; // for some reason it's flaky on x86
Copy link
Member

Choose a reason for hiding this comment

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

@JeremyKuhne do you perhaps know about any long path issues specific to x86?

Copy link
Member

Choose a reason for hiding this comment

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

can you explain what do you mean by flaky? what's happening? I'd expect this to be deterministic

Copy link
Member

@krwq krwq Aug 16, 2021

Choose a reason for hiding this comment

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

should this be !(Is32Bit && !IsArm) - perhaps we should add IsX86 in the PlatformDetection - we should also open the issue to try to understand why this is failing on x86 I think (unless we don't care for some reason).

Alternative: RuntimeInformation.ProcessArchitecture != Architecture.X86 - you should still consider adding that to platform detection

Copy link
Member Author

Choose a reason for hiding this comment

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

My guess is that it's rather related to assembly loading on x86 or process modules information not being refreshed rather than long paths itself.

I'd expect this to be deterministic

It's not ;( All tests have passed in #57335 where I've re-enabled this test but it fails from time to time: #57452.

Copy link
Member

Choose a reason for hiding this comment

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

Perhaps we should add more diagnostics.. I.e. print all module list, enumerate modules in the assembly returned by Assembly.LoadFile. This sound rather sketchy as is - perhaps it's unrelated issue completely but we should at least understand why it's happening before we disable I think

Copy link
Member Author

Choose a reason for hiding this comment

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

RuntimeInformation.ProcessArchitecture != Architecture.X86

done

Copy link
Member

Choose a reason for hiding this comment

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

@JeremyKuhne do you perhaps know about any long path issues specific to x86?

The only issues I've ever seen are bugs with the WOW layer when running an x86 binary on x64. I'm unaware of any outstanding issues though.

&& !PlatformDetection.IsMonoRuntime // Assembly.LoadFile used the way this test is implemented fails on Mono
&& OperatingSystem.IsWindowsVersionAtLeast(8); // it's specific to Windows and does not work on Windows 7
&& RuntimeInformation.ProcessArchitecture != Architecture.X86; // for some reason it's flaky on x86
Copy link
Member

Choose a reason for hiding this comment

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

We're confident this is an OS limitation rather than a product or test bug?

Copy link
Member

@jkotas jkotas Aug 16, 2021

Choose a reason for hiding this comment

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

My guess is that we end up taking a fallback path in the assembly loader on x86 for some reason. The assembly loader has number of fallback paths for historic reasons to compensate for OS and compiler issues.

The assembly loader behavior that this test depends on is not guaranteed. The test is disabled on Mono for this reason. If once we enable these tests in single-file or NativeAOT modes, the test may need to be disabled for those configurations as well.

It would be better if the test came with its own .dll and called LoadLibrary on it. Then it can depend on that the library has to show up in the list.

Copy link
Member Author

Choose a reason for hiding this comment

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

@jkotas I've followed your suggestion and used LoadLibrary directly. On one of the x86 CI legs it fails with ERROR_MOD_NOT_FOUND:

    System.Diagnostics.Tests.ProcessModuleTests.LongModuleFileNamesAreSupported [FAIL]
      LoadLibrary failed with 126
      Expected: False
      Actual:   True
      Stack Trace:
        /_/src/libraries/System.Diagnostics.Process/tests/ProcessModuleTests.Windows.cs(37,0): at System.Diagnostics.Tests.ProcessModuleTests.LongModuleFileNamesAreSupported()

I can't repro it locally and find out which module is missing (this is just a lib with a single class). Since this test is basically best effort to test long paths support for process module file paths, would it be OK to just skip the test on ERROR_MOD_NOT_FOUND on x86?

Copy link
Member

Choose a reason for hiding this comment

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

Yes, I think it is ok to skip the test when LoadLibrary fails to load the module with the long file name. My guess is that the long paths are not properly enabled on the system when it happens.

@adamsitnik adamsitnik modified the milestones: 6.0.0, 7.0.0 Aug 16, 2021
@lewing
Copy link
Member

lewing commented Aug 16, 2021

/azp run runtime

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@lewing
Copy link
Member

lewing commented Aug 17, 2021

If this is the solution to #57452 is definitely 6.0 milestone

@lewing lewing added the blocking-clean-ci Blocking PR or rolling runs of 'runtime' or 'runtime-extra-platforms' label Aug 17, 2021
{
internal static partial class Interop
Copy link
Member Author

Choose a reason for hiding this comment

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

this Interop type was causing a conflict with the other Interop that we use in product code and because of that I was not able to call Interop.Kernel32.LoadLibrary in the test code. I decided to just remove the namespace so it de-facto becames a single Interop type.

@adamsitnik
Copy link
Member Author

the CI failures are not related, as soon as I get an approval the PR is ready to be merged

@adamsitnik adamsitnik modified the milestones: 7.0.0, 6.0.0 Aug 17, 2021
Copy link
Member

@jozkee jozkee left a comment

Choose a reason for hiding this comment

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

LGTM

@adamsitnik adamsitnik merged commit 14b34eb into dotnet:main Aug 17, 2021
@adamsitnik adamsitnik deleted the issue57452 branch August 17, 2021 07:49
@ghost ghost locked as resolved and limited conversation to collaborators Sep 16, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-System.Diagnostics.Process blocking-clean-ci Blocking PR or rolling runs of 'runtime' or 'runtime-extra-platforms'
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Test failure in System.Diagnostics.Process.Tests
7 participants