Exemple #1
0
 public ConsoleApiPort(ApiPortClient apiPortClient, ITargetMapper targetMapper, IApiPortOptions options, DocIdSearchRepl repl)
 {
     _apiPortClient = apiPortClient;
     _targetMapper  = targetMapper;
     _options       = options;
     _repl          = repl;
 }
        private static async Task AnalyzeAssembliesAsync(ApiPortClient apiPort, ICommandLineOptions options, IProgressReporter progressReport, IFileWriter writer)
        {
            foreach (var errorInput in options.InvalidInputFiles)
            {
                progressReport.ReportIssue(string.Format(Microsoft.Fx.Portability.Resources.LocalizedStrings.InvalidFileName, errorInput));
            }

            var results = await apiPort.GetAnalysisReportAsync(options);

            var outputPaths = new List <string>();

            foreach (var resultAndFormat in results.Zip(options.OutputFormats, (r, f) => new { Result = r, Format = f }))
            {
                var outputPath = await CreateReport(resultAndFormat.Result, apiPort, options.OutputFileName, resultAndFormat.Format, progressReport, writer);

                outputPaths.Add(outputPath);
            }

            Console.WriteLine();
            Console.WriteLine(LocalizedStrings.OutputWrittenTo);

            foreach (var outputPath in outputPaths)
            {
                Console.WriteLine(outputPath);
            }
        }
        public async Task ListTargetsTest()
        {
            var targets = new List <AvailableTarget> {
                new AvailableTarget {
                    Name = "Target1"
                }, new AvailableTarget {
                    Name = "Target2"
                }
            };
            var progressReporter       = Substitute.For <IProgressReporter>();
            var targetMapper           = Substitute.For <ITargetMapper>();
            var dependencyFinder       = Substitute.For <IDependencyFinder>();
            var reportGenerator        = Substitute.For <IReportGenerator>();
            var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >();
            var writer = Substitute.For <IFileWriter>();

            var apiPortService = Substitute.For <IApiPortService>();

            apiPortService.GetTargetsAsync().Returns(CreateResponse <IEnumerable <AvailableTarget> >(targets.AsReadOnly()));

            var client = new ApiPortClient(apiPortService, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer);

            var actualTargets = await client.GetTargetsAsync();

            Assert.Equal <AvailableTarget[]>(actualTargets.OrderBy(k => k.Name).ToArray(), targets.OrderBy(k => k.Name).ToArray());
        }
Exemple #4
0
        public async Task AnalyzeTest()
        {
            var dependencyResult = Enumerable.Range(0, 10).ToDictionary(
                o => new MemberInfo {
                MemberDocId = "type" + o
            },
                o => Enumerable.Range(0, o).Select(count => new AssemblyInfo {
                AssemblyIdentity = "dependency" + count
            }).ToList() as ICollection <AssemblyInfo>);
            var expectedResult = Enumerable.Range(0, 10).Select(o => Tuple.Create("type" + o, o)).ToList();

            var apiPortService = Substitute.For <IApiPortService>();

            apiPortService.SendAnalysisAsync(Arg.Any <AnalyzeRequest>()).Returns(r =>
            {
                var a = r.Arg <AnalyzeRequest>();

                var foundDocIds = a.Dependencies.Select(o => Tuple.Create(o.Key.MemberDocId, o.Value.Count)).ToList();

                Assert.Equal <IEnumerable <Tuple <string, int> > >(expectedResult.OrderBy(k => k.Item1), foundDocIds.OrderBy(k => k.Item1));
                return(CreateResponse(new AnalyzeResponse()));
            });

            var progressReporter = Substitute.For <IProgressReporter>();
            var targetMapper     = Substitute.For <ITargetMapper>();
            var reportGenerator  = Substitute.For <IReportGenerator>();
            var writer           = Substitute.For <IFileWriter>();

            var dependencyFinder = Substitute.For <IDependencyFinder>();

            dependencyFinder.FindDependencies(Arg.Any <IEnumerable <FileInfo> >(), Arg.Any <IProgressReporter>()).Returns(r =>
            {
                var list   = r.Arg <IEnumerable <FileInfo> >();
                var shared = r.Arg <IProgressReporter>();

                var dependencies = Substitute.For <IDependencyInfo>();

                dependencies.Dependencies.Returns(dependencyResult);
                dependencies.UnresolvedAssemblies.Returns(new Dictionary <string, ICollection <string> >());
                dependencies.UserAssemblies.Returns(Enumerable.Empty <AssemblyInfo>());
                dependencies.AssembliesWithErrors.Returns(Enumerable.Empty <string>());

                return(dependencies);
            });

            var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >();

            var client = new ApiPortClient(apiPortService, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer);

            var options = Substitute.For <IApiPortOptions>();

            options.Targets.Returns(Enumerable.Empty <string>());
            options.InputAssemblies.Returns(Enumerable.Empty <FileInfo>());

            var result = await client.AnalyzeAssembliesAsync(options);
        }
