public void GivenOnePathToOneDirectory_WhenInThisDirectoryIsNotAnySolution_ThenOneDirectoryNotFoundException_ShouldBeThrown() { var mockFileSystem = new MockFileSystem(); var cut = new ProjectDependencyResolver(mockFileSystem, Mock.Of <IEnvironment>()); Action action = () => cut.ResolveDependencies(@"c:\foo\bar\"); action.Should().Throw <DirectoryNotFoundException>(); }
public void GivenOnePathToOneProjectFile_WhenInThisFileDoesNotExist_ThenOneDirectoryNotFoundException_ShouldBeThrown() { var mockFileSystem = new MockFileSystem(); mockFileSystem.AddDirectory(@"c:\foo\bar"); var cut = new ProjectDependencyResolver(mockFileSystem, Mock.Of <IEnvironment>()); Action action = () => cut.ResolveDependencies(@"c:\foo\bar\aa.fooproj"); action.Should().Throw <FileNotFoundException>(); }
public void GivenOnePathToOneDirectory_WhenThisDirectoryContainsTwoSolutionFiles_ThenOneException_ShouldBeThrown() { var mockFileSystem = new MockFileSystem(); mockFileSystem.AddFile(@"c:\foo\bar\xyz.sln", new MockFileData("")); mockFileSystem.AddFile(@"c:\foo\bar\g.sln", new MockFileData("")); var cut = new ProjectDependencyResolver(mockFileSystem, Mock.Of <IEnvironment>()); Action action = () => cut.ResolveDependencies(@"c:\foo\bar\"); action.Should().Throw <InvalidOperationException>(); }
public void GivenOnePathToOneExistingProjectFile_WhenThisProjectDoesHaveOneProjectAssetsFileProperty_ThenNoException_ShouldBeThrown() { var mockFileSystem = new MockFileSystem(); mockFileSystem.AddFile(@"c:\foo\bar\xyz.csproj", new MockFileData(@"<Project Sdk=""Microsoft.NET.Sdk""> <PropertyGroup> <TargetFrameworks>netstandard1.6;net462;net452</TargetFrameworks> <AssemblyName>Lokad.AzureEventStore</AssemblyName> <RuntimeIdentifiers>win</RuntimeIdentifiers> <OutputType>Library</OutputType> <Company>Lokad</Company> <Copyright>Copyright © Lokad 2019</Copyright> <AssemblyVersion>2.1.0.0</AssemblyVersion> <FileVersion>2.1.0.0</FileVersion> <PackageId>Lokad.AzureEventStore</PackageId> <PackageVersion>2.1.0.0</PackageVersion> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <Authors>Lokad</Authors> <Description>Simple, low-maintenance event sourcing backed by Azure Blob Storage.</Description> <PackageLicenseUrl>https://github.com/Lokad/AzureEventStore/blob/master/LICENSE.txt</PackageLicenseUrl> <PackageProjectUrl>https://github.com/Lokad/AzureEventStore</PackageProjectUrl> <PackageIconUrl>https://raw.githubusercontent.com/Lokad/AzureEventStore/master/lokad.png</PackageIconUrl> <Version>2.1.0</Version> <ProjectAssetsFile Condition="" '$(ProjectAssetsFile)' == '' "">c:\foo\bar\obj\project.assets.json</ProjectAssetsFile> </PropertyGroup> <ItemGroup Condition=""'$(TargetFramework)'=='netstandard1.6'""> <PackageReference Include=""System.Diagnostics.Contracts"" Version=""4.3.0"" /> <PackageReference Include=""System.Diagnostics.TraceSource"" Version=""4.3.0"" /> </ItemGroup> <ItemGroup> <PackageReference Include=""Microsoft.Azure.Storage.Blob"" Version=""9.4.1"" /> <PackageReference Include=""Newtonsoft.Json"" Version=""12.0.1"" /> </ItemGroup> </Project>")); var cut = new ProjectDependencyResolver(mockFileSystem, Mock.Of <IEnvironment>()); mockFileSystem.AddFile(@"c:\foo\bar\obj\project.assets.json", new MockFileData("")); Action action = () => cut.ResolveDependencies(@"c:\foo\bar\xyz.csproj"); action.Should().NotThrow(); }
// ReSharper disable UnusedMember.Local #pragma warning disable IDE0051 // Remove unused private members private async Task <int> OnExecuteAsync() #pragma warning restore IDE0051 // Remove unused private members // ReSharper restore UnusedMember.Local { if (OutputPath is null) { SkipDownloadOfLicenses = true; } IFileInfo?outputFile; if (OutputPath != null) { outputFile = _fileSystem.FileInfo.FromFileName(OutputPath); if (outputFile.Exists) { _reporter.Error("The file to write the output to already exists. Specify another output path or delete the file"); return(1); } } else { outputFile = null; } var cancellationToken = CancellationToken.None; var instances = MSBuildLocator.QueryVisualStudioInstances().ToList(); MSBuildLocator.RegisterMSBuildPath(instances.First().MSBuildPath); _reporter.Output("Resolving dependencies"); var dependencies = _projectDependencyResolver.ResolveDependencies(PathToProjectOrSolution); _reporter.OutputInvariant($"\tcount {dependencies.Count}"); _reporter.Output("Extracting licensing information"); var licenseSpecs = _licenseLocator.Provide(dependencies); _reporter.Output("Correcting license locations"); var correctedLicenseLocations = _uriCorrector.Correct(licenseSpecs.Values.Select(v => v.Item1).Distinct(EqualityComparer <Uri> .Default)); _reporter.OutputInvariant($"Downloading licenses (total {correctedLicenseLocations.Count})"); IImmutableDictionary <Uri, string> licenses; if (SkipDownloadOfLicenses) { _reporter.Output("\tSkipping download"); licenses = ImmutableDictionary <Uri, string> .Empty; } else { licenses = await _downloader.DownloadAsync(correctedLicenseLocations.Values.Select(v => v.corrected), cancellationToken); } var licenseDependencyInformation = new List <LicenseDependencyInformation>(); foreach (var(package, (location, licenseExpression)) in licenseSpecs) { var correctedUrl = correctedLicenseLocations[location].corrected; var content = licenses.FirstOrDefault(l => l.Key == correctedUrl); var dependencyInformation = new LicenseDependencyInformation(package, content.Value ?? string.Empty, location, correctedUrl, licenseExpression); licenseDependencyInformation.Add(dependencyInformation); } if (outputFile != null) { var fileContent = JsonConvert.SerializeObject(licenseDependencyInformation, Formatting.Indented); await using var writer = outputFile.OpenWrite(); var encoding = new UTF8Encoding(false, true); var bytes = encoding.GetBytes(fileContent); await writer.WriteAsync(bytes, 0, bytes.Length, cancellationToken); await writer.FlushAsync(cancellationToken); } else { _reporter.OutputInvariant($"Licenses of {PathToProjectOrSolution}"); foreach (var dependencyInformation in licenseDependencyInformation) { _reporter.OutputInvariant($"dependency {dependencyInformation.PackageReference.Name} (version: {dependencyInformation.PackageReference.ResolvedVersion}, license expression: {dependencyInformation.LicenseExpression})"); } } return(0); }