diff --git a/samples/MusicStore/MusicStore.csproj b/samples/MusicStore/MusicStore.csproj index ebaa672174..4038f21a4d 100644 --- a/samples/MusicStore/MusicStore.csproj +++ b/samples/MusicStore/MusicStore.csproj @@ -7,7 +7,7 @@ netcoreapp2.0;net461 $(DefineConstants);DEMO true - win7-x86;win7-x64;linux-x64;osx-x64 + win7-x86;win7-x64;linux-x64;osx-x64 diff --git a/test/MusicStore.E2ETests/MusicStore.E2ETests.csproj b/test/MusicStore.E2ETests/MusicStore.E2ETests.csproj index f10ed12113..8684b4ccb8 100644 --- a/test/MusicStore.E2ETests/MusicStore.E2ETests.csproj +++ b/test/MusicStore.E2ETests/MusicStore.E2ETests.csproj @@ -14,6 +14,10 @@ + + + + diff --git a/test/MusicStore.E2ETests/SmokeTestsUsingStore/Store.cs b/test/MusicStore.E2ETests/SmokeTestsUsingStore/Store.cs index 00643bf10b..86e4212a15 100644 --- a/test/MusicStore.E2ETests/SmokeTestsUsingStore/Store.cs +++ b/test/MusicStore.E2ETests/SmokeTestsUsingStore/Store.cs @@ -3,25 +3,18 @@ using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; -using System.Reflection; using System.Runtime.InteropServices; -using System.Threading; using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.Extensions.DependencyModel; using Microsoft.Extensions.Logging; -using NuGet.Configuration; -using NuGet.Packaging.Core; -using NuGet.Protocol; -using NuGet.Protocol.Core.Types; -using NuGet.Versioning; namespace E2ETests { internal class Store : IDisposable { - public const string MusicStoreAspNetCoreStoreFeed = "MUSICSTORE_ASPNETCORE_STORE_FEED"; private readonly ILogger _logger; + private string _storeParentDir; private string _storeDir; - private string _tempDir; public Store(ILoggerFactory loggerFactory) { @@ -30,11 +23,11 @@ namespace E2ETests public string CreateStore() { - var storeParentDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); + _storeParentDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - InstallStore(storeParentDir); + InstallStore(_storeParentDir); - _storeDir = Path.Combine(storeParentDir, "store"); + _storeDir = Path.Combine(_storeParentDir, "store"); return _storeDir; } @@ -52,16 +45,10 @@ namespace E2ETests } else { - _logger.LogInformation("Deleting the store..."); - - //RetryHelper.RetryOperation( - // () => Directory.Delete(_storeDir, recursive: true), - // e => _logger.LogError($"Failed to delete directory : {e.Message}"), - // retryCount: 3, - // retryDelayMilliseconds: 100); + _logger.LogInformation($"Deleting the store directory {_storeParentDir}..."); RetryHelper.RetryOperation( - () => Directory.Delete(_tempDir, recursive: true), + () => Directory.Delete(_storeParentDir, recursive: true), e => _logger.LogError($"Failed to delete directory : {e.Message}"), retryCount: 3, retryDelayMilliseconds: 100); @@ -70,80 +57,29 @@ namespace E2ETests public static bool IsEnabled() { - var storeFeed = Environment.GetEnvironmentVariable(MusicStoreAspNetCoreStoreFeed); + var storeFeed = Environment.GetEnvironmentVariable("RUN_RUNTIME_STORE_TESTS"); return !string.IsNullOrEmpty(storeFeed); } private void InstallStore(string storeParentDir) { var packageId = "Build.RS"; - var storeFeed = Environment.GetEnvironmentVariable(MusicStoreAspNetCoreStoreFeed); - if (string.IsNullOrEmpty(storeFeed)) - { - _logger.LogError("The feed for the store package was not provided." + - $"Set the environment variable '{MusicStoreAspNetCoreStoreFeed}' and try again."); - throw new InvalidOperationException( - $"The environment variable '{MusicStoreAspNetCoreStoreFeed}' is not defined or is empty."); - } - else + var runtimeStoreLibrary = DependencyContext.Default.RuntimeLibraries + .Where(library => string.Equals("Build.RS", library.Name, StringComparison.OrdinalIgnoreCase)) + .FirstOrDefault(); + if (runtimeStoreLibrary == null) { - _logger.LogInformation($"Using the feed {storeFeed} for the store package"); + throw new InvalidOperationException($"Could not find the package with id '{packageId}' in {nameof(DependencyContext)}."); } - // Get the version information from the attribute which is typically the same as the nuget package version - // Example: - // [assembly: AssemblyInformationalVersion("2.0.0-preview1-24847")] - var aspnetCoreHttpAssembly = typeof(Microsoft.AspNetCore.Http.FormCollection).Assembly; - var obj = aspnetCoreHttpAssembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), inherit: false).FirstOrDefault(); - var assemblyInformationVersionAttribute = obj as AssemblyInformationalVersionAttribute; - if (assemblyInformationVersionAttribute == null) - { - throw new InvalidOperationException($"Could not find {nameof(assemblyInformationVersionAttribute)} from the assembly {aspnetCoreHttpAssembly.FullName}"); - } - - _logger.LogInformation($"Downloading package with id {packageId} and version {assemblyInformationVersionAttribute.InformationalVersion} from feed {storeFeed}"); - - _tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - var sourceRepository = Repository.Factory.GetCoreV2(new PackageSource(storeFeed)); - var downloadResource = sourceRepository.GetResource(); - var result = downloadResource.GetDownloadResourceResultAsync( - new PackageIdentity(packageId, NuGetVersion.Parse(assemblyInformationVersionAttribute.InformationalVersion)), - new PackageDownloadContext( - new SourceCacheContext() { NoCache = true, DirectDownload = true }, - _tempDir, - directDownload: true), - null, - NuGet.Common.NullLogger.Instance, - CancellationToken.None) - .Result; - - if (result.Status != DownloadResourceResultStatus.Available) - { - _logger.LogError($"Failed to download the package. Status: {result.Status}"); - throw new InvalidOperationException("Unable to download the store package"); - } - - var zipFile = Path.Combine(_tempDir, "Build.RS.zip"); - using (var targetStream = File.Create(zipFile)) - { - using (result.PackageStream) - { - result.PackageStream.CopyTo(targetStream); - } - } - - _logger.LogInformation($"Package downloaded and saved as zip file at {zipFile}"); - - var zipFileExtracted = Path.Combine(_tempDir, "extracted"); - ZipFile.ExtractToDirectory(zipFile, zipFileExtracted); - - _logger.LogInformation($"Package extracted at {zipFileExtracted}"); + var runtimeStoreVersion = runtimeStoreLibrary.Version; + var restoredRuntimeStorePackageDir = Path.Combine(GetNugetPackagesRoot(), runtimeStoreLibrary.Path); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { string fileNameWithExtension = null; - foreach (var file in new DirectoryInfo(zipFileExtracted).GetFiles()) + foreach (var file in new DirectoryInfo(restoredRuntimeStorePackageDir).GetFiles()) { if (file.Name.StartsWith($"{packageId}.winx64")) { @@ -152,7 +88,7 @@ namespace E2ETests var mvcCoreDllEntry = zipArchive.Entries .Where(entry => string.Equals(entry.Name, "Microsoft.AspNetCore.Mvc.Core.dll", StringComparison.OrdinalIgnoreCase)) .FirstOrDefault(); - if (mvcCoreDllEntry != null && mvcCoreDllEntry.FullName.Contains(assemblyInformationVersionAttribute.InformationalVersion)) + if (mvcCoreDllEntry != null && mvcCoreDllEntry.FullName.Contains(runtimeStoreVersion)) { fileNameWithExtension = file.Name; break; @@ -163,11 +99,10 @@ namespace E2ETests if (string.IsNullOrEmpty(fileNameWithExtension)) { - throw new InvalidOperationException( - $"Could not find a store zip file with version {assemblyInformationVersionAttribute.InformationalVersion}"); + throw new InvalidOperationException($"Could not find a store zip file with version {runtimeStoreVersion}"); } - var storeZipFile = Path.Combine(zipFileExtracted, fileNameWithExtension); + var storeZipFile = Path.Combine(restoredRuntimeStorePackageDir, fileNameWithExtension); ZipFile.ExtractToDirectory(storeZipFile, storeParentDir); _logger.LogInformation($"Extracted the store zip file '{storeZipFile}' to '{storeParentDir}'"); } @@ -184,7 +119,7 @@ namespace E2ETests } string fileNameWithExtension = null; - foreach (var file in new DirectoryInfo(zipFileExtracted).GetFiles()) + foreach (var file in new DirectoryInfo(restoredRuntimeStorePackageDir).GetFiles()) { if (file.Name.StartsWith(packageIdPrefix) && !string.Equals($"{packageIdPrefix}.tar.gz", file.Name, StringComparison.OrdinalIgnoreCase)) @@ -197,7 +132,7 @@ namespace E2ETests if (string.IsNullOrEmpty(fileNameWithExtension)) { throw new InvalidOperationException( - $"Could not find a store zip file with version {assemblyInformationVersionAttribute.InformationalVersion}"); + $"Could not find a store zip file with version {runtimeStoreVersion}"); } Directory.CreateDirectory(storeParentDir); @@ -225,5 +160,31 @@ namespace E2ETests } } } + + 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"); + } } } diff --git a/test/MusicStore.E2ETests/SmokeTestsUsingStore/Tests.cs b/test/MusicStore.E2ETests/SmokeTestsUsingStore/Tests.cs index 7caf19f597..3d5205c952 100644 --- a/test/MusicStore.E2ETests/SmokeTestsUsingStore/Tests.cs +++ b/test/MusicStore.E2ETests/SmokeTestsUsingStore/Tests.cs @@ -19,9 +19,9 @@ namespace E2ETests.SmokeTestsUsingStore _output = output; } - [EnvironmentVariableSkipCondition(Store.MusicStoreAspNetCoreStoreFeed, null, SkipOnMatch = false)] + [SkipIfEnvironmentVariableNotEnabled("RUN_RUNTIME_STORE_TESTS")] [ConditionalFact] - [Trait("smoketests", "usestore1")] + [Trait("smoketests", "usestore")] public async Task DefaultLocation_Kestrel() { var tests = new TestHelper(_output); @@ -32,7 +32,7 @@ namespace E2ETests.SmokeTestsUsingStore [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] - [EnvironmentVariableSkipCondition(Store.MusicStoreAspNetCoreStoreFeed, null, SkipOnMatch = false)] + [SkipIfEnvironmentVariableNotEnabled("RUN_RUNTIME_STORE_TESTS")] [ConditionalFact] [Trait("smoketests", "usestore")] public async Task DefaultLocation_WebListener()