Exemple #5
0
 public ApiPortVsAnalyzer(
     ApiPortClient client,
     OptionsViewModel optionsViewModel,
     OutputWindowWriter outputWindow,
     IReportViewer viewer,
     IProgressReporter reporter)
 {
     _client           = client;
     _optionsViewModel = optionsViewModel;
     _outputWindow     = outputWindow;
     _viewer           = viewer;
     _reporter         = reporter;
 }
Exemple #6
0
 public ApiPortVsAnalyzer(
     ApiPortClient client,
     OptionsViewModel optionsViewModel,
     IOutputWindowWriter outputWindow,
     IReportViewer viewer,
     IProgressReporter reporter,
     IVSThreadingService threadingService)
 {
     _client           = client;
     _optionsViewModel = optionsViewModel;
     _outputWindow     = outputWindow;
     _viewer           = viewer;
     _reporter         = reporter;
     _threadingService = threadingService;
 }
        private static async Task ListOutputFormats(ApiPortClient apiPortClient)
        {
            var outputFormats = await apiPortClient.ListResultFormatsAsync();

            if (outputFormats.Any())
            {
                Console.WriteLine();
                Console.WriteLine(LocalizedStrings.AvailableOutputFormats);

                foreach (var outputFormat in outputFormats)
                {
                    Console.WriteLine(string.Format(LocalizedStrings.TargetsListNoVersion, outputFormat));
                }
            }
        }
        private static async Task ListTargets(ApiPortClient apiPortClient, ITargetMapper targetMapper)
        {
            const string SelectedMarker = "*";

            var targets = await apiPortClient.ListTargets();

            if (targets.Any())
            {
                Console.WriteLine();
                Console.WriteLine(LocalizedStrings.AvailableTargets);

                var expandableTargets = targets.Where(target => target.ExpandedTargets.Any());
                var groupedTargets    = targets.Where(target => !target.ExpandedTargets.Any()).GroupBy(target => target.Name);

                foreach (var item in groupedTargets)
                {
                    Console.WriteLine(LocalizedStrings.TargetsList, item.Key, String.Join(LocalizedStrings.VersionListJoin, item.Select(v => v.Version.ToString() + (v.IsSet ? SelectedMarker : String.Empty))));
                }

                if (expandableTargets.Any())
                {
                    Console.WriteLine();
                    Console.WriteLine(Microsoft.Fx.Portability.Resources.LocalizedStrings.AvailableGroupedTargets);

                    foreach (var item in expandableTargets)
                    {
                        Console.WriteLine(LocalizedStrings.TargetsListGrouped, item.Name, String.Join(CultureInfo.CurrentCulture.TextInfo.ListSeparator + " ", item.ExpandedTargets));
                    }
                }
            }

            if (targetMapper.Aliases.Any())
            {
                Console.WriteLine();
                Console.WriteLine(LocalizedStrings.AvailableAliases);

                foreach (var alias in targetMapper.Aliases)
                {
                    Console.WriteLine(LocalizedStrings.TargetsListNoVersion, alias);
                }
            }

            Console.WriteLine();
            Console.WriteLine(LocalizedStrings.NotesOnUsage);
            Console.WriteLine(LocalizedStrings.TargetsListNoVersion, Microsoft.Fx.Portability.Resources.LocalizedStrings.HowToSpecifyVersion);
            Console.WriteLine();
            Console.WriteLine(LocalizedStrings.TargetsListNoVersion, LocalizedStrings.WhatAsteriskMeans);
        }
