diff --git a/.github/ISSUE_TEMPLATE/razor_tooling.md b/.github/ISSUE_TEMPLATE/razor_tooling.md new file mode 100644 index 0000000000..2341e230bd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/razor_tooling.md @@ -0,0 +1,66 @@ +--- +name: 🐞 Razor Tooling Bug report +about: Report an issue about something that is not working in the new Razor tooling +labels: area-razor.tooling, feature-razor.vs +--- + + + + + +### Describe the bug +A clear and concise description of what the bug is. + +### To Reproduce + + +### Logs & Exceptions + +Please collect the data below before reporting your issue to aid us in diagnosing the root cause. + +#### Activity log +[Here](https://docs.microsoft.com/en-us/visualstudio/extensibility/how-to-use-the-activity-log?view=vs-2019#to-examine-the-activity-log) are the instructions on how to generate/acquire one. + +#### Razor Language Server Client log + +
+Razor Language Server Client Log Output + +Paste log output here + +
+ +#### HTML Language Server Client log + +
+HTML Language Server Client Log Output + +Paste log output here + +
+ +### Further technical details +- VS version (Help => About Microsoft Visual Studio, i.e. 16.8.0 Preview 1 30313.27...). If in Codespaces there will be two versions (server and client), please provide both. +- Scenario (Local, LiveShare, Codespaces) + +### Pre-requisite checklist +- [ ] Steps to reproduce the issue +- [ ] Visual Studio Activity Log attached. +- [ ] Razor Language Server client logs included. +- [ ] HTML Language Server client logs included diff --git a/AspNetCore.sln b/AspNetCore.sln index 50068277d8..2f12c219cd 100644 --- a/AspNetCore.sln +++ b/AspNetCore.sln @@ -1437,6 +1437,20 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.NET.Sdk.BlazorWeb EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.NET.Sdk.BlazorWebAssembly.Tools", "src\Components\WebAssembly\Sdk\tools\Microsoft.NET.Sdk.BlazorWebAssembly.Tools.csproj", "{175E5CD8-92D4-46BB-882E-3A930D3302D4}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{6126DCE4-9692-4EE2-B240-C65743572995}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BasicTestApp", "src\Components\test\testassets\BasicTestApp\BasicTestApp.csproj", "{46FB7E93-1294-4068-B80A-D4864F78277A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentsApp.App", "src\Components\test\testassets\ComponentsApp.App\ComponentsApp.App.csproj", "{25FA84DB-EEA7-4068-8E2D-F3D48B281C16}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentsApp.Server", "src\Components\test\testassets\ComponentsApp.Server\ComponentsApp.Server.csproj", "{19974360-4A63-425A-94DB-C2C940A3A97A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LazyTestContentPackage", "src\Components\test\testassets\LazyTestContentPackage\LazyTestContentPackage.csproj", "{ADF9C126-F322-4E34-AFD3-E626A4487206}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestContentPackage", "src\Components\test\testassets\TestContentPackage\TestContentPackage.csproj", "{3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Components.TestServer", "src\Components\test\testassets\TestServer\Components.TestServer.csproj", "{8A59AF88-4A82-46ED-977D-D909001F8107}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -6787,6 +6801,78 @@ Global {175E5CD8-92D4-46BB-882E-3A930D3302D4}.Release|x64.Build.0 = Release|Any CPU {175E5CD8-92D4-46BB-882E-3A930D3302D4}.Release|x86.ActiveCfg = Release|Any CPU {175E5CD8-92D4-46BB-882E-3A930D3302D4}.Release|x86.Build.0 = Release|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Debug|x64.ActiveCfg = Debug|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Debug|x64.Build.0 = Debug|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Debug|x86.ActiveCfg = Debug|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Debug|x86.Build.0 = Debug|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Release|Any CPU.Build.0 = Release|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Release|x64.ActiveCfg = Release|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Release|x64.Build.0 = Release|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Release|x86.ActiveCfg = Release|Any CPU + {46FB7E93-1294-4068-B80A-D4864F78277A}.Release|x86.Build.0 = Release|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Debug|x64.ActiveCfg = Debug|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Debug|x64.Build.0 = Debug|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Debug|x86.ActiveCfg = Debug|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Debug|x86.Build.0 = Debug|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Release|Any CPU.Build.0 = Release|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Release|x64.ActiveCfg = Release|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Release|x64.Build.0 = Release|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Release|x86.ActiveCfg = Release|Any CPU + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16}.Release|x86.Build.0 = Release|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Debug|x64.ActiveCfg = Debug|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Debug|x64.Build.0 = Debug|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Debug|x86.ActiveCfg = Debug|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Debug|x86.Build.0 = Debug|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Release|Any CPU.Build.0 = Release|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Release|x64.ActiveCfg = Release|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Release|x64.Build.0 = Release|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Release|x86.ActiveCfg = Release|Any CPU + {19974360-4A63-425A-94DB-C2C940A3A97A}.Release|x86.Build.0 = Release|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Debug|x64.ActiveCfg = Debug|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Debug|x64.Build.0 = Debug|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Debug|x86.ActiveCfg = Debug|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Debug|x86.Build.0 = Debug|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Release|Any CPU.Build.0 = Release|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Release|x64.ActiveCfg = Release|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Release|x64.Build.0 = Release|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Release|x86.ActiveCfg = Release|Any CPU + {ADF9C126-F322-4E34-AFD3-E626A4487206}.Release|x86.Build.0 = Release|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Debug|x64.ActiveCfg = Debug|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Debug|x64.Build.0 = Debug|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Debug|x86.ActiveCfg = Debug|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Debug|x86.Build.0 = Debug|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Release|Any CPU.Build.0 = Release|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Release|x64.ActiveCfg = Release|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Release|x64.Build.0 = Release|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Release|x86.ActiveCfg = Release|Any CPU + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31}.Release|x86.Build.0 = Release|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Debug|x64.ActiveCfg = Debug|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Debug|x64.Build.0 = Debug|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Debug|x86.ActiveCfg = Debug|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Debug|x86.Build.0 = Debug|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Release|Any CPU.Build.0 = Release|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Release|x64.ActiveCfg = Release|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Release|x64.Build.0 = Release|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Release|x86.ActiveCfg = Release|Any CPU + {8A59AF88-4A82-46ED-977D-D909001F8107}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -7507,6 +7593,13 @@ Global {83371889-9A3E-4D16-AE77-EB4F83BC6374} = {FED4267E-E5E4-49C5-98DB-8B3F203596EE} {525EBCB4-A870-470B-BC90-845306C337D1} = {FED4267E-E5E4-49C5-98DB-8B3F203596EE} {175E5CD8-92D4-46BB-882E-3A930D3302D4} = {FED4267E-E5E4-49C5-98DB-8B3F203596EE} + {6126DCE4-9692-4EE2-B240-C65743572995} = {0508E463-0269-40C9-B5C2-3B600FB2A28B} + {46FB7E93-1294-4068-B80A-D4864F78277A} = {6126DCE4-9692-4EE2-B240-C65743572995} + {25FA84DB-EEA7-4068-8E2D-F3D48B281C16} = {6126DCE4-9692-4EE2-B240-C65743572995} + {19974360-4A63-425A-94DB-C2C940A3A97A} = {6126DCE4-9692-4EE2-B240-C65743572995} + {ADF9C126-F322-4E34-AFD3-E626A4487206} = {6126DCE4-9692-4EE2-B240-C65743572995} + {3D3C7D9B-E356-4DC6-80B1-3F6D7F15EE31} = {6126DCE4-9692-4EE2-B240-C65743572995} + {8A59AF88-4A82-46ED-977D-D909001F8107} = {6126DCE4-9692-4EE2-B240-C65743572995} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3E8720B3-DBDD-498C-B383-2CC32A054E8F} diff --git a/dockerbuild.sh b/dockerbuild.sh index f73a017491..2d9b8bcfed 100755 --- a/dockerbuild.sh +++ b/dockerbuild.sh @@ -133,10 +133,14 @@ docker run \ -t \ -e TF_BUILD \ -e BUILD_NUMBER \ + -e BUILD_BUILDID \ + -e SYSTEM_TEAMPROJECT \ -e BUILD_BUILDNUMBER \ -e BUILD_REPOSITORY_URI \ -e BUILD_SOURCEVERSION \ -e BUILD_SOURCEBRANCH \ + -e SYSTEM_DEFINITIONID \ + -e SYSTEM_TEAMFOUNDATIONCOLLECTIONURI \ -e DOTNET_CLI_TELEMETRY_OPTOUT \ -e Configuration \ -v "$DIR:$DIR" \ diff --git a/docs/BuildFromSource.md b/docs/BuildFromSource.md index 4fe7763153..f16e82b559 100644 --- a/docs/BuildFromSource.md +++ b/docs/BuildFromSource.md @@ -4,6 +4,22 @@ Building ASP.NET Core from source allows you to tweak and customize ASP.NET Core See for known issues and to track ongoing work. +## Clone the source code + +ASP.NET Core uses git submodules to include the source from a few other projects. + +For a new copy of the project, run: + +```ps1 +git clone --recursive https://github.com/dotnet/aspnetcore +``` + +To update an existing copy, run: + +```ps1 +git submodule update --init --recursive +``` + ## Install pre-requisites ### Windows @@ -22,7 +38,8 @@ Building ASP.NET Core on Windows requires: However, any Visual Studio 2019 instance that meets the requirements should be fine. See [global.json](/global.json) and [eng/scripts/vs.json](/eng/scripts/vs.json) for those requirements. By default, the script will install Visual Studio Enterprise Edition, however you can use a different edition by passing the `-Edition` flag. * Git. -* NodeJS. LTS version of 10.14.2 or newer +* NodeJS. LTS version of 10.14.2 or newer . +* Install yarn globally (`npm install -g yarn`) * Java Development Kit 11 or newer. Either: * OpenJDK * Oracle's JDK @@ -52,22 +69,6 @@ Building ASP.NET Core on macOS or Linux requires: * OpenJDK * Oracle's JDK -## Clone the source code - -ASP.NET Core uses git submodules to include the source from a few other projects. - -For a new copy of the project, run: - -```ps1 -git clone --recursive https://github.com/dotnet/aspnetcore -``` - -To update an existing copy, run: - -```ps1 -git submodule update --init --recursive -``` - **NOTE** some ISPs have been know to use web filtering software that has caused issues with git repository cloning, if you experience issues cloning this repo please review ## Building in Visual Studio @@ -86,6 +87,9 @@ Before opening our .sln/.slnf files in Visual Studio or VS Code, you need to per > :bulb: Pro tip: you will also want to run this command after pulling large sets of changes. On the master > branch, we regularly update the versions of .NET Core SDK required to build the repo. > You will need to restart Visual Studio every time we update the .NET Core SDK. + > To allow executing the setup script, you may need to update the execution policy on your machine. + You can do so by running the `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser` command + in PowerShell. For more information on execution policies, you can read the [execution policy docs](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy). 2. Use the `startvs.cmd` script to open Visual Studio .sln/.slnf files. This script first sets the required environment variables. diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5d9ed07e5e..5e6d20b8c0 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -13,33 +13,33 @@ https://github.com/dotnet/blazor cc449601d638ffaab58ae9487f0fd010bb178a12 - + https://github.com/dotnet/efcore - 58abc390e0e3eb849b5773da3f5ed2982ade521d + ca2a793016c6980c943325c214f42602910d9991 - + https://github.com/dotnet/efcore - 58abc390e0e3eb849b5773da3f5ed2982ade521d + ca2a793016c6980c943325c214f42602910d9991 - + https://github.com/dotnet/efcore - 58abc390e0e3eb849b5773da3f5ed2982ade521d + ca2a793016c6980c943325c214f42602910d9991 - + https://github.com/dotnet/efcore - 58abc390e0e3eb849b5773da3f5ed2982ade521d + ca2a793016c6980c943325c214f42602910d9991 - + https://github.com/dotnet/efcore - 58abc390e0e3eb849b5773da3f5ed2982ade521d + ca2a793016c6980c943325c214f42602910d9991 - + https://github.com/dotnet/efcore - 58abc390e0e3eb849b5773da3f5ed2982ade521d + ca2a793016c6980c943325c214f42602910d9991 - + https://github.com/dotnet/efcore - 58abc390e0e3eb849b5773da3f5ed2982ade521d + ca2a793016c6980c943325c214f42602910d9991 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index b4b215ead8..5faede0115 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,14 +9,14 @@ 5 0 0 - 8 + 1 false release - preview - Preview $(PreReleaseVersionIteration) + rc + RC $(PreReleaseVersionIteration) true false $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion) @@ -131,13 +131,13 @@ 3.2.0 - 5.0.0-preview.8.20360.8 - 5.0.0-preview.8.20360.8 - 5.0.0-preview.8.20360.8 - 5.0.0-preview.8.20360.8 - 5.0.0-preview.8.20360.8 - 5.0.0-preview.8.20360.8 - 5.0.0-preview.8.20360.8 + 5.0.0-preview.8.20365.2 + 5.0.0-preview.8.20365.2 + 5.0.0-preview.8.20365.2 + 5.0.0-preview.8.20365.2 + 5.0.0-preview.8.20365.2 + 5.0.0-preview.8.20365.2 + 5.0.0-preview.8.20365.2 + @@ -253,6 +254,7 @@ @selectValue +

