1 write to App
dotnet-watch.Tests (1)
TestUtilities\DotNetWatchTestBase.cs (1)
19
App
= new WatchableApp(debugLogger);
433 references to App
dotnet-watch.Tests (433)
Browser\BrowserTests.cs (26)
16
App
.Start(testAsset, [], testFlags: TestFlags.MockBrowser);
19
await
App
.WaitForOutputLineContaining("Content root path:");
21
Assert.Contains(
App
.Process.Output, line => line.Contains("Application started. Press Ctrl+C to shut down."));
22
Assert.Contains(
App
.Process.Output, line => line.Contains("Hosting environment: Development"));
25
App
.AssertOutputContains(MessageDescriptor.LaunchingBrowser.GetMessage("https://localhost:5001", ""));
34
App
.UseTestBrowser();
39
App
.Start(testAsset, ["--urls", url], relativeProjectDirectory: "RazorApp", testFlags: TestFlags.ReadKeyFromStdin);
41
await
App
.WaitForOutputLineContaining(MessageDescriptor.ConfiguredToUseBrowserRefresh);
42
await
App
.WaitForOutputLineContaining(MessageDescriptor.ConfiguredToLaunchBrowser);
43
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
46
await
App
.WaitUntilOutputContains($"🧪 Test browser opened at '{url}'.");
49
await
App
.WaitUntilOutputContains(MessageDescriptor.ConnectedToRefreshServer, "Browser #1");
51
App
.Process.ClearOutput();
63
await
App
.WaitForOutputLineContaining(errorMessage);
65
await
App
.WaitForOutputLineContaining("Do you want to restart your app?");
67
await
App
.WaitUntilOutputContains($$"""
72
App
.SendKey('a');
75
await
App
.WaitForOutputLineContaining(MessageDescriptor.ReloadingBrowser, $"RazorApp ({tfm})");
78
await
App
.WaitUntilOutputContains("""
82
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
88
await
App
.WaitForOutputLineContaining("[auto-restart] " + errorMessage);
90
await
App
.WaitUntilOutputContains($$"""
94
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
97
await
App
.WaitUntilOutputContains("""
104
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded);
106
await
App
.WaitUntilOutputContains($$"""
CommandLine\LaunchSettingsTests.cs (28)
27
App
.Start(testAsset, []);
28
Assert.Equal("1", await
App
.AssertOutputLineStartsWith("DOTNET_WATCH = "));
42
App
.DotnetWatchArgs.Add("--no-hot-reload");
45
App
.Start(testAsset, []);
46
Assert.Equal("<<<First>>>", await
App
.AssertOutputLineStartsWith("DOTNET_LAUNCH_PROFILE = "));
60
App
.DotnetWatchArgs.Add("--no-hot-reload");
63
App
.DotnetWatchArgs.Add("--launch-profile");
64
App
.DotnetWatchArgs.Add("Second");
65
App
.Start(testAsset, []);
66
Assert.Equal("<<<Second>>>", await
App
.AssertOutputLineStartsWith("DOTNET_LAUNCH_PROFILE = "));
80
App
.DotnetWatchArgs.Add("--no-hot-reload");
83
App
.Start(testAsset, ["--", "--launch-profile", "Third"]);
84
Assert.Equal("<<<First>>>", await
App
.AssertOutputLineStartsWith("DOTNET_LAUNCH_PROFILE = "));
93
App
.Start(testAsset, []);
95
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
97
App
.AssertOutputContains("DOTNET_WATCH_ITERATION = 1");
98
App
.Process.ClearOutput();
102
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
103
App
.AssertOutputContains("DOTNET_WATCH_ITERATION = 2");
112
App
.Start(testAsset, []);
114
await
App
.AssertOutputLineEquals("Environment: Development");
126
App
.Start(
131
await
App
.AssertOutputLineEquals("Environment: Development");
140
App
.EnvironmentVariables.Add("READ_INPUT", "true");
141
App
.Start(testAsset, ["--non-interactive"]);
143
await
App
.AssertStarted();
145
var standardInput =
App
.Process.Process.StandardInput;
149
Assert.Equal(inputString, await
App
.AssertOutputLineStartsWith("Echo: "));
CommandLine\ProgramTests.cs (71)
63
App
.DotnetWatchArgs.Clear();
64
App
.Start(testAsset, arguments);
66
Assert.Equal(expectedApplicationArgs, await
App
.AssertOutputLineStartsWith("Arguments = "));
81
App
.Start(testAsset, arguments);
83
AssertEx.Equal(expectedApplicationArgs, await
App
.AssertOutputLineStartsWith("Arguments = "));
93
App
.DotnetWatchArgs.Clear();
94
App
.Start(testAsset, arguments:
109
Assert.Equal("-v", await
App
.AssertOutputLineStartsWith("Arguments = "));
110
Assert.Equal("WatchHotReloadAppMultiTfm, Version=1.2.3.4, Culture=neutral, PublicKeyToken=null", await
App
.AssertOutputLineStartsWith("AssemblyName = "));
111
Assert.Equal("' | A=B'\tC | '", await
App
.AssertOutputLineStartsWith("AssemblyTitle = "));
112
Assert.Equal(".NETCoreApp,Version=v6.0", await
App
.AssertOutputLineStartsWith("TFM = "));
115
Assert.Contains(
App
.Process.Output, l => l.Contains("Determining projects to restore..."));
118
Assert.DoesNotContain(
App
.Process.Output, l => l.Contains("Working directory:"));
128
App
.DotnetWatchArgs.Clear();
129
App
.Start(testAsset, arguments:
143
Assert.Equal("WatchHotReloadAppMultiTfm, Version=1.2.3.4, Culture=neutral, PublicKeyToken=null", await
App
.AssertOutputLineStartsWith("AssemblyName = "));
144
Assert.Equal("' | A=B'\tC | '", await
App
.AssertOutputLineStartsWith("AssemblyTitle = "));
145
Assert.Equal(".NETCoreApp,Version=v6.0", await
App
.AssertOutputLineStartsWith("TFM = "));
148
Assert.DoesNotContain(
App
.Process.Output, l => l.Contains("Working directory:"));
150
Assert.Contains(
App
.Process.Output, l => l.Contains("Hot reload enabled."));
161
App
.Start(testAsset, arguments: new[]
169
Assert.Equal(expectedArgs, await
App
.AssertOutputLineStartsWith("Arguments: "));
171
Assert.Contains(
App
.Process.Output, l => l.Contains($"Found named launch profile '{profileName}'."));
172
Assert.Contains(
App
.Process.Output, l => l.Contains("Hot Reload disabled by command line switch."));
183
App
.Start(testAsset, arguments: new[]
190
Assert.Equal(expectedArgs, await
App
.AssertOutputLineStartsWith("Arguments: "));
192
Assert.Contains(
App
.Process.Output, l => l.Contains($"Found named launch profile '{profileName}'."));
201
App
.Start(testAsset, ["--verbose", "test", "--list-tests", "/p:VSTestUseMSBuildOutput=false"]);
203
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
205
App
.AssertOutputContains("The following Tests are available:");
206
App
.AssertOutputContains(" TestNamespace.VSTestXunitTests.VSTestXunitPassTest");
207
App
.Process.ClearOutput();
214
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
216
App
.AssertOutputContains("The following Tests are available:");
217
App
.AssertOutputContains(" TestNamespace.VSTestXunitTests.VSTestXunitPassTest2");
226
App
.Start(testAsset, ["--verbose", "test", "--framework", ToolsetInfo.CurrentTargetFramework, "--list-tests", "/p:VSTestUseMSBuildOutput=false"]);
228
await
App
.AssertOutputLineEquals("The following Tests are available:");
229
await
App
.AssertOutputLineEquals(" TestNamespace.VSTestXunitTests.VSTestXunitFailTestNetCoreApp");
238
App
.Start(testAsset, ["--verbose", "--property", "TestProperty=123", "build", "/t:TestTarget"]);
240
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
243
Assert.Contains("TestProperty",
App
.Process.Output.Single(line => line.Contains("/t:GenerateWatchList")));
245
App
.AssertOutputContains("dotnet watch ⌚ Command 'build' does not support Hot Reload.");
246
App
.AssertOutputContains("warning : The value of property is '123'");
255
App
.Start(testAsset, ["--verbose", "/p:TestProperty=123", "msbuild", "/t:TestTarget"]);
257
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
260
Assert.DoesNotContain("TestProperty",
App
.Process.Output.Single(line => line.Contains("/t:GenerateWatchList")));
262
App
.AssertOutputContains("dotnet watch ⌚ Command 'msbuild' does not support Hot Reload.");
263
App
.AssertOutputContains("warning : The value of property is '123'");
272
App
.Start(testAsset, ["--verbose", "pack", "-c", "Release"]);
276
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
279
Assert.Contains("-property:Configuration=Release",
App
.Process.Output.Single(line => line.Contains("/t:GenerateWatchList")));
281
App
.AssertOutputContains("dotnet watch ⌚ Command 'pack' does not support Hot Reload.");
282
App
.AssertOutputContains($"Successfully created package '{packagePath}'");
291
App
.Start(testAsset, ["--verbose", "publish", "-c", "Release"]);
293
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
296
Assert.Contains("-property:Configuration=Release",
App
.Process.Output.Single(line => line.Contains("/t:GenerateWatchList")));
298
App
.AssertOutputContains("dotnet watch ⌚ Command 'publish' does not support Hot Reload.");
300
App
.AssertOutputContains(Path.Combine("Release", ToolsetInfo.CurrentTargetFramework, "publish"));
309
App
.DotnetWatchArgs.Clear();
310
App
.Start(testAsset, ["--verbose", "format", "--verbosity", "detailed"]);
312
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
314
App
.AssertOutputContains("dotnet watch ⌚ Command 'format' does not support Hot Reload.");
316
App
.AssertOutputContains("format --verbosity detailed");
317
App
.AssertOutputContains("Format complete in");
338
App
.Start(testAsset, [], "AppWithDeps");
340
await
App
.AssertOutputLineStartsWith("dotnet watch ⌚ Fix the error to continue or press Ctrl+C to exit.");
342
App
.AssertOutputContains(@"dotnet watch 🔨 Failed to load project graph.");
343
App
.AssertOutputContains($"dotnet watch ❌ The project file could not be loaded. Could not find a part of the path '{Path.Combine(testAsset.Path, "AppWithDeps", "NonExistentDirectory", "X.csproj")}'");
352
App
.DotnetWatchArgs.Clear();
353
App
.Start(testAsset, ["--list"]);
354
var lines = await
App
.Process.GetAllOutputLinesAsync(CancellationToken.None);
HotReload\ApplyDeltaTests.cs (279)
22
App
.Start(testAsset, [], "AppWithDeps");
24
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
35
await
App
.WaitForOutputLineContaining(MessageDescriptor.ReEvaluationCompleted);
46
await
App
.AssertOutputLineStartsWith("Changed!");
57
App
.Start(testAsset, [], "AppWithDeps");
59
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
71
await
App
.AssertOutputLineStartsWith("Changed!");
82
App
.Start(testAsset, [], "AppWithDeps");
84
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
90
await
App
.WaitForOutputLineContaining(MessageDescriptor.NoCSharpChangesToApply);
91
App
.AssertOutputContains(MessageDescriptor.ProjectChangeTriggeredReEvaluation);
92
App
.Process.ClearOutput();
108
await
App
.AssertOutputLineStartsWith("Changed!");
109
await
App
.WaitUntilOutputContains($"dotnet watch 🔥 [App.WithDeps ({ToolsetInfo.CurrentTargetFramework})] Hot reload succeeded.");
139
App
.Start(testAsset, ["--non-interactive"], "AppWithDeps");
141
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
142
await
App
.WaitUntilOutputContains($"{symbolName} set");
143
App
.Process.ClearOutput();
147
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
148
App
.AssertOutputContains(MessageDescriptor.ProjectChangeTriggeredReEvaluation);
149
App
.AssertOutputContains("dotnet watch ⌚ [auto-restart] error ENC1102: Changing project setting 'DefineConstants'");
151
await
App
.WaitUntilOutputContains($"{symbolName} not set");
181
App
.Start(testAsset, [], "AppWithDeps");
183
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
184
await
App
.WaitUntilOutputContains("BUILD_CONST_IN_PROPS set");
185
App
.Process.ClearOutput();
191
await
App
.WaitUntilOutputContains($"dotnet watch 🔥 [App.WithDeps ({ToolsetInfo.CurrentTargetFramework})] Hot reload succeeded.");
192
await
App
.WaitUntilOutputContains("BUILD_CONST not set");
194
App
.AssertOutputContains(MessageDescriptor.ProjectChangeTriggeredReEvaluation);
221
App
.Start(testAsset, [], "AppWithDeps");
223
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
224
await
App
.WaitUntilOutputContains("BUILD_CONST_IN_PROPS set");
229
await
App
.WaitForOutputLineContaining(MessageDescriptor.NoCSharpChangesToApply);
230
App
.AssertOutputContains(MessageDescriptor.ProjectChangeTriggeredReEvaluation);
231
App
.Process.ClearOutput();
233
await
App
.AssertOutputLineStartsWith("BUILD_CONST_IN_PROPS not set");
255
App
.Start(testAsset, []);
257
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
258
App
.AssertOutputContains(new Regex(@"dotnet watch ⌚ Exclusion glob: 'AppData/[*][*]/[*][.][*];bin[/\\]+Debug[/\\]+[*][*];obj[/\\]+Debug[/\\]+[*][*];bin[/\\]+[*][*];obj[/\\]+[*][*]"));
259
App
.Process.ClearOutput();
265
await
App
.WaitUntilOutputContains($"dotnet watch ⌚ Ignoring change in excluded file '{appDataFilePath}': Add. Path matches DefaultItemExcludes glob 'AppData/**/*.*' set in '{testAsset.Path}'.");
296
App
.Start(testAsset, []);
298
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
299
App
.AssertOutputContains($"dotnet watch ⌚ Excluded directory: '{binDir}'");
300
App
.AssertOutputContains($"dotnet watch ⌚ Excluded directory: '{objDir}'");
301
App
.Process.ClearOutput();
306
await
App
.WaitUntilOutputContains($"dotnet watch ⌚ Ignoring change in output directory: Add '{binDirFilePath}'");
307
await
App
.WaitUntilOutputContains($"dotnet watch ⌚ Ignoring change in output directory: Add '{objDirFilePath}'");
319
App
.Start(testAsset, []);
321
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
331
await
App
.WaitForOutputLineContaining(MessageDescriptor.UnableToApplyChanges);
340
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded, $"WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})");
342
await
App
.WaitUntilOutputContains(">>> System.Xml.Linq.XDocument");
344
App
.AssertOutputContains(MessageDescriptor.ReEvaluationCompleted);
360
App
.DotnetWatchArgs.Clear();
361
App
.Start(testAsset, ["--verbose", $"-bl:{binLogPath}"], testFlags: TestFlags.None);
363
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
384
await
App
.WaitForOutputLineContaining(MessageDescriptor.ReEvaluationCompleted);
422
App
.Start(testAsset, nonInteractive ? ["--non-interactive"] : []);
424
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
429
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
431
App
.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges);
432
App
.AssertOutputContains($"⌚ [auto-restart] {programPath}(39,11): error ENC0023: Adding an abstract method or overriding an inherited method requires restarting the application.");
433
App
.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exited");
434
App
.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Launched");
435
App
.Process.ClearOutput();
440
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded);
480
App
.Start(testAsset, nonInteractive ? ["--non-interactive"] : []);
482
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
483
await
App
.WaitUntilOutputContains("System.Int32");
484
App
.Process.ClearOutput();
488
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
489
await
App
.WaitUntilOutputContains("System.Byte");
491
App
.AssertOutputContains($"dotnet watch 🕵️ [WatchHotReloadApp ({tfm})] HotReloadException handler installed.");
492
App
.AssertOutputContains($"dotnet watch 🕵️ [WatchHotReloadApp ({tfm})] Runtime rude edit detected:");
494
App
.AssertOutputContains($"dotnet watch ⚠ [WatchHotReloadApp ({tfm})] " +
498
App
.AssertOutputContains(MessageDescriptor.RestartingApplication, $"WatchHotReloadApp ({tfm})");
509
App
.Start(testAsset, [], testFlags: TestFlags.ReadKeyFromStdin);
511
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
512
App
.Process.ClearOutput();
517
await
App
.AssertOutputLineStartsWith(" ❔ Do you want to restart your app? Yes (y) / No (n) / Always (a) / Never (v)", failure: _ => false);
519
App
.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges);
520
App
.AssertOutputContains($"❌ {programPath}(39,11): error ENC0023: Adding an abstract method or overriding an inherited method requires restarting the application.");
521
App
.Process.ClearOutput();
523
App
.SendKey('a');
525
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
527
App
.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exited");
528
App
.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Launched");
529
App
.Process.ClearOutput();
534
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
536
App
.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges);
537
App
.AssertOutputContains($"⌚ [auto-restart] {programPath}(39,1): error ENC0033: Deleting method 'F()' requires restarting the application.");
538
App
.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exited");
539
App
.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Launched");
564
App
.Start(testAsset, nonInteractive ? ["--non-interactive"] : []);
566
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
567
App
.Process.ClearOutput();
572
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
574
App
.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges);
575
App
.AssertOutputContains($"⌚ [auto-restart] {programPath}(17,19): warning ENC0118: Changing 'top-level code' might not have any effect until the application is restarted.");
576
App
.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exited");
577
App
.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Launched");
578
App
.AssertOutputContains("<Updated>");
579
App
.Process.ClearOutput();
584
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded);
602
App
.Start(testAsset, []);
604
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
610
await
App
.WaitUntilOutputContains("<Updated>");
619
App
.Start(testAsset, []);
621
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
625
await
App
.WaitUntilOutputContains("<Updated>");
652
App
.Start(testAsset, []);
654
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
658
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
659
await
App
.AssertOutputLineStartsWith("<Updated>");
663
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
664
await
App
.AssertOutputLineStartsWith("<Updated2>");
674
App
.Start(testAsset, [], "App");
676
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
695
await
App
.AssertOutputLineStartsWith("Updated types: Printer");
718
App
.Start(testAsset, []);
720
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
724
await
App
.WaitForOutputLineContaining("<Updated>");
726
await
App
.WaitUntilOutputContains(
755
App
.DotnetWatchArgs.Clear();
758
App
.Start(testAsset, [], testFlags: TestFlags.ElevateWaitingForChangesMessageSeverity);
760
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
764
await
App
.WaitForOutputLineContaining("<Updated>");
766
await
App
.WaitUntilOutputContains($"dotnet watch ⚠ [WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exception from 'AppUpdateHandler.ClearCache': System.InvalidOperationException: Bug!");
770
await
App
.WaitUntilOutputContains(MessageDescriptor.UpdatesApplied);
775
App
.AssertOutputDoesNotContain("🕵️");
798
App
.Start(testAsset, [], testFlags: TestFlags.ReadKeyFromStdin);
800
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
802
await
App
.WaitUntilOutputContains($"dotnet watch 🕵️ [WatchHotReloadApp ({tfm})] Windows Ctrl+C handling enabled.");
804
await
App
.WaitUntilOutputContains("Started");
806
App
.SendControlC();
808
await
App
.WaitForOutputLineContaining("Ctrl+C detected! Performing cleanup...");
809
await
App
.WaitUntilOutputContains("exited with exit code 0.");
829
App
.Start(testAsset, [], testFlags: TestFlags.ReadKeyFromStdin);
831
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
833
await
App
.WaitUntilOutputContains($"dotnet watch 🕵️ [WatchHotReloadApp ({tfm})] Posix signal handlers registered.");
835
await
App
.WaitUntilOutputContains("Started");
837
App
.SendControlC();
839
await
App
.WaitForOutputLineContaining("SIGTERM detected! Performing cleanup...");
840
await
App
.WaitUntilOutputContains("exited with exit code 0.");
863
App
.Start(testAsset, ["--urls", "http://localhost:" + port], testFlags: TestFlags.MockBrowser);
865
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
867
App
.AssertOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh);
868
App
.AssertOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser);
871
await
App
.WaitUntilOutputContains(MessageDescriptor.LaunchingBrowser.GetMessage($"http://localhost:{port}", ""));
874
App
.AssertOutputContains("dbug: Microsoft.AspNetCore.Watch.BrowserRefresh.BlazorWasmHotReloadMiddleware[0]");
875
App
.AssertOutputContains("dbug: Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserScriptMiddleware[0]");
876
App
.AssertOutputContains("Middleware loaded. Script /_framework/aspnetcore-browser-refresh.js");
877
App
.AssertOutputContains("Middleware loaded. Script /_framework/blazor-hotreload.js");
878
App
.AssertOutputContains("dbug: Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware");
879
App
.AssertOutputContains("Middleware loaded: DOTNET_MODIFIABLE_ASSEMBLIES=debug, __ASPNETCORE_BROWSER_TOOLS=true");
882
App
.AssertOutputDoesNotContain("🕵️");
890
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded, $"blazorwasm ({ToolsetInfo.CurrentTargetFramework})");
895
App
.AssertOutputContains("dotnet watch 🔥 Hot reload capabilities: Baseline AddMethodToExistingType.");
899
App
.AssertOutputContains("dotnet watch 🔥 Hot reload capabilities: Baseline AddMethodToExistingType AddStaticFieldToExistingType NewTypeDefinition ChangeCustomAttributes AddInstanceFieldToExistingType GenericAddMethodToExistingType GenericUpdateMethod UpdateParameters GenericAddFieldToExistingType.");
919
App
.Start(testAsset, ["--urls", "http://localhost:" + port], testFlags: TestFlags.MockBrowser);
921
await
App
.AssertOutputLineStartsWith("dotnet watch ⚠ msbuild: [Warning] Duplicate source file");
922
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
932
App
.Start(testAsset, ["--urls", "http://localhost:" + port, "--non-interactive"], testFlags: TestFlags.ReadKeyFromStdin | TestFlags.MockBrowser);
934
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
936
App
.AssertOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh);
937
App
.AssertOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser);
938
App
.AssertOutputContains(MessageDescriptor.PressCtrlRToRestart);
941
await
App
.WaitUntilOutputContains(MessageDescriptor.LaunchingBrowser.GetMessage($"http://localhost:{port}", ""));
943
App
.SendControlR();
945
await
App
.WaitUntilOutputContains(MessageDescriptor.ReloadingBrowser);
957
App
.Start(testAsset, ["--urls", "http://localhost:" + port], "blazorhosted", testFlags: TestFlags.MockBrowser);
959
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
961
App
.AssertOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh);
962
App
.AssertOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser);
963
App
.AssertOutputContains(MessageDescriptor.ApplicationKind_BlazorHosted);
966
App
.AssertOutputContains($"dotnet watch ⌚ [blazorhosted ({tfm})] Project 'blazorwasm ({tfm})' specifies capabilities: 'Baseline AddMethodToExistingType AddStaticFieldToExistingType NewTypeDefinition ChangeCustomAttributes AddInstanceFieldToExistingType GenericAddMethodToExistingType GenericUpdateMethod UpdateParameters GenericAddFieldToExistingType'");
969
App
.AssertOutputContains($"dotnet watch ⌚ [blazorhosted ({tfm})] Capabilities: 'Baseline AddMethodToExistingType AddStaticFieldToExistingType AddInstanceFieldToExistingType NewTypeDefinition ChangeCustomAttributes UpdateParameters GenericUpdateMethod GenericAddMethodToExistingType GenericAddFieldToExistingType AddFieldRva'");
979
App
.Start(testAsset, ["--urls", "http://localhost:" + port], relativeProjectDirectory: "RazorApp", testFlags: TestFlags.MockBrowser);
981
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
983
App
.AssertOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh);
984
App
.AssertOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser);
985
App
.AssertOutputContains(MessageDescriptor.LaunchingBrowser.GetMessage($"http://localhost:{port}", ""));
986
App
.Process.ClearOutput();
997
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled);
999
App
.AssertOutputContains(MessageDescriptor.SendingStaticAssetUpdateRequest.GetMessage("RazorApp.css"));
1000
App
.AssertOutputContains(MessageDescriptor.HotReloadOfScopedCssSucceeded);
1001
App
.AssertOutputContains(MessageDescriptor.NoCSharpChangesToApply);
1002
App
.Process.ClearOutput();
1007
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled);
1010
App
.AssertOutputContains(MessageDescriptor.SendingStaticAssetUpdateRequest.GetMessage("wwwroot/app.css"));
1011
App
.AssertOutputContains(MessageDescriptor.HotReloadOfStaticAssetsSucceeded);
1012
App
.AssertOutputContains(MessageDescriptor.NoCSharpChangesToApply);
1013
App
.Process.ClearOutput();
1036
App
.Start(testAsset, ["-f", tfm]);
1038
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
1044
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled);
1047
App
.AssertOutputContains("Updates applied: 1 out of 1.");
1048
App
.AssertOutputContains("Microsoft.AspNetCore.Components.HotReload.HotReloadManager.UpdateApplication");
1049
App
.Process.ClearOutput();
1055
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled);
1056
App
.AssertOutputContains("Updates applied: 1 out of 1.");
1057
App
.AssertOutputContains("Microsoft.AspNetCore.Components.WebView.StaticContentHotReloadManager.UpdateContent");
1058
App
.AssertOutputContains("No C# changes to apply.");
1068
App
.Start(testAsset, [], "App");
1070
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
1095
await
App
.AssertOutputLineStartsWith("Updated types: Printer");
1130
App
.Start(testAsset, [], "AppWithDeps");
1132
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
1147
await
App
.AssertOutputLineStartsWith("> Renamed.cs");
1184
App
.Start(testAsset, ["--non-interactive"], "AppWithDeps");
1186
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
1205
await
App
.AssertOutputLineStartsWith("> NewSubdir", failure: _ => false);
1222
App
.Start(testAsset, ["-lp", "http"], relativeProjectDirectory: "WatchAspire.AppHost", testFlags: TestFlags.ReadKeyFromStdin);
1224
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
1227
await
App
.WaitUntilOutputContains("dotnet watch ⭐ Now listening on:");
1230
await
App
.WaitUntilOutputContains("dotnet watch ⭐ Session started: #3");
1231
App
.AssertOutputContains("dotnet watch ⭐ Session started: #1");
1232
App
.AssertOutputContains("dotnet watch ⭐ Session started: #2");
1235
App
.AssertOutputContains("dotnet watch ⭐ [#1] Sending 'sessionTerminated'");
1238
await
App
.WaitUntilOutputContains($"ApiService working directory: '{Path.GetDirectoryName(serviceProjectPath)}'");
1245
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled);
1247
App
.AssertOutputContains("Using Aspire process launcher.");
1248
App
.AssertOutputContains(MessageDescriptor.HotReloadSucceeded, $"WatchAspire.AppHost ({tfm})");
1249
App
.AssertOutputContains(MessageDescriptor.HotReloadSucceeded, $"WatchAspire.ApiService ({tfm})");
1250
App
.AssertOutputContains(MessageDescriptor.HotReloadSucceeded, $"WatchAspire.Web ({tfm})");
1253
Assert.Equal(1,
App
.Process.Output.Count(line => line.StartsWith("dotnet watch ⌚ Launching browser: ")));
1254
App
.Process.ClearOutput();
1261
await
App
.WaitForOutputLineContaining(" ❔ Do you want to restart these projects? Yes (y) / No (n) / Always (a) / Never (v)");
1263
App
.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges);
1264
App
.AssertOutputContains($"dotnet watch ❌ {serviceSourcePath}(40,1): error ENC0020: Renaming record 'WeatherForecast' requires restarting the application.");
1265
App
.AssertOutputContains("dotnet watch ⌚ Affected projects:");
1266
App
.AssertOutputContains("dotnet watch ⌚ WatchAspire.ApiService");
1267
App
.Process.ClearOutput();
1269
App
.SendKey('y');
1271
await
App
.WaitForOutputLineContaining(MessageDescriptor.FixBuildError);
1273
App
.AssertOutputContains("Application is shutting down...");
1275
App
.AssertOutputContains($"[WatchAspire.ApiService ({tfm})] Exited");
1277
App
.AssertOutputContains(MessageDescriptor.Building.GetMessage(serviceProjectPath));
1278
App
.AssertOutputContains("error CS0246: The type or namespace name 'WeatherForecast' could not be found");
1279
App
.Process.ClearOutput();
1286
await
App
.WaitForOutputLineContaining(MessageDescriptor.ProjectsRestarted.GetMessage(1));
1288
App
.AssertOutputContains(MessageDescriptor.BuildSucceeded.GetMessage(serviceProjectPath));
1289
App
.AssertOutputContains(MessageDescriptor.ProjectsRebuilt);
1290
App
.AssertOutputContains($"dotnet watch ⭐ Starting project: {serviceProjectPath}");
1291
App
.Process.ClearOutput();
1293
App
.SendControlC();
1295
await
App
.WaitForOutputLineContaining(MessageDescriptor.ShutdownRequested);
1297
await
App
.WaitUntilOutputContains($"[WatchAspire.ApiService ({tfm})] Exited");
1298
await
App
.WaitUntilOutputContains($"[WatchAspire.AppHost ({tfm})] Exited");
1300
await
App
.WaitUntilOutputContains("dotnet watch ⭐ Waiting for server to shutdown ...");
1302
App
.AssertOutputContains("dotnet watch ⭐ Stop session #1");
1303
App
.AssertOutputContains("dotnet watch ⭐ Stop session #2");
1304
App
.AssertOutputContains("dotnet watch ⭐ Stop session #3");
1305
App
.AssertOutputContains("dotnet watch ⭐ [#2] Sending 'sessionTerminated'");
1306
App
.AssertOutputContains("dotnet watch ⭐ [#3] Sending 'sessionTerminated'");
1320
App
.Start(testAsset, ["-lp", "http", "--non-interactive"], relativeProjectDirectory: "WatchAspire.AppHost");
1322
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
1325
await
App
.WaitUntilOutputContains("dotnet watch ⭐ Session started: #3");
1328
App
.AssertOutputContains("dotnet watch ⭐ Session started: #1");
1329
App
.AssertOutputContains(MessageDescriptor.Exited, $"WatchAspire.MigrationService ({tfm})");
1330
App
.AssertOutputContains("dotnet watch ⭐ [#1] Sending 'sessionTerminated'");
1333
App
.AssertOutputContains("dotnet watch ⭐ [#1] Sending 'serviceLogs': log_message=' Migration complete', is_std_err=False");
1334
App
.AssertOutputDoesNotContain(new Regex("^ +Migration complete"));
1336
App
.Process.ClearOutput();
1341
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled);
1342
await
App
.WaitUntilOutputContains("dotnet watch ⭐ Session started: #3");
1344
App
.AssertOutputContains(MessageDescriptor.ProjectsRestarted.GetMessage(1));
1345
App
.AssertOutputDoesNotContain("⚠");
1348
App
.AssertOutputDoesNotContain($"[WatchAspire.MigrationService ({tfm})]");
1349
App
.AssertOutputDoesNotContain("dotnet watch ⭐ [#1]");
1351
App
.Process.ClearOutput();
1356
await
App
.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled);
1357
App
.AssertOutputContains($"dotnet watch 🕵️ [WatchAspire.Web ({tfm})] Updates applied.");
1358
App
.AssertOutputDoesNotContain(MessageDescriptor.ProjectsRebuilt);
1359
App
.AssertOutputDoesNotContain(MessageDescriptor.ProjectsRestarted);
1360
App
.AssertOutputDoesNotContain("⚠");
1363
App
.AssertOutputDoesNotContain($"[WatchAspire.MigrationService ({tfm})]");
1364
App
.AssertOutputDoesNotContain("dotnet watch ⭐ [#1]");
TestUtilities\DotNetWatchTestBase.cs (3)
26
public DebugTestOutputLogger Logger =>
App
.Logger;
29
=>
App
.Logger.Log(message, testPath, testLine);
62
App
.Dispose();
Watch\GlobbingAppTests.cs (13)
13
App
.Start(testAsset, ["--no-hot-reload"]);
15
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
16
await
App
.WaitUntilOutputContains("Defined types = 2");
17
App
.Process.ClearOutput();
21
await
App
.WaitUntilOutputContains($"Defined types = {expectedTypesAfterOperation}");
76
App
.Start(testAsset, ["--no-hot-reload"]);
78
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
79
await
App
.WaitUntilOutputContains("Defined types = 2");
80
App
.Process.ClearOutput();
86
var fileChanged =
App
.AssertFileChanged();
97
App
.DotnetWatchArgs.Clear();
98
App
.Start(testAsset, ["--list"]);
99
var lines = await
App
.Process.GetAllOutputLinesAsync(CancellationToken.None);
Watch\NoDepsAppTests.cs (13)
16
App
.Start(testAsset, ["--no-hot-reload", "--no-exit"]);
17
var processIdentifier = await
App
.AssertOutputLineStartsWith("Process identifier =");
21
await
App
.AssertStarted();
22
Assert.DoesNotContain(
App
.Process.Output, l => l.StartsWith("Exited with error code"));
24
var processIdentifier2 = await
App
.AssertOutputLineStartsWith("Process identifier =");
34
App
.Start(testAsset, []);
36
var processIdentifier = await
App
.AssertOutputLineStartsWith("Process identifier =");
39
await
App
.AssertExiting();
41
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting);
42
await
App
.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
45
await
App
.AssertStarted();
47
var processIdentifier2 = await
App
.AssertOutputLineStartsWith("Process identifier =");
49
await
App
.AssertExiting(); // process should exit after run