Exemple #9
0
        private static async Task UserAssemblyTestsAsync(IEnumerable <AssemblyInfo> assemblies)
        {
            var service                = Substitute.For <IApiPortService>();
            var progressReporter       = Substitute.For <IProgressReporter>();
            var targetMapper           = Substitute.For <ITargetMapper>();
            var dependencyFinder       = Substitute.For <IDependencyFinder>();
            var reportGenerator        = Substitute.For <IReportGenerator>();
            var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >();
            var writer = Substitute.For <IFileWriter>();

            service.SendAnalysisAsync(Arg.Any <AnalyzeRequest>(), Arg.Any <IEnumerable <string> >()).Returns(
                ServiceResponse.Create(Enumerable.Empty <ReportingResultWithFormat>()));

            var client  = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer);
            var options = Substitute.For <IApiPortOptions>();

            IAssemblyFile CreateAssemblyFile(AssemblyInfo assemblyInfo)
            {
                var file = Substitute.For <IAssemblyFile>();

                file.Name.Returns(assemblyInfo.AssemblyIdentity);
                file.Version.Returns(assemblyInfo.FileVersion);
                file.Exists.Returns(true);
                return(file);
            }

            var assemblyFiles = assemblies.Where(a => a.IsExplicitlySpecified).ToImmutableDictionary(CreateAssemblyFile, _ => false);

            options.InputAssemblies.Returns(assemblyFiles);

            var info = Substitute.For <IDependencyInfo>();

            info.UserAssemblies.Returns(assemblies);

            dependencyFinder.FindDependencies(Arg.Any <IEnumerable <IAssemblyFile> >(), progressReporter)
            .Returns(info);

            await client.WriteAnalysisReportsAsync(options);

            Assert.All(assemblies, a =>
            {
                var expected = assemblies.First(t => string.Equals(t.Location, a.Location, StringComparison.OrdinalIgnoreCase)).IsExplicitlySpecified;
                Assert.Equal(expected, a.IsExplicitlySpecified);
            });
        }
        public static async Task AnalyzeAssemblies_DoesNotThrowsOnInvalidOptions_TargetCount()
        {
            var service                = Substitute.For <IApiPortService>();
            var progressReporter       = Substitute.For <IProgressReporter>();
            var targetMapper           = Substitute.For <ITargetMapper>();
            var dependencyFinder       = Substitute.For <IDependencyFinder>();
            var reportGenerator        = Substitute.For <IReportGenerator>();
            var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >();
            var writer = Substitute.For <IFileWriter>();

            var client  = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer);
            var options = Substitute.For <IApiPortOptions>();

            options.Targets.Returns(Enumerable.Range(0, 16).Select(x => x.ToString(CultureInfo.CurrentCulture)));
            options.OutputFormats.Returns(new[] { "HTML" });

            var item = await client.AnalyzeAssembliesAsync(options);
        }
Exemple #11
0
        public async Task WriteAnalysisReports_ThrowsOnInvalidOptions_TargetCount()
        {
            var service                = Substitute.For <IApiPortService>();
            var progressReporter       = Substitute.For <IProgressReporter>();
            var targetMapper           = Substitute.For <ITargetMapper>();
            var dependencyFinder       = Substitute.For <IDependencyFinder>();
            var reportGenerator        = Substitute.For <IReportGenerator>();
            var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >();
            var writer = Substitute.For <IFileWriter>();

            var client  = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer);
            var options = Substitute.For <IApiPortOptions>();

            options.Targets.Returns(Enumerable.Range(0, 16).Select(x => x.ToString()));
            options.OutputFormats.Returns(new[] { "HTML", "Excel" });

            await Assert.ThrowsAsync <InvalidApiPortOptionsException>(() => client.WriteAnalysisReportsAsync(options));

            await Assert.ThrowsAsync <InvalidApiPortOptionsException>(() => client.WriteAnalysisReportsAsync(options, true));
        }
        private static async Task <string> CreateReport(byte[] result, ApiPortClient apiPort, string suppliedOutputFileName, string outputFormat, IProgressReporter progressReport, IFileWriter writer)
        {
            var filePath        = Path.GetFullPath(suppliedOutputFileName);
            var outputDirectory = Path.GetDirectoryName(filePath);
            var outputFileName  = Path.GetFileName(filePath);

            using (var progressTask = progressReport.StartTask(LocalizedStrings.WritingReport))
            {
                try
                {
                    var extension = await apiPort.GetExtensionForFormat(outputFormat);

                    return(await writer.WriteReportAsync(result, extension, outputDirectory, outputFileName, overwrite : false));
                }
                catch (Exception)
                {
                    progressTask.Abort();
                    throw;
                }
            }
        }
