diff --git a/testapp/DthTestProjects/global.json b/TestAssets/ProjectModelServer/DthTestProjects/global.json similarity index 100% rename from testapp/DthTestProjects/global.json rename to TestAssets/ProjectModelServer/DthTestProjects/global.json diff --git a/testapp/DthTestProjects/src/BrokenProjectPathSample/project.json b/TestAssets/ProjectModelServer/DthTestProjects/src/BrokenProjectPathSample/project.json similarity index 79% rename from testapp/DthTestProjects/src/BrokenProjectPathSample/project.json rename to TestAssets/ProjectModelServer/DthTestProjects/src/BrokenProjectPathSample/project.json index be56eab80..4fb61f066 100644 --- a/testapp/DthTestProjects/src/BrokenProjectPathSample/project.json +++ b/TestAssets/ProjectModelServer/DthTestProjects/src/BrokenProjectPathSample/project.json @@ -1,7 +1,7 @@ { "dependencies": { "NETStandard.Library": "1.0.0-rc2-23811", - "EmptyLibrary": "" + "EmptyLibrary": "1.0.0-*" }, "frameworks": { "dnxcore50": { } diff --git a/testapp/DthTestProjects/src/EmptyConsoleApp/Program.cs b/TestAssets/ProjectModelServer/DthTestProjects/src/EmptyConsoleApp/Program.cs similarity index 100% rename from testapp/DthTestProjects/src/EmptyConsoleApp/Program.cs rename to TestAssets/ProjectModelServer/DthTestProjects/src/EmptyConsoleApp/Program.cs diff --git a/testapp/DthTestProjects/src/EmptyConsoleApp/project.json b/TestAssets/ProjectModelServer/DthTestProjects/src/EmptyConsoleApp/project.json similarity index 100% rename from testapp/DthTestProjects/src/EmptyConsoleApp/project.json rename to TestAssets/ProjectModelServer/DthTestProjects/src/EmptyConsoleApp/project.json diff --git a/testapp/DthTestProjects/src/EmptyLibrary/Class.cs b/TestAssets/ProjectModelServer/DthTestProjects/src/EmptyLibrary/Class.cs similarity index 100% rename from testapp/DthTestProjects/src/EmptyLibrary/Class.cs rename to TestAssets/ProjectModelServer/DthTestProjects/src/EmptyLibrary/Class.cs diff --git a/testapp/DthTestProjects/src/EmptyLibrary/project-update.json b/TestAssets/ProjectModelServer/DthTestProjects/src/EmptyLibrary/project-update.json similarity index 100% rename from testapp/DthTestProjects/src/EmptyLibrary/project-update.json rename to TestAssets/ProjectModelServer/DthTestProjects/src/EmptyLibrary/project-update.json diff --git a/testapp/DthTestProjects/src/EmptyLibrary/project.json b/TestAssets/ProjectModelServer/DthTestProjects/src/EmptyLibrary/project.json similarity index 85% rename from testapp/DthTestProjects/src/EmptyLibrary/project.json rename to TestAssets/ProjectModelServer/DthTestProjects/src/EmptyLibrary/project.json index 2a399584b..6e615135d 100644 --- a/testapp/DthTestProjects/src/EmptyLibrary/project.json +++ b/TestAssets/ProjectModelServer/DthTestProjects/src/EmptyLibrary/project.json @@ -1,4 +1,5 @@ { + "version": "1.0.0-*", "dependencies": { }, "frameworks": { "dnxcore50": { diff --git a/testapp/DthTestProjects/src/FailReleaseProject/Program.cs b/TestAssets/ProjectModelServer/DthTestProjects/src/FailReleaseProject/Program.cs similarity index 100% rename from testapp/DthTestProjects/src/FailReleaseProject/Program.cs rename to TestAssets/ProjectModelServer/DthTestProjects/src/FailReleaseProject/Program.cs diff --git a/testapp/DthTestProjects/src/FailReleaseProject/project.json b/TestAssets/ProjectModelServer/DthTestProjects/src/FailReleaseProject/project.json similarity index 100% rename from testapp/DthTestProjects/src/FailReleaseProject/project.json rename to TestAssets/ProjectModelServer/DthTestProjects/src/FailReleaseProject/project.json diff --git a/testapp/DthTestProjects/src/IncompatiblePackageSample/project.json b/TestAssets/ProjectModelServer/DthTestProjects/src/IncompatiblePackageSample/project.json similarity index 100% rename from testapp/DthTestProjects/src/IncompatiblePackageSample/project.json rename to TestAssets/ProjectModelServer/DthTestProjects/src/IncompatiblePackageSample/project.json diff --git a/testapp/DthTestProjects/src/UnresolvedPackageSample/project.json b/TestAssets/ProjectModelServer/DthTestProjects/src/UnresolvedPackageSample/project.json similarity index 100% rename from testapp/DthTestProjects/src/UnresolvedPackageSample/project.json rename to TestAssets/ProjectModelServer/DthTestProjects/src/UnresolvedPackageSample/project.json diff --git a/testapp/DthTestProjects/src/UnresolvedProjectSample/project.json b/TestAssets/ProjectModelServer/DthTestProjects/src/UnresolvedProjectSample/project.json similarity index 70% rename from testapp/DthTestProjects/src/UnresolvedProjectSample/project.json rename to TestAssets/ProjectModelServer/DthTestProjects/src/UnresolvedProjectSample/project.json index 1d5589800..330ce6436 100644 --- a/testapp/DthTestProjects/src/UnresolvedProjectSample/project.json +++ b/TestAssets/ProjectModelServer/DthTestProjects/src/UnresolvedProjectSample/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "EmptyLibrary": "" + "EmptyLibrary": "1.0.0-*" }, "frameworks": { "dnx451": { } diff --git a/testapp/DthUpdateSearchPathSample/ext/Newtonsoft.Json/project.json b/TestAssets/ProjectModelServer/DthUpdateSearchPathSample/ext/Newtonsoft.Json/project.json similarity index 100% rename from testapp/DthUpdateSearchPathSample/ext/Newtonsoft.Json/project.json rename to TestAssets/ProjectModelServer/DthUpdateSearchPathSample/ext/Newtonsoft.Json/project.json diff --git a/testapp/DthUpdateSearchPathSample/home/global.json b/TestAssets/ProjectModelServer/DthUpdateSearchPathSample/home/global.json similarity index 100% rename from testapp/DthUpdateSearchPathSample/home/global.json rename to TestAssets/ProjectModelServer/DthUpdateSearchPathSample/home/global.json diff --git a/testapp/DthUpdateSearchPathSample/home/src/MainProject/project.json b/TestAssets/ProjectModelServer/DthUpdateSearchPathSample/home/src/MainProject/project.json similarity index 100% rename from testapp/DthUpdateSearchPathSample/home/src/MainProject/project.json rename to TestAssets/ProjectModelServer/DthUpdateSearchPathSample/home/src/MainProject/project.json diff --git a/scripts/dotnet-cli-build/TestTargets.cs b/scripts/dotnet-cli-build/TestTargets.cs index 3ceea87e6..0036c397d 100644 --- a/scripts/dotnet-cli-build/TestTargets.cs +++ b/scripts/dotnet-cli-build/TestTargets.cs @@ -28,6 +28,7 @@ namespace Microsoft.DotNet.Cli.Build "dotnet-compile.UnitTests", "dotnet-build.Tests", "dotnet-pack.Tests", + "dotnet-projectmodel-server.Tests", "dotnet-resgen.Tests", "dotnet-run.Tests", "Microsoft.DotNet.Cli.Utils.Tests", @@ -76,8 +77,11 @@ namespace Microsoft.DotNet.Cli.Build .WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "TestAssets", "TestProjects")) .Execute().EnsureSuccessful(); - // The 'testapp' directory contains intentionally-unresolved dependencies, so don't check for success. Also, suppress the output - dotnet.Restore().WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "testapp")).CaptureStdErr().CaptureStdOut().Execute(); + // The 'ProjectModelServer' directory contains intentionally-unresolved dependencies, so don't check for success. Also, suppress the output + dotnet.Restore().WorkingDirectory(Path.Combine(c.BuildContext.BuildDirectory, "TestAssets", "ProjectModelServer")) + .CaptureStdErr() + .CaptureStdOut() + .Execute(); return c.Success(); } diff --git a/test/dotnet-projectmodel-server.Tests/DthTestClient.cs b/test/dotnet-projectmodel-server.Tests/DthTestClient.cs index 7ba65019f..fa60a9624 100644 --- a/test/dotnet-projectmodel-server.Tests/DthTestClient.cs +++ b/test/dotnet-projectmodel-server.Tests/DthTestClient.cs @@ -9,7 +9,6 @@ using System.Net; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Xunit; @@ -34,6 +33,9 @@ namespace Microsoft.DotNet.ProjectModel.Server.Tests public DthTestClient(DthTestServer server) { + // Avoid Socket exception 10006 on Linux + Thread.Sleep(100); + _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); diff --git a/test/dotnet-projectmodel-server.Tests/DthTests.cs b/test/dotnet-projectmodel-server.Tests/DthTests.cs index b137787fc..639fd2d49 100644 --- a/test/dotnet-projectmodel-server.Tests/DthTests.cs +++ b/test/dotnet-projectmodel-server.Tests/DthTests.cs @@ -4,29 +4,51 @@ using System; using System.IO; using System.Linq; -using Microsoft.DotNet.ProjectModel.Server.Tests.Helpers; +using Microsoft.DotNet.ProjectModel.Graph; +using Microsoft.DotNet.TestFramework; +using Microsoft.DotNet.Tools.Test.Utilities; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.PlatformAbstractions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Xunit; namespace Microsoft.DotNet.ProjectModel.Server.Tests { - public class DthTests : IClassFixture + public class DthTests : TestBase { - private readonly TestHelper _testHelper; - - public DthTests(TestHelper helper) + private readonly TestAssetsManager _testAssetsManager; + private readonly ILoggerFactory _loggerFactory; + + public DthTests() { - _testHelper = helper; + _loggerFactory = new LoggerFactory(); + + var testVerbose = Environment.GetEnvironmentVariable("DOTNET_TEST_VERBOSE"); + if (testVerbose == "2") + { + _loggerFactory.AddConsole(LogLevel.Trace); + } + else if (testVerbose == "1") + { + _loggerFactory.AddConsole(LogLevel.Information); + } + else + { + _loggerFactory.AddConsole(LogLevel.Warning); + } + + _testAssetsManager = new TestAssetsManager( + Path.Combine(RepoRoot, "TestAssets", "ProjectModelServer", "DthTestProjects", "src")); } [Fact] public void DthStartup_GetProjectInformation() { - var projectPath = _testHelper.FindSampleProject("EmptyConsoleApp"); + var projectPath = Path.Combine(_testAssetsManager.AssetsRoot, "EmptyConsoleApp"); Assert.NotNull(projectPath); - using (var server = new DthTestServer(_testHelper.LoggerFactory)) + using (var server = new DthTestServer(_loggerFactory)) using (var client = new DthTestClient(server)) { client.Initialize(projectPath); @@ -56,7 +78,7 @@ namespace Microsoft.DotNet.ProjectModel.Server.Tests [InlineData(3, 3)] public void DthStartup_ProtocolNegotiation(int requestVersion, int expectVersion) { - using (var server = new DthTestServer(_testHelper.LoggerFactory)) + using (var server = new DthTestServer(_loggerFactory)) using (var client = new DthTestClient(server)) { client.SetProtocolVersion(requestVersion); @@ -71,7 +93,7 @@ namespace Microsoft.DotNet.ProjectModel.Server.Tests [Fact] public void DthStartup_ProtocolNegotiation_ZeroIsNoAllowed() { - using (var server = new DthTestServer(_testHelper.LoggerFactory)) + using (var server = new DthTestServer(_loggerFactory)) using (var client = new DthTestClient(server)) { client.SetProtocolVersion(0); @@ -92,10 +114,16 @@ namespace Microsoft.DotNet.ProjectModel.Server.Tests string expectedUnresolvedDependency, string expectedUnresolvedType) { - var projectPath = _testHelper.FindSampleProject(testProjectName); + if (PlatformServices.Default.Runtime.OperatingSystemPlatform == Platform.Linux) + { + Console.WriteLine("Test is skipped on Linux"); + return; + } + + var projectPath = Path.Combine(_testAssetsManager.AssetsRoot, testProjectName); Assert.NotNull(projectPath); - using (var server = new DthTestServer(_testHelper.LoggerFactory)) + using (var server = new DthTestServer(_loggerFactory)) using (var client = new DthTestClient(server)) { client.Initialize(projectPath); @@ -149,12 +177,14 @@ namespace Microsoft.DotNet.ProjectModel.Server.Tests [Fact] public void DthNegative_BrokenProjectPathInLockFile() { - using (var server = new DthTestServer(_testHelper.LoggerFactory)) + using (var server = new DthTestServer(_loggerFactory)) using (var client = new DthTestClient(server)) { // After restore the project is copied to another place so that // the relative path in project lock file is invalid. - var movedProjectPath = _testHelper.BuildProjectCopy("BrokenProjectPathSample"); + var movedProjectPath = _testAssetsManager.CreateTestInstance("BrokenProjectPathSample") + .WithLockFiles() + .TestRoot; client.Initialize(movedProjectPath); @@ -177,10 +207,11 @@ namespace Microsoft.DotNet.ProjectModel.Server.Tests [Fact(Skip = "Require dotnet restore integration test")] public void DthDependencies_UpdateGlobalJson_RefreshDependencies() { - var projectPath = _testHelper.CreateSampleProject("DthUpdateSearchPathSample"); + var assets = new TestAssetsManager(Path.Combine(AppContext.BaseDirectory, "TestAssets", "ProjectModelServer")); + var projectPath = assets.CreateTestInstance("DthUpdateSearchPathSample").WithLockFiles().TestRoot; Assert.True(Directory.Exists(projectPath)); - using (var server = new DthTestServer(_testHelper.LoggerFactory)) + using (var server = new DthTestServer(_loggerFactory)) using (var client = new DthTestClient(server)) { var testProject = Path.Combine(projectPath, "home", "src", "MainProject"); @@ -235,10 +266,9 @@ namespace Microsoft.DotNet.ProjectModel.Server.Tests [Fact] public void DthStartup_OpenProjectBeforeRestore() { - var projectPath = _testHelper.BuildProjectCopy("EmptyConsoleApp"); - _testHelper.DeleteLockFile(projectPath); + var projectPath = _testAssetsManager.CreateTestInstance("EmptyConsoleApp").TestRoot; - using (var server = new DthTestServer(_testHelper.LoggerFactory)) + using (var server = new DthTestServer(_loggerFactory)) using (var client = new DthTestClient(server)) { client.Initialize(projectPath); diff --git a/test/dotnet-projectmodel-server.Tests/Helpers/TestHelper.cs b/test/dotnet-projectmodel-server.Tests/Helpers/TestHelper.cs deleted file mode 100644 index b051f2b86..000000000 --- a/test/dotnet-projectmodel-server.Tests/Helpers/TestHelper.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.IO; -using Microsoft.DotNet.ProjectModel.Graph; -using Microsoft.Extensions.Logging; - -namespace Microsoft.DotNet.ProjectModel.Server.Tests.Helpers -{ - public class TestHelper - { - private readonly string _tempPath; - - public TestHelper() - { - LoggerFactory = new LoggerFactory(); - - var testVerbose = Environment.GetEnvironmentVariable("DOTNET_TEST_VERBOSE"); - if (testVerbose == "2") - { - LoggerFactory.AddConsole(LogLevel.Trace); - } - else if (testVerbose == "1") - { - LoggerFactory.AddConsole(LogLevel.Information); - } - else - { - LoggerFactory.AddConsole(LogLevel.Warning); - } - - _tempPath = CreateTempFolder(); - var dthTestProjectsFolder = Path.Combine(FindRoot(), "testapp", "DthTestProjects"); - CopyFiles(dthTestProjectsFolder, _tempPath); - - var logger = LoggerFactory.CreateLogger(); - logger.LogInformation($"Test projects are copied to {_tempPath}"); - } - - public ILoggerFactory LoggerFactory { get; } - - public string FindSampleProject(string name) - { - var result = Path.Combine(_tempPath, "src", name); - if (Directory.Exists(result)) - { - return result; - } - else - { - return null; - } - } - - public string CreateSampleProject(string name) - { - var source = Path.Combine(FindRoot(), "test", name); - if (!Directory.Exists(source)) - { - return null; - } - - var target = Path.Combine(CreateTempFolder(), name); - CopyFiles(source, target); - - return target; - } - - public string BuildProjectCopy(string projectName) - { - var projectPath = FindSampleProject(projectName); - var movedProjectPath = Path.Combine(CreateTempFolder(), projectName); - CopyFiles(projectPath, movedProjectPath); - - return movedProjectPath; - } - - public void DeleteLockFile(string folder) - { - var lockFilePath = Path.Combine(folder, LockFile.FileName); - if (File.Exists(lockFilePath)) - { - File.Delete(lockFilePath); - } - } - - private static string FindRoot() - { - var solutionName = "Microsoft.DotNet.Cli.sln"; - var root = new DirectoryInfo(Directory.GetCurrentDirectory()); - - while (root != null && root.GetFiles(solutionName).Length == 0) - { - root = Directory.GetParent(root.FullName); - } - - if (root != null) - { - return root.FullName; - } - else - { - return null; - } - } - - private static string CreateTempFolder() - { - var result = Path.GetTempFileName(); - File.Delete(result); - Directory.CreateDirectory(result); - - return result; - } - - private static void CopyFiles(string sourceFolder, string targetFolder) - { - if (!Directory.Exists(targetFolder)) - { - Directory.CreateDirectory(targetFolder); - } - - foreach (var filePath in Directory.EnumerateFiles(sourceFolder)) - { - var filename = Path.GetFileName(filePath); - File.Copy(filePath, Path.Combine(targetFolder, filename)); - } - - foreach (var folderPath in Directory.EnumerateDirectories(sourceFolder)) - { - var folderName = new DirectoryInfo(folderPath).Name; - CopyFiles(folderPath, Path.Combine(targetFolder, folderName)); - } - } - } -}