Select (markup block)

@@ -383,13 +385,21 @@ DateTime? timeStepTextboxNullableDateTimeValue = null; bool includeFourthOption = false; - enum SelectableValue { First, Second, Third, Fourth } + enum SelectableValue { First, Second, Third, Fourth, Fifth, Sixth } SelectableValue? selectValue = SelectableValue.Second; SelectableValue? selectMarkupValue = SelectableValue.Second; + SelectableValue variableValue = SelectableValue.Fifth; + void AddAndSelectNewSelectOption() { includeFourthOption = true; selectValue = SelectableValue.Fourth; } + + void ChangeVariableValueToSixth() + { + selectValue = SelectableValue.Sixth; + variableValue = SelectableValue.Sixth; + } } diff --git a/src/Components/test/testassets/BasicTestApp/Index.razor b/src/Components/test/testassets/BasicTestApp/Index.razor index aa87700d5b..c3d798dda3 100644 --- a/src/Components/test/testassets/BasicTestApp/Index.razor +++ b/src/Components/test/testassets/BasicTestApp/Index.razor @@ -70,6 +70,7 @@ + @@ -82,6 +83,7 @@ + @System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription diff --git a/src/Components/test/testassets/BasicTestApp/RenderAttributesBeforeConnectedCallback.razor b/src/Components/test/testassets/BasicTestApp/RenderAttributesBeforeConnectedCallback.razor new file mode 100644 index 0000000000..4b62d3970c --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/RenderAttributesBeforeConnectedCallback.razor @@ -0,0 +1,14 @@ +