Exemple #13
0
        public void OptionsViewModel_TargetCount_Excel()
        {
            var service                = Substitute.For <IApiPortService>();
            var progressReporter       = Substitute.For <IProgressReporter>();
            var targetMapper           = Substitute.For <ITargetMapper>();
            var dependencyFinder       = Substitute.For <IDependencyFinder>();
            var reportGenerator        = Substitute.For <IReportGenerator>();
            var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >();
            var writer = Substitute.For <IFileWriter>();

            var client  = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer);
            var options = Substitute.For <IApiPortOptions>();

            var resultFormats = Enumerable.Range(0, 5)
                                .Select(x => new SelectedResultFormat
            {
                DisplayName   = Invariant($"{nameof(SelectedResultFormat.DisplayName)} {x}"),
                FileExtension = Invariant($".{x}"),
                MimeType      = Invariant($"type-{x}")
            })
                                .ToList();

            var platforms = Enumerable.Range(0, 20).Select(platform =>
            {
                var name     = Invariant($"Platform {platform}");
                var versions = Enumerable.Range(1, 5)
                               .Select(version => new TargetPlatformVersion
                {
                    PlatformName = name,
                    Version      = new Version(version, 0)
                })
                               .ToList();

                return(new TargetPlatform
                {
                    Name = name,
                    Versions = versions
                });
            }).ToList();

            // Select the Excel format and another one.
            resultFormats.Add(new SelectedResultFormat
            {
                DisplayName   = "Excel",
                IsSelected    = true,
                FileExtension = ".xlsx",
                MimeType      = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
            });
            resultFormats.First().IsSelected = true;

            var model = new OptionsModel
            {
                Formats         = resultFormats,
                Platforms       = platforms,
                OutputDirectory = Path.GetTempPath()
            };

            using (var viewModel = new OptionsViewModel(service, targetMapper, model))
            {
                var allPlatforms = platforms.SelectMany(x => x.Versions).ToArray();
                int count        = 1;

                while (count < (ApiPortClient.MaxNumberOfTargets + 2))
                {
                    allPlatforms[count].IsSelected = true;

                    if (count > ApiPortClient.MaxNumberOfTargets)
                    {
                        Assert.True(viewModel.HasError);
                        Assert.True(!string.IsNullOrEmpty(viewModel.ErrorMessage), "There should be an error message set after too many targets selected and the Excel format is selected.");
                    }
                    else
                    {
                        Assert.False(viewModel.HasError);
                        Assert.True(string.IsNullOrEmpty(viewModel.ErrorMessage));
                    }

                    count++;
                }
            }
        }
