Install store from artifact dependency

Instead of Build.RS package
This commit is contained in:
John Luo 2017-08-17 19:48:22 -07:00
parent aacd495943
commit 95f37a0edb
5 changed files with 12 additions and 261 deletions

View File

@ -15,10 +15,6 @@
<None Include="remoteDeploymentConfig.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup Condition="'$(RUN_RUNTIME_STORE_TESTS)' == 'true'">
<PackageReference Include="Build.RS" Version="$(AspNetCoreVersion)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="$(AspNetCoreVersion)" />

View File

@ -1,195 +0,0 @@
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Runtime.InteropServices;
using Microsoft.AspNetCore.Server.IntegrationTesting;
using Microsoft.Extensions.DependencyModel;
using Microsoft.Extensions.Logging;
namespace E2ETests
{
internal class Store : IDisposable
{
private readonly ILogger _logger;
private string _storeParentDir;
private string _storeDir;
public Store(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<Store>();
}
public string CreateStore()
{
_storeParentDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
InstallStore(_storeParentDir);
_storeDir = Path.Combine(_storeParentDir, "store");
return _storeDir;
}
public void Dispose()
{
if (string.IsNullOrEmpty(_storeDir))
{
return;
}
if (Helpers.PreservePublishedApplicationForDebugging)
{
_logger.LogInformation("Skipping deleting the store as it has been disabled");
}
else
{
_logger.LogInformation($"Deleting the store directory {_storeParentDir}...");
RetryHelper.RetryOperation(
() => Directory.Delete(_storeParentDir, recursive: true),
e => _logger.LogError($"Failed to delete directory : {e.Message}"),
retryCount: 3,
retryDelayMilliseconds: 100);
}
}
public static bool IsEnabled()
{
var storeFeed = Environment.GetEnvironmentVariable("RUN_RUNTIME_STORE_TESTS");
return !string.IsNullOrEmpty(storeFeed);
}
private void InstallStore(string storeParentDir)
{
var packageId = "Build.RS";
var runtimeStoreLibrary = DependencyContext.Default.RuntimeLibraries
.Where(library => string.Equals(packageId, library.Name, StringComparison.OrdinalIgnoreCase))
.FirstOrDefault();
if (runtimeStoreLibrary == null)
{
throw new InvalidOperationException($"Could not find the package with id '{packageId}' in {nameof(DependencyContext)}.");
}
var runtimeStoreVersion = runtimeStoreLibrary.Version;
var restoredRuntimeStorePackageDir = Path.Combine(GetNugetPackagesRoot(), runtimeStoreLibrary.Path);
_logger.LogInformation($"Location of the restored runtime store package '{packageId}': {restoredRuntimeStorePackageDir}");
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
string fileNameWithExtension = null;
foreach (var file in new DirectoryInfo(restoredRuntimeStorePackageDir).GetFiles())
{
if (file.Name.StartsWith($"{packageId}.winx64"))
{
using (var zipArchive = ZipFile.Open(file.FullName, ZipArchiveMode.Read))
{
var mvcCoreDllEntry = zipArchive.Entries
.Where(entry => string.Equals(entry.Name, "Microsoft.AspNetCore.Mvc.Core.dll", StringComparison.OrdinalIgnoreCase))
.FirstOrDefault();
if (mvcCoreDllEntry != null && mvcCoreDllEntry.FullName.Contains(runtimeStoreVersion))
{
fileNameWithExtension = file.Name;
break;
}
}
}
}
if (string.IsNullOrEmpty(fileNameWithExtension))
{
throw new InvalidOperationException($"Could not find a store zip file with version {runtimeStoreVersion}");
}
var storeZipFile = Path.Combine(restoredRuntimeStorePackageDir, fileNameWithExtension);
ZipFile.ExtractToDirectory(storeZipFile, storeParentDir);
_logger.LogInformation($"Extracted the store zip file '{storeZipFile}' to '{storeParentDir}'");
}
else
{
string packageIdPrefix;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
packageIdPrefix = $"{packageId}.linux";
}
else
{
packageIdPrefix = $"{packageId}.osx";
}
string fileNameWithExtension = null;
var tarFile = $"{packageIdPrefix}.tar.gz";
foreach (var file in new DirectoryInfo(restoredRuntimeStorePackageDir).GetFiles())
{
if (file.Name.StartsWith(packageIdPrefix)
&& !string.Equals(tarFile, file.Name, StringComparison.OrdinalIgnoreCase))
{
fileNameWithExtension = file.FullName;
break;
}
}
if (string.IsNullOrEmpty(fileNameWithExtension))
{
throw new InvalidOperationException(
$"Could not find a store tar file with version {runtimeStoreVersion}");
}
_logger.LogInformation($"Extracting the store tar file '{fileNameWithExtension}' to '{storeParentDir}' ...");
Directory.CreateDirectory(storeParentDir);
var startInfo = new ProcessStartInfo()
{
FileName = "tar",
Arguments = $"xvzf {fileNameWithExtension}",
WorkingDirectory = storeParentDir,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true
};
var tarProcess = new Process() { StartInfo = startInfo };
tarProcess.EnableRaisingEvents = true;
tarProcess.StartAndCaptureOutAndErrToLogger("tar", _logger);
if (tarProcess.HasExited && tarProcess.ExitCode != 0)
{
var message = $"Error occurred while extracting the file '{fileNameWithExtension}' in working directory '{storeParentDir}'";
_logger.LogError(message);
throw new InvalidOperationException(message);
}
}
}
private string GetNugetPackagesRoot()
{
var packageDirectory = Environment.GetEnvironmentVariable("NUGET_PACKAGES");
if (!string.IsNullOrEmpty(packageDirectory))
{
return packageDirectory;
}
string basePath;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
basePath = Environment.GetEnvironmentVariable("USERPROFILE");
}
else
{
basePath = Environment.GetEnvironmentVariable("HOME");
}
if (string.IsNullOrEmpty(basePath))
{
return null;
}
return Path.Combine(basePath, ".nuget", "packages");
}
}
}

