dotnet-installer/test/dotnet-build.Tests/IncrementalTests.cs

203 lines
7.1 KiB
C#
Raw Normal View History

2016-01-14 19:52:54 +00:00
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.IO;
using System.Linq;
using FluentAssertions;
2016-01-14 19:52:54 +00:00
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.Tools.Test.Utilities;
using Xunit;
using Microsoft.DotNet.TestFramework;
2016-01-14 19:52:54 +00:00
namespace Microsoft.DotNet.Tools.Builder.Tests
{
public class IncrementalTests : IncrementalTestBase
{
public IncrementalTests()
2016-01-14 19:52:54 +00:00
{
MainProject = "TestSimpleIncrementalApp";
ExpectedOutput = "Hello World!" + Environment.NewLine;
}
private TestInstance _testInstance;
private void CreateTestInstance()
{
_testInstance = TestAssetsManager.CreateTestInstance("TestSimpleIncrementalApp")
.WithLockFiles();
TestProjectRoot = _testInstance.TestRoot;
2016-01-14 19:52:54 +00:00
}
[Fact]
public void TestNoIncrementalFlag()
2016-01-14 19:52:54 +00:00
{
CreateTestInstance();
2016-01-14 19:52:54 +00:00
var buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
2016-01-14 19:52:54 +00:00
buildResult = BuildProject(noIncremental: true);
2016-01-14 19:52:54 +00:00
Assert.Contains("[Forced Unsafe]", buildResult.StdOut);
}
[Fact]
public void TestRebuildMissingPdb()
{
CreateTestInstance();
2016-01-14 19:52:54 +00:00
TestDeleteOutputWithExtension("pdb");
}
[Fact]
public void TestRebuildMissingDll()
{
CreateTestInstance();
2016-01-14 19:52:54 +00:00
TestDeleteOutputWithExtension("dll");
}
[Fact]
public void TestRebuildMissingXml()
{
CreateTestInstance();
2016-01-14 19:52:54 +00:00
TestDeleteOutputWithExtension("xml");
}
[Fact]
public void TestNoLockFile()
{
CreateTestInstance();
2016-01-14 19:52:54 +00:00
var buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
2016-01-14 19:52:54 +00:00
var lockFile = Path.Combine(TestProjectRoot, "project.lock.json");
2016-01-14 19:52:54 +00:00
Assert.True(File.Exists(lockFile));
File.Delete(lockFile);
Assert.False(File.Exists(lockFile));
buildResult = BuildProject(expectBuildFailure: true);
2016-02-09 18:05:07 +00:00
Assert.Contains("does not have a lock file", buildResult.StdErr);
2016-01-14 19:52:54 +00:00
}
[Fact]
public void TestModifiedVersionFile()
{
CreateTestInstance();
BuildProject().Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
//change version file
var versionFile = Path.Combine(GetIntermediaryOutputPath(), ".SDKVersion");
File.Exists(versionFile).Should().BeTrue();
File.AppendAllText(versionFile, "text");
//assert rebuilt
BuildProject().Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
}
[Fact]
public void TestNoVersionFile()
{
CreateTestInstance();
BuildProject().Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
//delete version file
var versionFile = Path.Combine(GetIntermediaryOutputPath(), ".SDKVersion");
File.Exists(versionFile).Should().BeTrue();
File.Delete(versionFile);
File.Exists(versionFile).Should().BeFalse();
//assert build skipped due to no version file
BuildProject().Should().HaveSkippedProjectCompilation(MainProject, _appFrameworkFullName);
//the version file should have been regenerated during the build, even if compilation got skipped
File.Exists(versionFile).Should().BeTrue();
}
[Fact]
2016-01-14 19:52:54 +00:00
public void TestRebuildChangedLockFile()
{
CreateTestInstance();
2016-01-14 19:52:54 +00:00
var buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
2016-01-14 19:52:54 +00:00
var lockFile = Path.Combine(TestProjectRoot, "project.lock.json");
2016-01-14 19:52:54 +00:00
TouchFile(lockFile);
buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
2016-01-14 19:52:54 +00:00
}
[Fact]
2016-01-14 19:52:54 +00:00
public void TestRebuildChangedProjectFile()
{
CreateTestInstance();
2016-01-14 19:52:54 +00:00
var buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
TouchFile(GetProjectFile(MainProject));
buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
}
// regression for https://github.com/dotnet/cli/issues/965
[Fact]
public void TestInputWithSameTimeAsOutputCausesProjectToCompile()
{
CreateTestInstance();
var buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
2016-01-14 19:52:54 +00:00
var outputTimestamp = SetAllOutputItemsToSameTime();
// set an input to have the same last write time as an output item
// this should trigger recompilation to account for file systems with second timestamp granularity
// (an input file that changed within the same second as the previous outputs should trigger a rebuild)
File.SetLastWriteTime(GetProjectFile(MainProject), outputTimestamp);
2016-01-14 19:52:54 +00:00
buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
}
private DateTime SetAllOutputItemsToSameTime()
{
var now = DateTime.Now;
foreach (var f in Directory.EnumerateFiles(GetCompilationOutputPath()))
{
File.SetLastWriteTime(f, now);
}
return now;
2016-01-14 19:52:54 +00:00
}
private void TestDeleteOutputWithExtension(string extension)
{
var buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
2016-01-14 19:52:54 +00:00
2016-02-03 18:57:25 +00:00
Reporter.Verbose.WriteLine($"Files in {GetBinRoot()}");
foreach (var file in Directory.EnumerateFiles(GetBinRoot()))
2016-01-14 19:52:54 +00:00
{
Reporter.Verbose.Write($"\t {file}");
}
// delete output files with extensions
2016-02-03 18:57:25 +00:00
foreach (var outputFile in Directory.EnumerateFiles(GetBinRoot()).Where(f =>
2016-01-14 19:52:54 +00:00
{
var fileName = Path.GetFileName(f);
return fileName.StartsWith(MainProject, StringComparison.OrdinalIgnoreCase) &&
2016-01-14 19:52:54 +00:00
fileName.EndsWith(extension, StringComparison.OrdinalIgnoreCase);
}))
{
Reporter.Output.WriteLine($"Deleted {outputFile}");
File.Delete(outputFile);
Assert.False(File.Exists(outputFile));
}
// second build; should get rebuilt since we deleted an output item
buildResult = BuildProject();
buildResult.Should().HaveCompiledProject(MainProject, _appFrameworkFullName);
2016-01-14 19:52:54 +00:00
}
}
}