コード例 #1
0
        public async Task InProgressStored_SameCompleteReturned_LastCompletedRequestedForUpdatedCurrentBuildRequestedSame()
        {
            string requestedPerson = "Nicky";

            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.Completed,
                    Result            = BuildResult.Failed,
                    RequestedFor      = requestedPerson
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId = "1",
                AccountDetails    = CreateAccountDetails(),
                LastCompletedBuildRequestedFor = "Someone else",
                CurrentBuildStatus             = BuildStatus.InProgress
            };
            var buildService = InitializeBuildService(builds);

            await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });

            Assert.AreEqual(requestedPerson, subscribedBuild.CurrentBuildRequestedFor);
            Assert.AreEqual(requestedPerson, subscribedBuild.LastCompletedBuildRequestedFor);
        }
コード例 #2
0
        public async Task NoBuildsStored_OneInProgressNewReturned_OneInProgressUpdate()
        {
            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.InProgress,
                    Id = "1234",
                    LastChangedDate = DateTime.Now
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId = "1",
                Name           = "First Definition",
                AccountDetails = CreateAccountDetails()
            };

            IBuildService buildService = InitializeBuildService(builds);

            IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });

            Assert.AreEqual(1, updates.Count);
            Assert.AreEqual(BuildStatus.InProgress, updates.First().Status);
            Assert.IsNull(updates.First().Result);
            Assert.AreEqual("First Definition", updates.First().Name);
            Assert.AreEqual(BuildStatus.InProgress, subscribedBuild.CurrentBuildStatus);
            Assert.AreEqual(null, subscribedBuild.LastCompletedBuildResult);
            Assert.AreEqual("1234", subscribedBuild.CurrentBuildId);
        }
コード例 #3
0
        public async Task InProgressStored_SameInProgressReturned_NoUpdate()
        {
            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.InProgress,
                    Id = "1234"
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId  = "1",
                CurrentBuildId     = "1234",
                CurrentBuildStatus = BuildStatus.InProgress,
                AccountDetails     = CreateAccountDetails()
            };

            var buildService = InitializeBuildService(builds);

            IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });


            Assert.AreEqual(0, updates.Count);
            Assert.AreEqual(BuildStatus.InProgress, subscribedBuild.CurrentBuildStatus);
            Assert.AreEqual(null, subscribedBuild.LastCompletedBuildResult);
            Assert.AreEqual("1234", subscribedBuild.CurrentBuildId);
        }
コード例 #4
0
        public async Task NoBuildsStored_OneCompletedOldReturned_NoUpdate()
        {
            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Id              = "1234",
                    Status          = BuildStatus.Completed,
                    Result          = BuildResult.Canceled,
                    LastChangedDate = DateTime.Now.AddDays(-1)
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId = "1",
                AccountDetails    = CreateAccountDetails()
            };

            var buildService = InitializeBuildService(builds);

            IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });

            Assert.AreEqual(0, updates.Count);
            Assert.AreEqual(BuildStatus.Completed, subscribedBuild.CurrentBuildStatus);
            Assert.AreEqual(BuildResult.Canceled, subscribedBuild.LastCompletedBuildResult);
            Assert.AreEqual("1234", subscribedBuild.CurrentBuildId);
        }
コード例 #5
0
        public async Task NoBuildStored_OneNewInComplete_CurrentBuildAndLastCompletedRequestedForUpdated()
        {
            string requestedPerson = "Nicky";

            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.Completed,
                    Result            = BuildResult.Failed,
                    RequestedFor      = requestedPerson
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId = "1",
                AccountDetails    = CreateAccountDetails()
            };
            var buildService = InitializeBuildService(builds);

            await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });

            Assert.AreEqual(requestedPerson, subscribedBuild.CurrentBuildRequestedFor);
            Assert.AreEqual(requestedPerson, subscribedBuild.LastCompletedBuildRequestedFor);
        }
コード例 #6
0
 private BuildUpdate CreateUpdate(SubscribedBuild subscribedBuild, Build build)
 {
     return(new BuildUpdate
     {
         Name = subscribedBuild.Name,
         Id = subscribedBuild.BuildDefinitionId,
         RequestedFor = build.RequestedFor,
         Result = build.Result,
         Status = build.Status,
         BuildUrl = build.BuildUrl
     });
 }
