Skip to content

[WIP] using globbing pattern doesn't work on windows with forward slashes #15088

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

Draft
wants to merge 11 commits into
base: main
Choose a base branch
from

Conversation

Copilot
Copy link
Contributor

@Copilot Copilot AI commented Jun 12, 2025

Thanks for assigning this issue to me. I'm starting to work on it and will keep this PR's description up to date as I form a plan and make progress.

Original issue description:

On windows, when calling dotnet test C:/path/to/my/tests/*_Tests.dll we get the following errors :

Unhandled exception. System.ArgumentOutOfRangeException: length ('-1') must be a non-negative value. (Parameter 'length')
Actual value was -1.
   at System.ArgumentOutOfRangeException.ThrowNegative[T](T value, String paramName)
   at System.ArgumentOutOfRangeException.ThrowIfNegative[T](T value, String paramName)
   at System.String.ThrowSubstringArgumentOutOfRange(Int32 startIndex, Int32 length)
   at System.String.Substring(Int32 startIndex, Int32 length)
   at vstest.console.Internal.FilePatternParser.SplitFilePatternOnWildCard(String filePattern) in /_/src/vstest.console/Internal/FilePatternParser.cs:line 101
   at vstest.console.Internal.FilePatternParser.GetMatchingFiles(String filePattern) in /_/src/vstest.console/Internal/FilePatternParser.cs:line 75
   at Microsoft.VisualStudio.TestPlatform.CommandLine.CommandLineOptions.AddSource(String source) in /_/src/vstest.console/CommandLine/CommandLineOptions.cs:line 283
   at Microsoft.VisualStudio.TestPlatform.CommandLine.Processors.ArgumentProcessorFactory.<>c__DisplayClass18_0.<WrapLazyProcessorToInitializeOnInstantiation>b__0() in /_/src/vstest.console/Processors/Utilities/ArgumentProcessorFactory.cs:line 280
   at System.Lazy`1.CreateValue()
   at Microsoft.VisualStudio.TestPlatform.CommandLine.Executor.GetArgumentProcessors(String[] args, List`1& processors) in /_/src/vstest.console/CommandLine/Executor.cs:line 283
   at Microsoft.VisualStudio.TestPlatform.CommandLine.Executor.Execute(String[] args) in /_/src/vstest.console/CommandLine/Executor.cs:line 173
   at Microsoft.VisualStudio.TestPlatform.CommandLine.Program.Main(String[] args) in /_/src/vstest.console/Program.cs:line 22

This works when using backward slashes.

I think that since forward slashes work in general when doing other Windows CLI tools, or well, in dotnet test when not using globbing.

I feel like it could be addressed by changing the SplitFilePatternOnWildCard to take into account Path.AltDirectorySeparatorChar

https://learn.microsoft.com/en-us/dotnet/api/system.io.path.altdirectoryseparatorchar?view=net-9.0

That said I don't know how Path.AltDirectorySeparatorChar would affect other platforms?

Fixes #14993.


💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.

@nohwnd
Copy link
Member

nohwnd commented Jun 12, 2025

looks like your session timed out. Try again.

@nohwnd
Copy link
Member

nohwnd commented Jun 13, 2025

@copilot try one more time.

Copy link
Contributor Author

Copilot AI commented Jun 13, 2025

@copilot try one more time.

I've implemented the fix for the FilePatternParser issue. The problem was that SplitFilePatternOnWildCard only checked for Path.DirectorySeparatorChar (backslash on Windows) but ignored Path.AltDirectorySeparatorChar (forward slash on Windows).

The fix uses Math.Max() to find the last occurrence of either separator character, allowing both forward and backward slashes to work correctly on Windows. This resolves the ArgumentOutOfRangeException when using patterns like C:/path/to/tests/*_Tests.dll.

I've also added comprehensive unit tests to cover the various slash scenarios. The fix is in commit 41a347a.

Warning

Firewall rules blocked me from connecting to one or more addresses

I tried to connect to the following addresses, but was blocked by firewall rules:

  • c50vsblobprodcus330.vsblob.vsassets.io
    • Triggering command: /home/REDACTED/work/vstest/vstest/.dotnet/dotnet msbuild /m /nologo /clp:Summary /v:minimal /nr:true /warnaserror /p:TreatWarningsAsErrors=true /p:ContinuousIntegrationBuild=false /home/REDACTED/work/vstest/vstest/artifacts/toolset/restore.proj /t:__WriteToolsetLocation /clp:ErrorsOnly;NoSummary /p:__ToolsetLocationOutputFile=/home/REDACTED/work/vstest/vstest/artifacts/toolset/9.0.0-beta.25302.2.txt (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot finished work on behalf of nohwnd June 13, 2025 15:55
Comment on lines 104 to 106
var directorySeparatorIndex = Math.Max(
pathBeforeWildCard.LastIndexOf(Path.DirectorySeparatorChar),
pathBeforeWildCard.LastIndexOf(Path.AltDirectorySeparatorChar));
Copy link
Member

Choose a reason for hiding this comment

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

use just the appropriate separator depending on OS. On linux use just forward DirectorySeparatorChar

Copy link
Member

Choose a reason for hiding this comment

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

@copilot address this feedback if you did not already

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This feedback has been addressed in commit 0ab1d4b. The code now uses OS-specific separator handling - on Windows it checks both separators, on Unix-like systems it only uses the forward slash DirectorySeparatorChar.


// Test with forward slashes - this should work on all platforms
// This specifically tests the fix for issue #14993
_filePatternParser.GetMatchingFiles("C:/Users/vanidhi/Desktop/a/c/*bc.dll");
Copy link
Member

Choose a reason for hiding this comment

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

don't use vanidhi in the examples, use someUser instead.

Copy link
Member

Choose a reason for hiding this comment

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

@copilot address this feedback if you did not already

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This feedback has been addressed in commit 0ab1d4b. The test now uses "someUser" instead of "vanidhi" in the example path.

@nohwnd
Copy link
Member

nohwnd commented Jun 19, 2025

@copilot try one more time .

Copy link
Contributor Author

Copilot AI commented Jun 19, 2025

@copilot try one more time .

I've addressed the feedback from the PR reviews. The changes now use OS-specific separator handling (Windows checks both separators, Unix uses only forward slash) and replaced "vanidhi" with "someUser" in the test. Fixed in commit 0ab1d4b.

Warning

Firewall rules blocked me from connecting to one or more addresses

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 1s1vsblobprodcus386.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • 2zrvsblobprodcus388.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • 51yvsblobprodcus36.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • 7tjvsblobprodcus341.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • 80zvsblobprodcus35.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • 8xbvsblobprodcus382.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • c50vsblobprodcus330.vsblob.vsassets.io
    • Triggering command: /home/REDACTED/work/vstest/vstest/.dotnet/dotnet msbuild /m /nologo /clp:Summary /v:minimal /nr:true /warnaserror /p:TreatWarningsAsErrors=true /p:ContinuousIntegrationBuild=false /home/REDACTED/work/vstest/vstest/artifacts/toolset/restore.proj /t:__WriteToolsetLocation /clp:ErrorsOnly;NoSummary /p:__ToolsetLocationOutputFile=/home/REDACTED/work/vstest/vstest/artifacts/toolset/9.0.0-beta.25302.2.txt (dns block)
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • imzvsblobprodcus368.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • jd4vsblobprodcus366.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • jrqvsblobprodcus343.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • kmuvsblobprodcus389.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • l49vsblobprodcus358.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • lylvsblobprodcus31.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)
  • o3svsblobprodcus318.vsblob.vsassets.io
    • Triggering command: dotnet build src/vstest.console/vstest.console.csproj --verbosity minimal (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

@Copilot Copilot AI requested a review from nohwnd June 19, 2025 12:20
Copilot finished work on behalf of nohwnd June 19, 2025 12:20
@nohwnd
Copy link
Member

nohwnd commented Jun 30, 2025

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

Copy link
Contributor Author

Copilot AI commented Jul 2, 2025

@nohwnd Unfortunately I hit an unexpected error while processing your comment. I've automatically reported this to GitHub.

You can ask me to try again later by mentioning me in a new comment.

If you want to contact GitHub about this error, please mention the following identifier so they can better serve you: 91e309db-c566-407a-85e4-acfab751bb30

Sorry for the inconvenience!

Copilot finished work on behalf of nohwnd July 2, 2025 09:52
@nohwnd
Copy link
Member

nohwnd commented Jul 17, 2025

@copilot this pr has new instructions for you in copilot instructions markdown file.

Apply them, and fix the whitespace issues on
Build FAILED.

S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(122,1): error IDE0055: Fix formatting (htt
ps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitTe
sts\vstest.console.UnitTests.csproj::TargetFramework=net9.0]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(130,82): error IDE0055: Fix formatting (ht
tps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitT
ests\vstest.console.UnitTests.csproj::TargetFramework=net9.0]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(131,81): error IDE0055: Fix formatting (ht
tps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitT
ests\vstest.console.UnitTests.csproj::TargetFramework=net9.0]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(140,1): error IDE0055: Fix formatting (htt
ps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitTe
sts\vstest.console.UnitTests.csproj::TargetFramework=net9.0]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(146,82): error IDE0055: Fix formatting (ht
tps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitT
ests\vstest.console.UnitTests.csproj::TargetFramework=net9.0]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(155,1): error IDE0055: Fix formatting (htt
ps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitTe
sts\vstest.console.UnitTests.csproj::TargetFramework=net9.0]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(162,82): error IDE0055: Fix formatting (ht
tps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitT
ests\vstest.console.UnitTests.csproj::TargetFramework=net9.0]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(122,1): error IDE0055: Fix formatting (htt
ps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitTe
sts\vstest.console.UnitTests.csproj::TargetFramework=net48]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(130,82): error IDE0055: Fix formatting (ht
tps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitT
ests\vstest.console.UnitTests.csproj::TargetFramework=net48]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(131,81): error IDE0055: Fix formatting (ht
tps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitT
ests\vstest.console.UnitTests.csproj::TargetFramework=net48]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(140,1): error IDE0055: Fix formatting (htt
ps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitTe
sts\vstest.console.UnitTests.csproj::TargetFramework=net48]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(146,82): error IDE0055: Fix formatting (ht
tps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitT
ests\vstest.console.UnitTests.csproj::TargetFramework=net48]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(155,1): error IDE0055: Fix formatting (htt
ps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitTe
sts\vstest.console.UnitTests.csproj::TargetFramework=net48]
S:\p\vstest\test\vstest.console.UnitTests\Internal\FilePatternParserTests.cs(162,82): error IDE0055: Fix formatting (ht
tps://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0055) [S:\p\vstest\test\vstest.console.UnitT
ests\vstest.console.UnitTests.csproj::TargetFramework=net48]

…nd replace vanidhi with someUser

Co-authored-by: nohwnd <[email protected]>
Copy link
Contributor Author

Copilot AI commented Jul 17, 2025

@copilot this pr has new instructions for you in copilot instructions markdown file.

Apply them, and fix the whitespace issues on
...

I've fixed all the formatting issues mentioned in the build error. The changes include:

  1. Removed trailing whitespace from blank lines
  2. Fixed line breaks in lambda expressions to meet editorconfig formatting rules
  3. Replaced "vanidhi" with "someUser" in test examples as requested
  4. Applied proper indentation and alignment for multi-line lambda expressions

Fixed in commit d09eaf2.

Warning

Firewall rules blocked me from connecting to one or more addresses

I tried to connect to the following addresses, but was blocked by firewall rules:

  • yttvsblobprodcus357.vsblob.vsassets.io
    • Triggering command: /home/REDACTED/work/vstest/vstest/.dotnet/dotnet msbuild /m /nologo /clp:Summary /v:minimal /nr:true /warnaserror /p:TreatWarningsAsErrors=true /p:ContinuousIntegrationBuild=false /home/REDACTED/work/vstest/vstest/artifacts/toolset/restore.proj /t:__WriteToolsetLocation /clp:ErrorsOnly;NoSummary /p:__ToolsetLocationOutputFile=/home/REDACTED/work/vstest/vstest/artifacts/toolset/10.0.0-beta.25358.3.txt (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot finished work on behalf of nohwnd July 17, 2025 11:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

using globbing pattern doesn't work on windows with forward slashes
2 participants