Skip to content

Commit 2d423fa

Browse files
committed
Better program validation
1 parent c82e5b6 commit 2d423fa

File tree

3 files changed

+180
-39
lines changed

3 files changed

+180
-39
lines changed

src/Basic.CompilerLog.UnitTests/ProgramTests.cs

+134-33
Original file line numberDiff line numberDiff line change
@@ -64,39 +64,39 @@ private void RunWithBoth(Action<string> action)
6464
public void AnalyzersSimple()
6565
{
6666
var (exitCode, output) = RunCompLogEx($"analyzers {Fixture.SolutionBinaryLogPath} -p console.csproj");
67-
Assert.Equal(0, exitCode);
67+
Assert.Equal(Constants.ExitSuccess, exitCode);
6868
Assert.Contains("Microsoft.CodeAnalysis.NetAnalyzers.dll", output);
6969
}
7070

7171
[Fact]
7272
public void AnalyzersHelp()
7373
{
7474
var (exitCode, output) = RunCompLogEx($"analyzers -h");
75-
Assert.Equal(0, exitCode);
75+
Assert.Equal(Constants.ExitSuccess, exitCode);
7676
Assert.StartsWith("complog analyzers [OPTIONS]", output);
7777
}
7878

7979
[Fact]
8080
public void AnalyzersError()
8181
{
8282
var (exitCode, output) = RunCompLogEx($"analyzers {Fixture.RemovedBinaryLogPath}");
83-
Assert.NotEqual(0, exitCode);
83+
Assert.NotEqual(Constants.ExitSuccess, exitCode);
8484
Assert.StartsWith("Unexpected error", output);
8585
}
8686

8787
[Fact]
8888
public void AnalyzerBadOption()
8989
{
9090
var (exitCode, output) = RunCompLogEx($"analyzers {Fixture.RemovedBinaryLogPath} --not-an-option");
91-
Assert.NotEqual(0, exitCode);
91+
Assert.NotEqual(Constants.ExitSuccess, exitCode);
9292
Assert.StartsWith("Extra arguments", output);
9393
}
9494