コード例 #7
0
        private IList <BuildUpdate> CheckForUpdateInternal(List <Build> buildList, SubscribedBuild subscribedBuild)
        {
            IList <BuildUpdate> updates = new List <BuildUpdate>();

            List <Build> orderedBuilds     = buildList.OrderByDescending(b => b.LastChangedDate).ToList();
            Build        latestBuild       = orderedBuilds.First(); // this method is only called if at least one build
            Build        secondLatestBuild = orderedBuilds.Count < 2 ? null : orderedBuilds.Last();

            bool haveNotSeenEitherBuild = subscribedBuild.CurrentBuildId == null ||
                                          (!subscribedBuild.CurrentBuildId.Equals(latestBuild?.Id) &&
                                           !subscribedBuild.CurrentBuildId.Equals(secondLatestBuild?.Id));

            bool oneBuildIsCurrent = subscribedBuild.CurrentBuildId != null &&
                                     (subscribedBuild.CurrentBuildId.Equals(latestBuild.Id) ||
                                      (secondLatestBuild != null &&
                                       subscribedBuild.CurrentBuildId.Equals(secondLatestBuild.Id)));

            Build currentBuild = oneBuildIsCurrent
                ? (subscribedBuild.CurrentBuildId.Equals(latestBuild.Id)
                    ? latestBuild
                    : secondLatestBuild)
                : null;

            if (haveNotSeenEitherBuild)
            {
                UpdateSubscribedBuild(subscribedBuild, latestBuild);

                if (latestBuild != null && latestBuild.LastChangedDate > DateTime.Now.AddSeconds(-10))
                {
                    updates.Add(CreateUpdate(subscribedBuild, latestBuild));
                }
            }
            else if (oneBuildIsCurrent)
            {
                // Send update if older build changed
                if (currentBuild == secondLatestBuild && secondLatestBuild.Status != subscribedBuild.CurrentBuildStatus)
                {
                    subscribedBuild.LastCompletedBuildResult = secondLatestBuild.Result;
                    UpdateSubscribedBuild(subscribedBuild, secondLatestBuild);
                    updates.Add(CreateUpdate(subscribedBuild, secondLatestBuild));
                }

                if (currentBuild == secondLatestBuild || latestBuild.Status != subscribedBuild.CurrentBuildStatus)
                {
                    UpdateSubscribedBuild(subscribedBuild, latestBuild);
                    updates.Add(CreateUpdate(subscribedBuild, latestBuild));
                }
            }
            return(updates);
        }
コード例 #8
0
        public async Task <IList <BuildUpdate> > CheckForUpdatedBuilds(IList <SubscribedBuild> subscribedBuilds)
        {
            List <List <SubscribedBuild> > groupedBuilds = subscribedBuilds.GroupBy(b => new
            {
                b.AccountDetails.AccountName,
                b.AccountDetails.ProjectId
            })
                                                           .Select(grp => grp.ToList())
                                                           .ToList();

            var updates = new List <BuildUpdate>();

            foreach (List <SubscribedBuild> groupedBuild in groupedBuilds)
            {
                IList <Build> buildsForAccount =
                    await
                    _vsoClient.GetBuilds(groupedBuild.First().AccountDetails,
                                         groupedBuild.Select(g => g.BuildDefinitionId).ToList());

                List <List <Build> > buildsByDefinition = buildsForAccount
                                                          .GroupBy(b => b.BuildDefinitionId)
                                                          .Select(grp => grp.ToList())
                                                          .ToList();

                foreach (List <Build> buildList in buildsByDefinition)
                {
                    if (!buildList.Any())
                    {
                        continue;
                    }

                    SubscribedBuild subscribedBuildToUpdate = subscribedBuilds.Single(sb => sb.BuildDefinitionId == buildList.First().BuildDefinitionId);
                    updates.AddRange(CheckForUpdateInternal(buildList, subscribedBuildToUpdate));
                }
            }

            SaveSubscribedBuilds(subscribedBuilds);

            if (!GetNotifyOnStart())
            {
                updates.RemoveAll(u => u.Result == null);
            }

            if (!GetNotifyOnFinish())
            {
                updates.RemoveAll(u => u.Result != null);
            }

            return(updates);
        }