View File

@ -1,48 +0,0 @@
using System;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
namespace E2ETests
{
public class StoreSetupFixture : IDisposable
{
private readonly IDisposable _logToken;
private readonly ILogger<StoreSetupFixture> _logger;
private readonly Store _store;
public StoreSetupFixture()
{
if (!Store.IsEnabled())
{
return;
}
var loggerName = nameof(StoreSetupFixture);
var testLog = AssemblyTestLog.ForAssembly(typeof(StoreSetupFixture).Assembly);
ILoggerFactory loggerFactory;
_logToken = testLog.StartTestLog(null, loggerName, out loggerFactory, testName: loggerName);
_logger = loggerFactory.CreateLogger<StoreSetupFixture>();
_store = new Store(loggerFactory);
StoreDirectory = _store.CreateStore();
_logger.LogInformation($"Store was setup at {StoreDirectory}");
}
public string StoreDirectory { get; }
public void Dispose()
{
if (_store != null)
{
_store.Dispose();
}
if (_logToken != null)
{
_logToken.Dispose();
}
}
}
}

View File

@ -1,4 +1,7 @@
using System;
// 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;
using System.Collections.Generic;
using System.IO;
using System.Text;
@ -17,7 +20,7 @@ namespace E2ETests.SmokeTestsUsingStore
{
}
public async Task SmokeTestSuite(ServerType serverType, string storeDirectory)
public async Task SmokeTestSuite(ServerType serverType)
{
var targetFramework = "netcoreapp2.0";
var testName = $"SmokeTestsUsingStore_{serverType}";
@ -48,9 +51,6 @@ namespace E2ETests.SmokeTestsUsingStore
MusicStoreConfig.ConnectionStringKey,
DbUtils.CreateConnectionString(musicStoreDbName)));
deploymentParameters.EnvironmentVariables.Add(
new KeyValuePair<string, string>("DOTNET_SHARED_STORE", storeDirectory));
using (var deployer = ApplicationDeployerFactory.Create(deploymentParameters, loggerFactory))
{
var deploymentResult = await deployer.DeployAsync();

View File

@ -1,21 +1,21 @@
// 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.Threading.Tasks;
using Microsoft.AspNetCore.Server.IntegrationTesting;
using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Extensions.Logging.Testing;
using Xunit;
using Xunit.Abstractions;
namespace E2ETests.SmokeTestsUsingStore
{
public class SmokeTests : IClassFixture<StoreSetupFixture>
public class SmokeTests : LoggedTest
{
private readonly StoreSetupFixture _testFixture;
private readonly ITestOutputHelper _output;
public SmokeTests(
StoreSetupFixture testFixure,
ITestOutputHelper output)
public SmokeTests(ITestOutputHelper output): base(output)
{
_testFixture = testFixure;
_output = output;
}
@ -25,9 +25,7 @@ namespace E2ETests.SmokeTestsUsingStore
public async Task DefaultLocation_Kestrel()
{
var tests = new TestHelper(_output);
await tests.SmokeTestSuite(
ServerType.Kestrel,
_testFixture.StoreDirectory);
await tests.SmokeTestSuite(ServerType.Kestrel);
}
}
}