9595
[Fact]
9696
public void BadCommand()
9797
{
9898
var (exitCode, output) = RunCompLogEx("invalid");
99-
Assert.NotEqual(0, exitCode);
99+
Assert.NotEqual(Constants.ExitSuccess, exitCode);
100100
Assert.Contains(@"""invalid"" is not a valid command", output);
101101
}
102102

@@ -106,7 +106,7 @@ public void BadCommand()
106106
[InlineData("-o custom.complog", "custom.complog")]
107107
public void Create(string extra, string fileName)
108108
{
109-
Assert.Equal(0, RunCompLog($"create {extra} -p {Fixture.ConsoleProjectName} {Fixture.SolutionBinaryLogPath}"));
109+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"create {extra} -p {Fixture.ConsoleProjectName} {Fixture.SolutionBinaryLogPath}"));
110110
var complogPath = Path.Combine(RootDirectory, fileName);
111111
Assert.True(File.Exists(complogPath));
112112
}
@@ -115,7 +115,7 @@ public void Create(string extra, string fileName)
115115
public void CreateProjectFile()
116116
{
117117
RunDotNet("new console --name console -o .");
118-
Assert.Equal(0, RunCompLog($"create console.csproj -o msbuild.complog"));
118+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"create console.csproj -o msbuild.complog"));
119119
var complogPath = Path.Combine(RootDirectory, "msbuild.complog");
120120
using var reader = CompilerLogReader.Create(complogPath, BasicAnalyzerHostOptions.None);
121121
Assert.Single(reader.ReadAllCompilerCalls());
@@ -129,7 +129,7 @@ public void CreateNoopBuild()
129129
{
130130
RunDotNet("new console --name console -o .");
131131
RunDotNet("build");
132-
Assert.Equal(1, RunCompLog($"create console.csproj -o msbuild.complog -- -t:Build"));
132+
Assert.Equal(Constants.ExitFailure, RunCompLog($"create console.csproj -o msbuild.complog -- -t:Build"));
133133
var complogPath = Path.Combine(RootDirectory, "msbuild.complog");
134134
using var reader = CompilerLogReader.Create(complogPath, BasicAnalyzerHostOptions.None);
135135
Assert.Empty(reader.ReadAllCompilerCalls());
@@ -142,7 +142,7 @@ public void CreateWithBuild()
142142
RunCore(Fixture.ConsoleProjectPath);
143143
void RunCore(string filePath)
144144
{
145-
Assert.Equal(0, RunCompLog($"create {filePath} -o msbuild.complog"));
145+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"create {filePath} -o msbuild.complog"));
146146
var complogPath = Path.Combine(RootDirectory, "msbuild.complog");
147147
using var reader = CompilerLogReader.Create(complogPath, BasicAnalyzerHostOptions.None);
148148
Assert.NotEmpty(reader.ReadAllCompilerCalls());
@@ -157,51 +157,51 @@ void RunCore(string filePath)
157157
public void CreateEmpty()
158158
{
159159
var result = RunCompLog($"create -p does-not-exist.csproj {Fixture.SolutionBinaryLogPath}");
160-
Assert.NotEqual(0, result);
160+
Assert.NotEqual(Constants.ExitSuccess, result);
161161
}
162162

163163
[Fact]
164164
public void CreateFullPath()
165165
{
166166
RunDotNet($"new console --name example --output .");
167167
RunDotNet("build -bl -nr:false");
168-
Assert.Equal(0, RunCompLog($"create {GetBinaryLogFullPath()}", RootDirectory));
168+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"create {GetBinaryLogFullPath()}", RootDirectory));
169169
}
170170

171171
[Fact]
172172
public void CreateOverRemovedProject()
173173
{
174-
Assert.Equal(1, RunCompLog($"create {Fixture.RemovedBinaryLogPath}"));
174+
Assert.Equal(Constants.ExitFailure, RunCompLog($"create {Fixture.RemovedBinaryLogPath}"));
175175
}
176176

177177
[Theory]
178178
[InlineData("-h")]
179179
[InlineData("-help")]
180180
public void CreateHelp(string arg)
181181
{
182-
Assert.Equal(1, RunCompLog($"create {arg}"));
182+
Assert.Equal(Constants.ExitFailure, RunCompLog($"create {arg}"));
183183
}
184184

185185
[Fact]
186186
public void CreateExistingComplog()
187187
{
188188
var complogPath = Path.Combine(RootDirectory, "file.complog");
189189
File.WriteAllText(complogPath, "");
190-
Assert.Equal(1, RunCompLog($"create {complogPath}"));
190+
Assert.Equal(Constants.ExitFailure, RunCompLog($"create {complogPath}"));
191191
}
192192

193193
[Fact]
194194
public void CreateExtraArguments()
195195
{
196-
Assert.Equal(1, RunCompLog($"create {Fixture.SolutionBinaryLogPath} extra"));
196+
Assert.Equal(Constants.ExitFailure, RunCompLog($"create {Fixture.SolutionBinaryLogPath} extra"));
197197
}
198198

199199
[Fact]
200200
public void References()
201201
{
202202
RunWithBoth(logPath =>
203203
{
204-
Assert.Equal(0, RunCompLog($"ref -o {RootDirectory} {logPath}"));
204+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"ref -o {RootDirectory} {logPath}"));
205205
Assert.NotEmpty(Directory.EnumerateFiles(Path.Combine(RootDirectory, "console", "refs"), "*.dll"));
206206
Assert.NotEmpty(Directory.EnumerateFiles(Path.Combine(RootDirectory, "console", "analyzers"), "*.dll", SearchOption.AllDirectories));
207207
});
@@ -211,23 +211,47 @@ public void References()
211211
public void ReferencesHelp()
212212
{
213213
var (exitCode, output) = RunCompLogEx($"ref -h");
214-
Assert.Equal(0, exitCode);
214+
Assert.Equal(Constants.ExitSuccess, exitCode);
215215
Assert.StartsWith("complog ref [OPTIONS]", output);
216216
}
217217

218218
[Fact]
219219
public void ReferencesBadOption()
220220
{
221221
var (exitCode, output) = RunCompLogEx($"ref --not-an-option");
222-
Assert.Equal(1, exitCode);
222+
Assert.Equal(Constants.ExitFailure, exitCode);
223223
Assert.Contains("complog ref [OPTIONS]", output);
224224
}
225225

226226
[Fact]
227-
public void ResponseSingle()
227+
public void ResponseSingleLine()
228+
{
229+
var exitCode = RunCompLog($"rsp {Fixture.SolutionBinaryLogPath} -p console.csproj -s");
230+
Assert.Equal(Constants.ExitSuccess, exitCode);
231+
var rsp = Path.Combine(RootDirectory, @".complog", "console", "build.rsp");
232+
Assert.True(File.Exists(rsp));
233+
234+
var lines = File.ReadAllLines(rsp);
235+
Assert.Single(lines);
236+
Assert.Contains("Program.cs", lines[0]);
237+
}
238+
239+
[Fact]
240+
public void ResponseOutputPath()
241+
{
242+
var dir = Root.NewDirectory("output");
243+
var exitCode = RunCompLog($"rsp {Fixture.SolutionBinaryLogPath} -p console.csproj -o {dir}");
244+
Assert.Equal(Constants.ExitSuccess, exitCode);
245+
var rsp = Path.Combine(dir, "console", "build.rsp");
246+
Assert.True(File.Exists(rsp));
247+
Assert.Contains("Program.cs", File.ReadAllLines(rsp));
248+
}
249+
250+
[Fact]
251+
public void ResponseProjectFilter()
228252
{
229253
var exitCode = RunCompLog($"rsp {Fixture.SolutionBinaryLogPath} -p console.csproj");
230-
Assert.Equal(0, exitCode);
254+
Assert.Equal(Constants.ExitSuccess, exitCode);
231255
var rsp = Path.Combine(RootDirectory, @".complog", "console", "build.rsp");
232256
Assert.True(File.Exists(rsp));
233257
Assert.Contains("Program.cs", File.ReadAllLines(rsp));
@@ -237,7 +261,7 @@ public void ResponseSingle()
237261
public void ResponseAll()
238262
{
239263
var exitCode = RunCompLog($"rsp {Fixture.SolutionBinaryLogPath}");
240-
Assert.Equal(0, exitCode);
264+
Assert.Equal(Constants.ExitSuccess, exitCode);
241265
var rsp = Path.Combine(RootDirectory, @".complog", "console", "build.rsp");
242266
Assert.True(File.Exists(rsp));
243267
Assert.Contains("Program.cs", File.ReadAllLines(rsp));
@@ -247,26 +271,28 @@ public void ResponseAll()
247271
public void ResponseHelp()
248272
{
249273
var (exitCode, output) = RunCompLogEx($"rsp -h");
250-
Assert.Equal(0, exitCode);
274+
Assert.Equal(Constants.ExitSuccess, exitCode);
251275
Assert.StartsWith("complog rsp [OPTIONS]", output);
252276
}
253277

254278
[Fact]
255279
public void ResponseBadOption()
256280
{
257281
var (exitCode, output) = RunCompLogEx($"rsp --not-an-option");
258-
Assert.Equal(1, exitCode);
282+
Assert.Equal(Constants.ExitFailure, exitCode);
259283
Assert.Contains("complog rsp [OPTIONS]", output);
260284
}
261285

262-
[Fact]
263-
public void ExportCompilerLog()
286+
[Theory]
287+
[InlineData("")]
288+
[InlineData("--exclude-analyzers")]
289+
public void ExportCompilerLog(string arg)
264290
{
265291
RunWithBoth(logPath =>
266292
{
267293
using var exportDir = new TempDir();
268294

269-
Assert.Equal(0, RunCompLog($"export -o {exportDir.DirectoryPath} {logPath} ", RootDirectory));
295+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"export -o {exportDir.DirectoryPath} {arg} {logPath} ", RootDirectory));
270296

271297
// Now run the generated build.cmd and see if it succeeds;
272298
var exportPath = Path.Combine(exportDir.DirectoryPath, "console", "export");
@@ -275,30 +301,59 @@ public void ExportCompilerLog()
275301
});
276302
}
277303

304+
[Fact]
305+
public void ExportHelp()
306+
{
307+
var (exitCode, output) = RunCompLogEx($"export -h");
308+
Assert.Equal(Constants.ExitSuccess, exitCode);
309+
Assert.StartsWith("complog export [OPTIONS]", output);
310+
}
311+
312+
[Fact]
313+
public void ExportBadOption()
314+
{
315+
var (exitCode, output) = RunCompLogEx($"export --not-an-option");
316+
Assert.Equal(Constants.ExitFailure, exitCode);
317+
Assert.Contains("complog export [OPTIONS]", output);
318+
}
319+
278320
[Fact]
279321
public void Help()
280322
{
281323
var (exitCode, output) = RunCompLogEx($"help");
282-
Assert.Equal(0, exitCode);
324+
Assert.Equal(Constants.ExitSuccess, exitCode);
283325
Assert.StartsWith("complog [command] [args]", output);
284326
}
285327

286328
[Fact]
287329
public void HelpVerbose()
288330
{
289331
var (exitCode, output) = RunCompLogEx($"help -v");
290-
Assert.Equal(0, exitCode);
332+
Assert.Equal(Constants.ExitSuccess, exitCode);
291333
Assert.StartsWith("complog [command] [args]", output);
292334
Assert.Contains("Commands can be passed a .complog, ", output);
293335
}
294336

337+
[Theory]
338+
[InlineData("replay", "")]
339+
[InlineData("replay", "-none")]
340+
[InlineData("replay", "-analyzers")]
341+
[InlineData("replay", "-severity Error")]
342+
[InlineData("emit", "-none")]
343+
[InlineData("diagnostics", "-none")]
344+
public void ReplayWithArgs(string command, string arg)
345+
{
346+
using var emitDir = new TempDir();
347+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"{command} {arg} {Fixture.SolutionBinaryLogPath}"));
348+
}
349+
295350
[Theory]
296351
[InlineData("")]
297352
[InlineData("-none")]
298353
public void ReplayConsoleWithEmit(string arg)
299354
{
300355
using var emitDir = new TempDir();
301-
RunCompLog($"replay {arg} -emit -o {emitDir.DirectoryPath} {Fixture.SolutionBinaryLogPath}");
356+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"replay {arg} -emit -o {emitDir.DirectoryPath} {Fixture.SolutionBinaryLogPath}"));
302357

303358
AssertOutput(@"console\emit\console.dll");
304359
AssertOutput(@"console\emit\console.pdb");
@@ -316,11 +371,45 @@ void AssertOutput(string relativePath)
316371
}
317372
}
318373

374+
[Fact]
375+
public void ReplayHelp()
376+
{
377+
var (exitCode, output) = RunCompLogEx($"replay -h");
378+
Assert.Equal(Constants.ExitSuccess, exitCode);
379+
Assert.StartsWith("complog replay [OPTIONS]", output);
380+
}
381+
382+
[Fact]
383+
public void ReplayBadOption()
384+
{
385+
var (exitCode, output) = RunCompLogEx($"replay --not-an-option");
386+
Assert.Equal(Constants.ExitFailure, exitCode);
387+
Assert.Contains("complog replay [OPTIONS]", output);
388+
}
389+
390+
[Fact]
391+
public void RelpayBadOptionCombination()
392+
{
393+
var (exitCode, output) = RunCompLogEx($"replay -o example");
394+
Assert.Equal(Constants.ExitFailure, exitCode);
395+
Assert.StartsWith("Error: Specified a path", output);
396+
}
397+
398+
[Fact]
399+
public void ReplayWithExport()
400+
{
401+
var (exitCode, output) = RunCompLogEx($"replay {Fixture.ConsoleWithDiagnosticsBinaryLogPath} -export -o {RootDirectory}");
402+
Assert.Equal(Constants.ExitFailure, exitCode);
403+
Assert.Contains("Exporting to", output);
404+
Assert.True(File.Exists(Path.Combine(RootDirectory, "console-with-diagnostics", "export", "build.cmd")));
405+
Assert.True(File.Exists(Path.Combine(RootDirectory, "console-with-diagnostics", "export", "ref", "netstandard.dll")));
406+
}
407+
319408
[Fact]
320409
public void PrintAll()
321410
{
322411
var (exitCode, output) = RunCompLogEx($"print {Fixture.SolutionBinaryLogPath}");
323-
Assert.Equal(0, exitCode);
412+
Assert.Equal(Constants.ExitSuccess, exitCode);
324413
Assert.Contains("console.csproj (net7.0)", output);
325414
Assert.Contains("classlib.csproj (net7.0)", output);
326415
}
@@ -329,24 +418,36 @@ public void PrintAll()
329418
public void PrintOne()
330419
{
331420
var (exitCode, output) = RunCompLogEx($"print {Fixture.SolutionBinaryLogPath} -p classlib.csproj");
332-
Assert.Equal(0, exitCode);
421+
Assert.Equal(Constants.ExitSuccess, exitCode);
333422
Assert.DoesNotContain("console.csproj (net7.0)", output);
334423
Assert.Contains("classlib.csproj (net7.0)", output);
335424
}
336425

426+
/// <summary>
427+
/// Engage the code to find files in the specidied directory
428+
/// </summary>
429+
[Fact]
430+
public void PrintDirectory()
431+
{
432+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"print {Path.GetDirectoryName(Fixture.SolutionBinaryLogPath)}"));
433+
434+
// Make sure this works on a build that will fail!
435+
Assert.Equal(Constants.ExitSuccess, RunCompLog($"print {Path.GetDirectoryName(Fixture.ConsoleWithDiagnosticsProjectPath)}"));
436+
}
437+
337438
[Fact]
338439
public void PrintHelp()
339440
{
340441
var (exitCode, output) = RunCompLogEx($"print -h");
341-
Assert.Equal(0, exitCode);
442+
Assert.Equal(Constants.ExitSuccess, exitCode);
342443
Assert.StartsWith("complog print [OPTIONS]", output);
343444
}
344445

345446
[Fact]
346447
public void PrintError()
347448
{
348449
var (exitCode, output) = RunCompLogEx($"print --not-an-option");
349-
Assert.Equal(1, exitCode);
450+
Assert.Equal(Constants.ExitFailure, exitCode);
350451
Assert.Contains("complog print [OPTIONS]", output);
351452
}
352453

0 commit comments

Comments
 (0)