Exemple #14
0
        public void OptionsViewModel_TargetCount_WhenSelectedAndNot()
        {
            var service                = Substitute.For <IApiPortService>();
            var progressReporter       = Substitute.For <IProgressReporter>();
            var targetMapper           = Substitute.For <ITargetMapper>();
            var dependencyFinder       = Substitute.For <IDependencyFinder>();
            var reportGenerator        = Substitute.For <IReportGenerator>();
            var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >();
            var writer = Substitute.For <IFileWriter>();

            var client  = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer);
            var options = Substitute.For <IApiPortOptions>();

            var platforms = Enumerable.Range(0, 20).Select(platform =>
            {
                var name     = Invariant($"Platform {platform}");
                var versions = Enumerable.Range(1, 5)
                               .Select(version => new TargetPlatformVersion
                {
                    PlatformName = name,
                    Version      = new Version(version, 0),
                    IsSelected   = true
                })
                               .ToList();

                return(new TargetPlatform
                {
                    Name = name,
                    Versions = versions
                });
            }).ToList();

            var excel = new SelectedResultFormat
            {
                DisplayName   = "Excel",
                IsSelected    = true,
                FileExtension = ".xlsx",
                MimeType      = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
            };
            var resultFormats = Enumerable.Range(0, 5)
                                .Select(x => new SelectedResultFormat
            {
                DisplayName   = Invariant($"{nameof(SelectedResultFormat.DisplayName)} {x}"),
                FileExtension = Invariant($".{x}"),
                MimeType      = Invariant($"type-{x}")
            })
                                .ToList();

            // Select the Excel format and another one.
            resultFormats.Add(excel);
            foreach (var format in resultFormats.Take(3))
            {
                format.IsSelected = true;
            }

            var model = new OptionsModel
            {
                Formats         = resultFormats,
                Platforms       = platforms,
                OutputDirectory = Path.GetTempPath()
            };

            using (var viewModel = new OptionsViewModel(service, targetMapper, model))
            {
                // Check that when we select > MaxTargets and Excel is selected, it is in an error state.
                Assert.True(viewModel.HasError);
                Assert.True(!string.IsNullOrEmpty(viewModel.ErrorMessage));

                // Uncheck the excel format
                excel.IsSelected = false;

                // Assert that the viewModel no longer has an error.
                Assert.False(viewModel.HasError);
                Assert.True(string.IsNullOrEmpty(viewModel.ErrorMessage));
            }
        }
Exemple #15
0
        public void OptionsViewModel_TargetCount_NoExcel()
        {
            var service                = Substitute.For <IApiPortService>();
            var progressReporter       = Substitute.For <IProgressReporter>();
            var targetMapper           = Substitute.For <ITargetMapper>();
            var dependencyFinder       = Substitute.For <IDependencyFinder>();
            var reportGenerator        = Substitute.For <IReportGenerator>();
            var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >();
            var writer = Substitute.For <IFileWriter>();

            var client  = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer);
            var options = Substitute.For <IApiPortOptions>();

            var resultFormats = Enumerable.Range(0, 5)
                                .Select(x => new SelectedResultFormat
            {
                DisplayName   = Invariant($"{nameof(SelectedResultFormat.DisplayName)} {x}"),
                FileExtension = Invariant($".{x}"),
                MimeType      = Invariant($"type-{x}")
            })
                                .ToList();

            var platforms = Enumerable.Range(0, 20).Select(platform =>
            {
                var name     = Invariant($"Platform {platform}");
                var versions = Enumerable.Range(1, 5)
                               .Select(version => new TargetPlatformVersion
                {
                    PlatformName = name,
                    Version      = new Version(version, 0)
                })
                               .ToList();

                return(new TargetPlatform
                {
                    Name = name,
                    Versions = versions
                });
            }).ToList();

            // Select the Excel format and another one.
            foreach (var format in resultFormats.Take(3))
            {
                format.IsSelected = true;
            }

            var model = new OptionsModel
            {
                Formats         = resultFormats,
                Platforms       = platforms,
                OutputDirectory = Path.GetTempPath()
            };

            using (var viewModel = new OptionsViewModel(service, targetMapper, model))
            {
                var allPlatforms = platforms.SelectMany(x => x.Versions).ToArray();
                int count        = 1;

                while (count < (ApiPortClient.MaxNumberOfTargets + 2))
                {
                    allPlatforms[count].IsSelected = true;

                    Assert.False(viewModel.HasError);
                    Assert.True(string.IsNullOrEmpty(viewModel.ErrorMessage));

                    count++;
                }
            }
        }
 public ConsoleApiPort(ApiPortClient apiPortClient, ITargetMapper targetMapper, IApiPortOptions options)
 {
     _apiPortClient = apiPortClient;
     _targetMapper  = targetMapper;
     _options       = options;
 }