コード例 #9
0
        private void UpdateSubscribedBuilds(AccountSubscriptionUpdate update)
        {
            IList <Account>         accounts = update.Accounts;
            IList <SubscribedBuild> existingSubscribedBuilds = GetSubscribedBuilds();
            IList <SubscribedBuild> newSubscribedBuilds      = new List <SubscribedBuild>();

            foreach (Account account in accounts)
            {
                foreach (Project project in account.Projects)
                {
                    foreach (BuildDefinition buildDefinition in project.Builds)
                    {
                        if (buildDefinition.IsSelected == null || !buildDefinition.IsSelected.Value)
                        {
                            continue;
                        }

                        SubscribedBuild existingSubscribedBuild =
                            existingSubscribedBuilds.SingleOrDefault(
                                x =>
                                x.BuildDefinitionId == buildDefinition.Id &&
                                x.AccountDetails.ProjectId == project.Id &&
                                x.AccountDetails.AccountName == account.Name);

                        if (existingSubscribedBuild != null)
                        {
                            newSubscribedBuilds.Add(existingSubscribedBuild);
                        }
                        else
                        {
                            newSubscribedBuilds.Add(new SubscribedBuild
                            {
                                AccountDetails = new AccountDetails
                                {
                                    AccountName        = account.Name,
                                    ProjectId          = project.Id,
                                    EncodedCredentials = account.EncodedCredentials,
                                    ProjectName        = project.Name
                                },
                                BuildDefinitionId = buildDefinition.Id,
                                Name = buildDefinition.Name
                            });
                        }
                    }
                }
            }

            SaveSubscribedBuilds(newSubscribedBuilds);
        }
コード例 #10
0
        public async Task InProgressStored_SameCompleteFailOldCompleteReturned_OneCompleteFailUpdate()
        {
            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Result            = BuildResult.Failed,
                    Status            = BuildStatus.Completed,
                    Id = "1234",
                    LastChangedDate = DateTime.Now
                },
                new Build
                {
                    BuildDefinitionId = "1",
                    Result            = BuildResult.Succeeded,
                    Status            = BuildStatus.Completed,
                    Id = "4567",
                    LastChangedDate = DateTime.Now.AddMinutes(-1)
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId  = "1",
                CurrentBuildId     = "1234",
                CurrentBuildStatus = BuildStatus.InProgress,
                Name           = "First Definition",
                AccountDetails = CreateAccountDetails()
            };

            var buildService = InitializeBuildService(builds);

            IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });


            Assert.AreEqual(1, updates.Count);
            Assert.AreEqual(BuildStatus.Completed, updates.First().Status);
            Assert.AreEqual(BuildResult.Failed, updates.First().Result);
            Assert.AreEqual("First Definition", updates.First().Name);
            Assert.AreEqual(BuildStatus.Completed, subscribedBuild.CurrentBuildStatus);
            Assert.AreEqual(BuildResult.Failed, subscribedBuild.LastCompletedBuildResult);
            Assert.AreEqual("1234", subscribedBuild.CurrentBuildId);
        }
コード例 #11
0
        public async Task InProgressStored_SameCompleteNewInProgressReturned_CompleteInProgressUpdates()
        {
            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.InProgress,
                    Id = "1234",
                    LastChangedDate = DateTime.Now
                },
                new Build
                {
                    BuildDefinitionId = "1",
                    Result            = BuildResult.Succeeded,
                    Status            = BuildStatus.Completed,
                    Id = "4567",
                    LastChangedDate = DateTime.Now.AddMinutes(-1)
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId        = "1",
                CurrentBuildId           = "4567",
                CurrentBuildStatus       = BuildStatus.InProgress,
                LastCompletedBuildResult = BuildResult.Failed,
                Name           = "First Definition",
                AccountDetails = CreateAccountDetails()
            };

            var buildService = InitializeBuildService(builds);

            IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });


            Assert.AreEqual(2, updates.Count);
            Assert.IsTrue(updates.Any(u => u.Status == BuildStatus.Completed && u.Result == BuildResult.Succeeded && u.Name == "First Definition"));
            Assert.IsTrue(updates.Any(u => u.Status == BuildStatus.InProgress && u.Result == null && u.Name == "First Definition"));
            Assert.AreEqual(BuildStatus.InProgress, subscribedBuild.CurrentBuildStatus);
            Assert.AreEqual(BuildResult.Succeeded, subscribedBuild.LastCompletedBuildResult);
            Assert.AreEqual("1234", subscribedBuild.CurrentBuildId);
        }
コード例 #12
0
        private void UpdateSubscribedBuild(SubscribedBuild subscribedBuild, Build build)
        {
            if (subscribedBuild.CurrentBuildStatus != build.Status)
            {
                subscribedBuild.LastBuildStatusChangeTime = build.LastChangedDate;

                if (build.Result != null)
                {
                    subscribedBuild.LastCompletedBuildResult       = build.Result;
                    subscribedBuild.LastCompletedBuildRequestedFor = build.RequestedFor;
                    subscribedBuild.LastBuildResultChangeTime      = build.LastChangedDate;
                }
            }

            subscribedBuild.CurrentBuildId           = build.Id;
            subscribedBuild.CurrentBuildStatus       = build.Status;
            subscribedBuild.CurrentBuildRequestedFor = build.RequestedFor;
        }