Render Attributes Before connectedCallback

+ +

+ When the connectedcallback event fires, it's nice to have the attributes of the HTML element set already, + as data is usually passed to the component using custom attributes. +

+ + + + + +@code { + string attributeString = "success"; +} diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/WithCatchAllParameter.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/WithCatchAllParameter.razor new file mode 100644 index 0000000000..58928d407c --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/RouterTest/WithCatchAllParameter.razor @@ -0,0 +1,7 @@ +@page "/WithCatchAllParameter/{*theAnswer}" +
The answer: @TheAnswer.
+ +@code +{ + [Parameter] public string TheAnswer { get; set; } +} diff --git a/src/Components/test/testassets/BasicTestApp/ToggleEventComponent.razor b/src/Components/test/testassets/BasicTestApp/ToggleEventComponent.razor new file mode 100644 index 0000000000..1639dbb383 --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/ToggleEventComponent.razor @@ -0,0 +1,25 @@ +
+

+ Output: @message +

+ + +

Open the details.

+ +
+ Summary +

+

Detailed content

+
+ +
+ +@code { + string message { get; set; } + + void OnToggle(EventArgs e) + { + message += "ontoggle,"; + StateHasChanged(); + } +} diff --git a/src/Components/test/testassets/BasicTestApp/wwwroot/index.html b/src/Components/test/testassets/BasicTestApp/wwwroot/index.html index 68a3e82344..472bfc2910 100644 --- a/src/Components/test/testassets/BasicTestApp/wwwroot/index.html +++ b/src/Components/test/testassets/BasicTestApp/wwwroot/index.html @@ -23,6 +23,7 @@ + +
diff --git a/src/Hosting/Hosting/src/WebHostExtensions.cs b/src/Hosting/Hosting/src/WebHostExtensions.cs index b1b317272b..fe77b13443 100644 --- a/src/Hosting/Hosting/src/WebHostExtensions.cs +++ b/src/Hosting/Hosting/src/WebHostExtensions.cs @@ -19,9 +19,10 @@ namespace Microsoft.AspNetCore.Hosting /// The timeout for stopping gracefully. Once expired the /// server may terminate any remaining active connections. /// A that completes when the stops. - public static Task StopAsync(this IWebHost host, TimeSpan timeout) + public static async Task StopAsync(this IWebHost host, TimeSpan timeout) { - return host.StopAsync(new CancellationTokenSource(timeout).Token); + using var cts = new CancellationTokenSource(timeout); + await host.StopAsync(cts.Token); } /// diff --git a/src/Hosting/Hosting/test/WebHostTests.cs b/src/Hosting/Hosting/test/WebHostTests.cs index 07ddd8cc56..08f2849a7f 100644 --- a/src/Hosting/Hosting/test/WebHostTests.cs +++ b/src/Hosting/Hosting/test/WebHostTests.cs @@ -198,7 +198,6 @@ namespace Microsoft.AspNetCore.Hosting } [ConditionalFact] - [QuarantinedTest] public async Task WebHostStopAsyncUsesDefaultTimeoutIfGivenTokenDoesNotFire() { var data = new Dictionary @@ -313,7 +312,6 @@ namespace Microsoft.AspNetCore.Hosting } [ConditionalFact] - [QuarantinedTest] public void WebHostApplicationLifetimeEventsOrderedCorrectlyDuringShutdown() { using (var host = CreateBuilder() diff --git a/src/Http/Http/src/StreamResponseBodyFeature.cs b/src/Http/Http/src/StreamResponseBodyFeature.cs index 1152761e6e..717b5c08d2 100644 --- a/src/Http/Http/src/StreamResponseBodyFeature.cs +++ b/src/Http/Http/src/StreamResponseBodyFeature.cs @@ -111,7 +111,7 @@ namespace Microsoft.AspNetCore.Http } /// - /// This calls StartAsync if it has not previoulsy been called. + /// This calls StartAsync if it has not previously been called. /// It will complete the adapted pipe if it exists. /// /// @@ -128,6 +128,11 @@ namespace Microsoft.AspNetCore.Http return; } + if (!_started) + { + await StartAsync(); + } + _completed = true; if (_pipeWriter != null) diff --git a/src/Http/Http/test/Features/StreamResponseBodyFeatureTests.cs b/src/Http/Http/test/Features/StreamResponseBodyFeatureTests.cs new file mode 100644 index 0000000000..a7624e0969 --- /dev/null +++ b/src/Http/Http/test/Features/StreamResponseBodyFeatureTests.cs @@ -0,0 +1,62 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Buffers; +using System.IO; +using System.IO.Pipelines; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNetCore.Http.Features +{ + public class StreamResponseBodyFeatureTests + { + [Fact] + public async Task CompleteAsyncCallsStartAsync() + { + // Arrange + var stream = new MemoryStream(); + var streamResponseBodyFeature = new TestStreamResponseBodyFeature(stream); + + // Act + await streamResponseBodyFeature.CompleteAsync(); + + //Assert + Assert.Equal(1, streamResponseBodyFeature.StartCalled); + } + + [Fact] + public async Task CompleteAsyncWontCallsStartAsyncIfAlreadyStarted() + { + // Arrange + var stream = new MemoryStream(); + var streamResponseBodyFeature = new TestStreamResponseBodyFeature(stream); + await streamResponseBodyFeature.StartAsync(); + + // Act + await streamResponseBodyFeature.CompleteAsync(); + + //Assert + Assert.Equal(1, streamResponseBodyFeature.StartCalled); + } + } + + public class TestStreamResponseBodyFeature : StreamResponseBodyFeature + { + public TestStreamResponseBodyFeature(Stream stream) + : base(stream) + { + + } + + public override Task StartAsync(CancellationToken cancellationToken = default) + { + StartCalled++; + return base.StartAsync(cancellationToken); + } + + public int StartCalled { get; private set; } + } +} diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml index 8786fb8858..d64bd826cf 100644 --- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml +++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml @@ -17,7 +17,7 @@

