/// <summary>
 /// Provides the ability to generate delta change manifests between arbitrary build versions.
 /// </summary>
 /// <param name="api">A TeamCityApi.</param>
 /// <param name="externalIssueResolvers">A list of IExternalIssueResolver objects.</param>
 /// <param name="packageChangeComparator">Provides package dependency comparison capability.</param>
 /// <param name="packageBuildMappingCache">Provides the ability to map from a Nuget package to the build that created the package.</param>
 public AggregateBuildDeltaResolver(ITeamCityApi api, IEnumerable <IExternalIssueResolver> externalIssueResolvers, IPackageChangeComparator packageChangeComparator, PackageBuildMappingCache packageBuildMappingCache, List <NuGetPackageChange> traversedPackageChanges)
 {
     _api = api;
     _externalIssueResolvers   = externalIssueResolvers;
     _packageChangeComparator  = packageChangeComparator;
     _packageBuildMappingCache = packageBuildMappingCache;
     _traversedPackageChanges  = traversedPackageChanges;
 }
Exemplo n.º 2
0
        private static void SetNugetPackageDependencyExpectations(ITeamCityApi api, PackageBuildMappingCache cache, BuildTemplate template, IExternalIssueResolver issueResolver)
        {
            var initial = template.StartBuildPackages.Select(p => new TeamCityApi.PackageDetails {
                Id = p.Key, Version = p.Value
            }).ToList();
            var final = template.FinishBuildPackages.Select(p => new TeamCityApi.PackageDetails {
                Id = p.Key, Version = p.Value
            }).ToList();

            if (initial.Any())
            {
                A.CallTo(() => api.GetNuGetDependenciesByBuildTypeAndBuildId(template.BuildId, template.StartBuildNumber.ToString()))
                .Returns(initial);
            }

            if (initial.Any())
            {
                A.CallTo(() => api.GetNuGetDependenciesByBuildTypeAndBuildId(template.BuildId, template.FinishBuildNumber.ToString()))
                .Returns(final);
            }

            if (template.CreateNuGetPackageChangeManifests && initial.Any() && final.Any())
            {
                var packageDiffs = new PackageChangeComparator().GetPackageChanges(initial, final);
                foreach (var diff in packageDiffs.Where(d => d.Type == NuGetPackageChangeType.Modified))
                {
                    if (!cache.PackageBuildMappings.Any(c => c.PackageId.Equals(diff.PackageId) && c.BuildConfigurationId.Equals(diff.PackageId)))
                    {
                        cache.PackageBuildMappings.Add(new PackageBuildMapping
                        {
                            BuildConfigurationId   = diff.PackageId,
                            BuildConfigurationName = diff.PackageId,
                            PackageId = diff.PackageId,
                            Project   = diff.PackageId,
                            ServerUrl = api.TeamCityServer
                        });
                    }

                    SetExpectations(new BuildTemplate
                    {
                        BuildId            = diff.PackageId,
                        BuildCount         = 15,
                        BuildName          = diff.PackageId,
                        BuildNumberPattern = "1.{0}",
                        CreateNuGetPackageChangeManifests = false,
                        StartBuildNumber  = Convert.ToInt16(diff.OldVersion.Split('.')[1]),
                        FinishBuildNumber = Convert.ToInt16(diff.NewVersion.Split('.')[1]),
                        IssueCount        = 1,
                        NestedIssueChance = 100,
                        NestedIssueDepth  = 1,
                    },
                                    api,
                                    issueResolver,
                                    cache);
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Provides a PackageBUildMappingCache that is pre-configured with a set of log outputs, and then automatically builds the cache and passes it back.
        /// </summary>
        /// <param name="servers">A semicolon delimeted list of servers to check.</param>
        /// <param name="useArtifacts">Whether to use artifacts to resolve packages as output of a build.</param>
        /// <param name="logWriteLine">An Action that can be used to output a full line to a log</param>
        /// <param name="logWrite">An Action that can be used to output a partial line to a log</param>
        /// <returns>A PackageBuildMappingCache</returns>
        public static PackageBuildMappingCache BuildPackageMappingCache(string servers, bool useArtifacts, Action <string> logWriteLine, Action <string> logWrite)
        {
            var serverlist = servers.Split(';').ToList();

            if (!serverlist.Any())
            {
                return(null);
            }

            var cache = new PackageBuildMappingCache();

            cache.StartedServerCheck  += (sender, args) => logWriteLine(string.Format("Started Check: {0} with {1} build configurations", args.Url, args.Count));
            cache.FinishedServerCheck += (sender, args) => logWriteLine(string.Format("Finished Check: {0}", args.Url));
            cache.StartedBuildCheck   += (sender, args) => logWrite(string.Format("\r\tStarted Check: {0}", args.Name));
            cache.FinishedBuildCheck  += (sender, args) => logWrite(string.Format("\r\tFinished Check: {0}", args.Name));
            cache.BuildCache(serverlist, useArtifacts);
            return(cache);
        }
Exemplo n.º 4
0
        public static AggregateBuildDeltaResolver CreateMockedAggregateBuildDeltaResolver(IEnumerable <BuildTemplate> buildTemplates)
        {
            const string apiServer = "http://test.server";

            var api = A.Fake <ITeamCityApi>();

            A.CallTo(() => api.TeamCityServer).Returns(apiServer);

            var packageCache = new PackageBuildMappingCache();

            var issueResolver = A.Fake <IExternalIssueResolver>();

            foreach (var template in buildTemplates)
            {
                SetExpectations(template, api, issueResolver, packageCache);
            }

            var resolver = new AggregateBuildDeltaResolver(api, new[] { issueResolver }, new PackageChangeComparator(), packageCache, new List <NuGetPackageChange>());

            return(resolver);
        }
Exemplo n.º 5
0
        private static void SetExpectations(BuildTemplate template, ITeamCityApi api, IExternalIssueResolver issueResolver, PackageBuildMappingCache packageCache)
        {
            var startBuild  = string.Format(template.BuildNumberPattern, template.StartBuildNumber);
            var finishBuild = string.Format(template.BuildNumberPattern, template.FinishBuildNumber);

            //BuildType/Builds/ChangeDetails
            A.CallTo(() => api.GetBuildTypeDetailsById(template.BuildId))
            .Returns(new BuildTypeDetails
            {
                Id          = template.BuildId,
                Name        = template.BuildName,
                Description = template.BuildName,
            });

            var changeDetails = SetupBuildTypeAndBuilds(api, template);

            A.CallTo(() => api.GetChangeDetailsByBuildTypeAndBuildNumber(template.BuildId, startBuild, finishBuild, A <IEnumerable <Build> > .Ignored))
            .Returns(changeDetails.Where(c => Convert.ToInt16(c.Id) > template.StartBuildNumber && Convert.ToInt16(c.Id) <= template.FinishBuildNumber).ToList());

            //Issues
            if (template.IssueCount > 0)
            {
                var issues = Enumerable.Range(1, template.IssueCount).Select(i => new Issue {
                    Id = RandomNumber.Next(2000).ToString()
                }).ToList();

                A.CallTo(() => api.GetIssuesByBuildTypeAndBuildRange(template.BuildId, startBuild, finishBuild, A <IEnumerable <Build> > .Ignored))
                .Returns(issues);

                A.CallTo(issueResolver).WithReturnType <IEnumerable <ExternalIssueDetails> >()
                .Returns(CreateExternalIssueDetails(issues, template));
            }

            //NuGetPackages
            SetNugetPackageDependencyExpectations(api, packageCache, template, issueResolver);
            SetNugetPackageDependencyExpectations(api, packageCache, template, issueResolver);
        }