コード例 #13
0
        public async Task SuccessStored_TwoCompleteReturnedNotNew_NoUpdate()
        {
            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.Completed,
                    Result            = BuildResult.Succeeded,
                    Id = "1234",
                    LastChangedDate = DateTime.Now
                },
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.Completed,
                    Result            = BuildResult.Succeeded,
                    Id = "5678",
                    LastChangedDate = DateTime.Now.AddMinutes(-1)
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId        = "1",
                CurrentBuildId           = "1234",
                LastCompletedBuildResult = BuildResult.Succeeded,
                CurrentBuildStatus       = BuildStatus.Completed,
                Name           = "First Definition",
                AccountDetails = CreateAccountDetails()
            };

            var buildService = InitializeBuildService(builds);

            IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });


            Assert.AreEqual(0, updates.Count);
            Assert.AreEqual(BuildStatus.Completed, subscribedBuild.CurrentBuildStatus);
            Assert.AreEqual(BuildResult.Succeeded, subscribedBuild.LastCompletedBuildResult);
            Assert.AreEqual("1234", subscribedBuild.CurrentBuildId);
        }
コード例 #14
0
        public async Task InProgressStored_SameCompleteAndNewInProgressReturned_BothRequestedForUpdated()
        {
            string firstRequestedPerson  = "Nicky";
            string secondRequestedPerson = "Another Nicky";

            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.InProgress,
                    RequestedFor      = secondRequestedPerson,
                    LastChangedDate   = DateTime.Now,
                    Id = "5678"
                },
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.Completed,
                    Result            = BuildResult.PartiallySucceeded,
                    RequestedFor      = firstRequestedPerson,
                    LastChangedDate   = DateTime.Now.AddMinutes(-1),
                    Id = "1234"
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId              = "1",
                AccountDetails                 = CreateAccountDetails(),
                CurrentBuildStatus             = BuildStatus.InProgress,
                LastCompletedBuildRequestedFor = "Someone",
                CurrentBuildRequestedFor       = "Someone else",
                CurrentBuildId                 = "1234"
            };
            var buildService = InitializeBuildService(builds);

            await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });

            Assert.AreEqual(secondRequestedPerson, subscribedBuild.CurrentBuildRequestedFor);
            Assert.AreEqual(firstRequestedPerson, subscribedBuild.LastCompletedBuildRequestedFor);
        }
コード例 #15
0
        public async Task CompleteStored_NewInProgressReturned_CurrentRequestedForUdatedOnly()
        {
            string firstRequestedPerson  = "Nicky";
            string secondRequestedPerson = "Another Nicky";

            IList <Build> builds = new List <Build>
            {
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.InProgress,
                    RequestedFor      = secondRequestedPerson,
                    Id = "5678"
                },
                new Build
                {
                    BuildDefinitionId = "1",
                    Status            = BuildStatus.Completed,
                    Result            = BuildResult.PartiallySucceeded,
                    RequestedFor      = firstRequestedPerson,
                    Id = "1234"
                }
            };

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId              = "1",
                AccountDetails                 = CreateAccountDetails(),
                CurrentBuildStatus             = BuildStatus.Completed,
                LastCompletedBuildRequestedFor = firstRequestedPerson,
                CurrentBuildRequestedFor       = firstRequestedPerson,
                CurrentBuildId                 = "1234"
            };
            var buildService = InitializeBuildService(builds);

            await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });

            Assert.AreEqual(secondRequestedPerson, subscribedBuild.CurrentBuildRequestedFor);
            Assert.AreEqual(firstRequestedPerson, subscribedBuild.LastCompletedBuildRequestedFor);
        }
コード例 #16
0
        public async Task NoBuildsStored_NoBuildsReturned_NoUpdate()
        {
            IList <Build> builds = new List <Build>();

            SubscribedBuild subscribedBuild = new SubscribedBuild
            {
                BuildDefinitionId = "1",
                AccountDetails    = CreateAccountDetails()
            };

            IBuildService       buildService = InitializeBuildService(builds);
            IList <BuildUpdate> updates      = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> {
                subscribedBuild
            });

            Assert.AreEqual(0, updates.Count);
            Assert.AreEqual(null, subscribedBuild.CurrentBuildStatus);
            Assert.AreEqual(null, subscribedBuild.LastCompletedBuildResult);
            Assert.AreEqual(null, subscribedBuild.CurrentBuildId);
        }