- Delete + Delete

diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index decd986856..1a72d92d54 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -132,6 +132,7 @@ namespace Templates.Test } [Fact] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/23992")] public async Task BlazorWasmStandalonePwaTemplate_Works() { var project = await ProjectFactory.GetOrCreateProject("blazorstandalonepwa", Output); @@ -251,6 +252,7 @@ namespace Templates.Test } [ConditionalFact] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/23992")] // LocalDB doesn't work on non Windows platforms [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB() @@ -259,6 +261,7 @@ namespace Templates.Test } [Fact] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/23992")] public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB() { return BlazorWasmHostedTemplate_IndividualAuth_Works(false); diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css index 2ebdff93e6..dd1b08bd85 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css @@ -24,6 +24,7 @@ app { height: 3.5rem; display: flex; align-items: center; + z-index: 10; } .main { diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css index 0c0c94d820..76b9667ff5 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css @@ -24,6 +24,7 @@ app { height: 3.5rem; display: flex; align-items: center; + z-index: 10; } .main { diff --git a/src/ProjectTemplates/test/BaselineTest.cs b/src/ProjectTemplates/test/BaselineTest.cs index 243d13d67f..eabacc336d 100644 --- a/src/ProjectTemplates/test/BaselineTest.cs +++ b/src/ProjectTemplates/test/BaselineTest.cs @@ -71,6 +71,7 @@ namespace Templates.Test [Theory] [MemberData(nameof(TemplateBaselines))] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/23993")] public async Task Template_Produces_The_Right_Set_Of_FilesAsync(string arguments, string[] expectedFiles) { Project = await ProjectFactory.GetOrCreateProject("baseline" + SanitizeArgs(arguments), Output); @@ -151,4 +152,4 @@ namespace Templates.Test } } } -} \ No newline at end of file +} diff --git a/src/ProjectTemplates/test/MvcTemplateTest.cs b/src/ProjectTemplates/test/MvcTemplateTest.cs index 3bcb51416a..c88493ccd1 100644 --- a/src/ProjectTemplates/test/MvcTemplateTest.cs +++ b/src/ProjectTemplates/test/MvcTemplateTest.cs @@ -223,6 +223,7 @@ namespace Templates.Test } [Fact] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/23993")] public async Task MvcTemplate_RazorRuntimeCompilation_BuildsAndPublishes() { Project = await ProjectFactory.GetOrCreateProject("mvc_rc", Output); diff --git a/src/Razor/Microsoft.NET.Sdk.Razor/integrationtests/StaticWebAssetsIntegrationTest.cs b/src/Razor/Microsoft.NET.Sdk.Razor/integrationtests/StaticWebAssetsIntegrationTest.cs index 49d2172f6e..63c0afee0f 100644 --- a/src/Razor/Microsoft.NET.Sdk.Razor/integrationtests/StaticWebAssetsIntegrationTest.cs +++ b/src/Razor/Microsoft.NET.Sdk.Razor/integrationtests/StaticWebAssetsIntegrationTest.cs @@ -82,6 +82,7 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests } [ConditionalFact] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/18543")] [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] [InitializeTestProject("AppWithPackageAndP2PReferenceAndRID", additionalProjects: new[] { "ClassLibrary", "ClassLibrary2" })] public async Task Publish_CopiesStaticWebAssetsToDestinationFolder_PublishSingleFile() diff --git a/src/Servers/Kestrel/test/FunctionalTests/MaxRequestBufferSizeTests.cs b/src/Servers/Kestrel/test/FunctionalTests/MaxRequestBufferSizeTests.cs index 430e7fbfd0..496b1bcf3c 100644 --- a/src/Servers/Kestrel/test/FunctionalTests/MaxRequestBufferSizeTests.cs +++ b/src/Servers/Kestrel/test/FunctionalTests/MaxRequestBufferSizeTests.cs @@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests } [Theory] [MemberData(nameof(LargeUploadData))] - [QuarantinedTest] + [QuarantinedTest] // This is inherently flaky and should never be unquarantined. public async Task LargeUpload(long? maxRequestBufferSize, bool connectionAdapter, bool expectPause) { // Parameters diff --git a/src/Shared/Components/ServerComponentSerializationSettings.cs b/src/Shared/Components/ServerComponentSerializationSettings.cs index 7aabb013b5..db061bf52a 100644 --- a/src/Shared/Components/ServerComponentSerializationSettings.cs +++ b/src/Shared/Components/ServerComponentSerializationSettings.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Components }; // This setting is not configurable, but realistically we don't expect an app to take more than 30 seconds from when - // it got rendrered to when the circuit got started, and having an expiration on the serialized server-components helps + // it got rendered to when the circuit got started, and having an expiration on the serialized server-components helps // prevent old payloads from being replayed. public static readonly TimeSpan DataExpiration = TimeSpan.FromMinutes(5); } diff --git a/src/Shared/Process/ProcessEx.cs b/src/Shared/Process/ProcessEx.cs index c4f0002d5c..ad7d06b1ed 100644 --- a/src/Shared/Process/ProcessEx.cs +++ b/src/Shared/Process/ProcessEx.cs @@ -49,10 +49,15 @@ namespace Microsoft.AspNetCore.Internal _exited = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + // We greedily create a timeout exception message even though a timeout is unlikely to happen for two reasons: + // 1. To make it less likely for Process getters to throw exceptions like "System.InvalidOperationException: Process has exited, ..." + // 2. To ensure if/when exceptions are thrown from Process getters, these exceptions can easily be observed. + var timeoutExMessage = $"Process proc {proc.ProcessName} {proc.StartInfo.Arguments} timed out after {DefaultProcessTimeout}."; + _processTimeoutCts = new CancellationTokenSource(timeout); _processTimeoutCts.Token.Register(() => { - _exited.TrySetException(new TimeoutException($"Process proc {proc.ProcessName} {proc.StartInfo.Arguments} timed out after {DefaultProcessTimeout}.")); + _exited.TrySetException(new TimeoutException(timeoutExMessage)); }); } diff --git a/src/Shared/runtime/Quic/Implementations/Mock/MockConnection.cs b/src/Shared/runtime/Quic/Implementations/Mock/MockConnection.cs index 361474bcb1..cba2f936ef 100644 --- a/src/Shared/runtime/Quic/Implementations/Mock/MockConnection.cs +++ b/src/Shared/runtime/Quic/Implementations/Mock/MockConnection.cs @@ -93,7 +93,7 @@ namespace System.Net.Quic.Implementations.Mock int bytesRead = 0; do { - bytesRead += await socket.ReceiveAsync(buffer.AsMemory().Slice(bytesRead), SocketFlags.None).ConfigureAwait(false); + bytesRead += await socket.ReceiveAsync(buffer.AsMemory().Slice(bytesRead), SocketFlags.None, cancellationToken).ConfigureAwait(false); } while (bytesRead != buffer.Length); int peerListenPort = BinaryPrimitives.ReadInt32LittleEndian(buffer); @@ -163,7 +163,7 @@ namespace System.Net.Quic.Implementations.Mock int bytesRead = 0; do { - bytesRead += await socket.ReceiveAsync(buffer.AsMemory().Slice(bytesRead), SocketFlags.None).ConfigureAwait(false); + bytesRead += await socket.ReceiveAsync(buffer.AsMemory().Slice(bytesRead), SocketFlags.None, cancellationToken).ConfigureAwait(false); } while (bytesRead != buffer.Length); long streamId = BinaryPrimitives.ReadInt64LittleEndian(buffer); diff --git a/src/Shared/runtime/Quic/Implementations/Mock/MockListener.cs b/src/Shared/runtime/Quic/Implementations/Mock/MockListener.cs index f4c0cfdf2c..e7b24548d2 100644 --- a/src/Shared/runtime/Quic/Implementations/Mock/MockListener.cs +++ b/src/Shared/runtime/Quic/Implementations/Mock/MockListener.cs @@ -45,7 +45,7 @@ namespace System.Net.Quic.Implementations.Mock int bytesRead = 0; do { - bytesRead += await socket.ReceiveAsync(buffer.AsMemory().Slice(bytesRead), SocketFlags.None).ConfigureAwait(false); + bytesRead += await socket.ReceiveAsync(buffer.AsMemory().Slice(bytesRead), SocketFlags.None, cancellationToken).ConfigureAwait(false); } while (bytesRead != buffer.Length); int peerListenPort = BinaryPrimitives.ReadInt32LittleEndian(buffer); diff --git a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTestBase.cs b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTestBase.cs index 0192641dad..8a3a9562b7 100644 --- a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTestBase.cs +++ b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTestBase.cs @@ -85,7 +85,7 @@ namespace Microsoft.AspNetCore.SignalR.Common.Tests.Internal.Protocol message: new InvocationMessage(null, "Target", new object[] { 42 }, new string[] { "__test_id__" }), binary: "lgGAwKZUYXJnZXSRKpGrX190ZXN0X2lkX18="), new ProtocolTestData( - name: "InvocationWithMulitpleStreams", + name: "InvocationWithMultipleStreams", message: new InvocationMessage(null, "Target", Array.Empty(), new string[] { "__test_id__", "__test_id2__" }), binary: "lgGAwKZUYXJnZXSQkqtfX3Rlc3RfaWRfX6xfX3Rlc3RfaWQyX18="), diff --git a/src/Tools/dotnet-watch/test/AppWithDepsTests.cs b/src/Tools/dotnet-watch/test/AppWithDepsTests.cs index bef740ad10..b4f9510ad9 100644 --- a/src/Tools/dotnet-watch/test/AppWithDepsTests.cs +++ b/src/Tools/dotnet-watch/test/AppWithDepsTests.cs @@ -20,6 +20,7 @@ namespace Microsoft.DotNet.Watcher.Tools.FunctionalTests } [ConditionalFact] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/23994")] [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/23360", Queues = "Windows.10.Arm64;Windows.10.Arm64.Open;Debian.9.Arm64;Debian.9.Arm64.Open;(Debian.9.Arm64.Open)Ubuntu.1804.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036;(Debian.9.Arm64)Ubuntu.1804.Armarch@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036")] public async Task ChangeFileInDependency() { diff --git a/src/Tools/dotnet-watch/test/GlobbingAppTests.cs b/src/Tools/dotnet-watch/test/GlobbingAppTests.cs index e731247241..95224ea800 100644 --- a/src/Tools/dotnet-watch/test/GlobbingAppTests.cs +++ b/src/Tools/dotnet-watch/test/GlobbingAppTests.cs @@ -15,7 +15,10 @@ namespace Microsoft.DotNet.Watcher.Tools.FunctionalTests { public class GlobbingAppTests : IDisposable { - private GlobbingApp _app; + private static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(60); + + private readonly GlobbingApp _app; + public GlobbingAppTests(ITestOutputHelper logger) { _app = new GlobbingApp(logger); @@ -28,17 +31,17 @@ namespace Microsoft.DotNet.Watcher.Tools.FunctionalTests public async Task ChangeCompiledFile(bool usePollingWatcher) { _app.UsePollingWatcher = usePollingWatcher; - await _app.StartWatcherAsync(); + await _app.StartWatcherAsync().TimeoutAfter(DefaultTimeout); - var types = await _app.GetCompiledAppDefinedTypes(); + var types = await _app.GetCompiledAppDefinedTypes().TimeoutAfter(DefaultTimeout); Assert.Equal(2, types); var fileToChange = Path.Combine(_app.SourceDirectory, "include", "Foo.cs"); var programCs = File.ReadAllText(fileToChange); File.WriteAllText(fileToChange, programCs); - await _app.HasRestarted(); - types = await _app.GetCompiledAppDefinedTypes(); + await _app.HasRestarted().TimeoutAfter(DefaultTimeout); + types = await _app.GetCompiledAppDefinedTypes().TimeoutAfter(DefaultTimeout); Assert.Equal(2, types); } @@ -46,16 +49,16 @@ namespace Microsoft.DotNet.Watcher.Tools.FunctionalTests [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/23360", Queues = "Debian.9.Arm64;Debian.9.Arm64.Open;(Debian.9.Arm64.Open)Ubuntu.1804.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036;(Debian.9.Arm64)Ubuntu.1804.Armarch@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036")] public async Task DeleteCompiledFile() { - await _app.StartWatcherAsync(); + await _app.StartWatcherAsync().TimeoutAfter(DefaultTimeout); - var types = await _app.GetCompiledAppDefinedTypes(); + var types = await _app.GetCompiledAppDefinedTypes().TimeoutAfter(DefaultTimeout); Assert.Equal(2, types); var fileToChange = Path.Combine(_app.SourceDirectory, "include", "Foo.cs"); File.Delete(fileToChange); - await _app.HasRestarted(); - types = await _app.GetCompiledAppDefinedTypes(); + await _app.HasRestarted().TimeoutAfter(DefaultTimeout); + types = await _app.GetCompiledAppDefinedTypes().TimeoutAfter(DefaultTimeout); Assert.Equal(1, types); } @@ -63,16 +66,16 @@ namespace Microsoft.DotNet.Watcher.Tools.FunctionalTests [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/23360", Queues = "Debian.9.Arm64;Debian.9.Arm64.Open;(Debian.9.Arm64.Open)Ubuntu.1804.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036;(Debian.9.Arm64)Ubuntu.1804.Armarch@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036")] public async Task DeleteSourceFolder() { - await _app.StartWatcherAsync(); + await _app.StartWatcherAsync().TimeoutAfter(DefaultTimeout); - var types = await _app.GetCompiledAppDefinedTypes(); + var types = await _app.GetCompiledAppDefinedTypes().TimeoutAfter(DefaultTimeout); Assert.Equal(2, types); var folderToDelete = Path.Combine(_app.SourceDirectory, "include"); Directory.Delete(folderToDelete, recursive: true); - await _app.HasRestarted(); - types = await _app.GetCompiledAppDefinedTypes(); + await _app.HasRestarted().TimeoutAfter(DefaultTimeout); + types = await _app.GetCompiledAppDefinedTypes().TimeoutAfter(DefaultTimeout); Assert.Equal(1, types); } @@ -80,19 +83,19 @@ namespace Microsoft.DotNet.Watcher.Tools.FunctionalTests [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/23360", Queues = "Debian.9.Arm64;Debian.9.Arm64.Open;(Debian.9.Arm64.Open)Ubuntu.1804.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036;(Debian.9.Arm64)Ubuntu.1804.Armarch@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036")] public async Task RenameCompiledFile() { - await _app.StartWatcherAsync(); + await _app.StartWatcherAsync().TimeoutAfter(DefaultTimeout); var oldFile = Path.Combine(_app.SourceDirectory, "include", "Foo.cs"); var newFile = Path.Combine(_app.SourceDirectory, "include", "Foo_new.cs"); File.Move(oldFile, newFile); - await _app.HasRestarted(); + await _app.HasRestarted().TimeoutAfter(DefaultTimeout); } [Fact] public async Task ChangeExcludedFile() { - await _app.StartWatcherAsync(); + await _app.StartWatcherAsync().TimeoutAfter(DefaultTimeout); var changedFile = Path.Combine(_app.SourceDirectory, "exclude", "Baz.cs"); File.WriteAllText(changedFile, ""); @@ -105,11 +108,11 @@ namespace Microsoft.DotNet.Watcher.Tools.FunctionalTests [Fact] public async Task ListsFiles() { - await _app.PrepareAsync(); + await _app.PrepareAsync().TimeoutAfter(DefaultTimeout); _app.Start(new[] { "--list" }); var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(30)); - var lines = await _app.Process.GetAllOutputLinesAsync(cts.Token); + var lines = await _app.Process.GetAllOutputLinesAsync(cts.Token).TimeoutAfter(DefaultTimeout); var files = lines.Where(l => !l.StartsWith("watch :")); AssertEx.EqualFileList(