Skip to content

Commit

Permalink
Fix all failing tests in validating revisions
Browse files Browse the repository at this point in the history
  • Loading branch information
MrHinsh committed Mar 13, 2024
1 parent cdb6fe9 commit bb4936f
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 57 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MigrationTools.DataContracts;
Expand Down Expand Up @@ -31,18 +32,16 @@ private static TfsRevisionManagerOptions GetTfsRevisionManagerOptions()
return migrationConfig;
}

private static WorkItemData GetWorkItemWithRevisions(DateTime currentDateTime, int startHours = 1, int endHours = 1, bool dateIncreasing = true)
private static List<RevisionItem> GetWorkItemWithRevisions(DateTime currentDateTime, int startHours = 1, int endHours = 1, bool dateIncreasing = true)
{
var fakeWorkItem = new WorkItemData();
fakeWorkItem.Id = Guid.NewGuid().ToString();
fakeWorkItem.Revisions = new System.Collections.Generic.SortedDictionary<int, RevisionItem>();
var revisions = new System.Collections.Generic.SortedDictionary<int, RevisionItem>();
for (int i = startHours; i < endHours + startHours; i++)
{
DateTime dateTime = dateIncreasing ? currentDateTime.AddHours(-i) : currentDateTime;
fakeWorkItem.Revisions.Add(i, new RevisionItem() { Index = i, Number = i, ChangedDate = dateTime, OriginalChangedDate = dateTime });
DateTime dateTime = dateIncreasing ? currentDateTime.AddHours(i) : currentDateTime;
revisions.Add(i, new RevisionItem() { Index = i, Number = i, ChangedDate = dateTime, OriginalChangedDate = dateTime });
}

return fakeWorkItem;
return revisions.Values.ToList();
}


Expand All @@ -54,8 +53,8 @@ public void TfsRevisionManagerInSync1()
processorEnricher.Configure(peOptions);

var currentDateTime = System.DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 1);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 1, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 1);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -71,12 +70,12 @@ public void TfsRevisionManagerInSync10()
processorEnricher.Configure(peOptions);

var currentDateTime = System.DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 10);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 1, 10);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 10);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 10);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Assert.AreEqual(revs.Count, 0);
Assert.AreEqual(0, revs.Count);

}

Expand All @@ -88,8 +87,8 @@ public void TfsRevisionManagerSync1()
processorEnricher.Configure(peOptions);

var currentDateTime = System.DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 2);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 2, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 2);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -104,8 +103,8 @@ public void TfsRevisionManagerSync10()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 11);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 11, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 11);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -120,9 +119,9 @@ public void TfsRevisionManagerReplayRevisionsOff()
var processorEnricher = Services.GetRequiredService<TfsRevisionManager>();
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 4);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 4, 1);
var currentDateTime = DateTime.Now.AddDays(-100);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 4);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -139,12 +138,12 @@ public void TfsRevisionManagerMaxRevision51()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 2);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 2, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 2);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 2, 2);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Assert.AreEqual(1, revs.Count);
Assert.AreEqual(0, revs.Count);
}

[TestMethod(), TestCategory("L0"), TestCategory("AzureDevOps.ObjectModel")]
Expand All @@ -156,8 +155,8 @@ public void TfsRevisionManagerMaxRevision56()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 7);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 7, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 7);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -173,7 +172,7 @@ public void TfsRevisionManagerMaxRevision59()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 10);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 10);

var revs = processorEnricher.GetRevisionsToMigrate(source, null);

Expand All @@ -188,7 +187,7 @@ public void TfsRevisionManagerDatesMustBeIncreasing()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime.AddHours(-1000), 1, 10, false);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 10, false);

var revs = processorEnricher.GetRevisionsToMigrate(source, null);
Assert.AreEqual(true, CheckDateIncreasing(revs));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,34 +74,32 @@ protected override void RefreshForProcessorType(IProcessor processor)
}
}

public List<RevisionItem> GetRevisionsToMigrate(WorkItemData sourceWorkItem, WorkItemData targetWorkItem)
public List<RevisionItem> GetRevisionsToMigrate(List<RevisionItem> sourceRevisions, List<RevisionItem> targetRevisions)
{
// Revisions have been sorted already on object creation. Values of the Dictionary are sorted by RevisionItem.Number
var sortedRevisions = sourceWorkItem.Revisions.Values.ToList();
EnforceDatesMustBeIncreasing(sourceRevisions);

EnforceDatesMustBeIncreasing(sortedRevisions);
LogDebugCurrentSortedRevisions(sourceRevisions, "Source");
LogDebugCurrentSortedRevisions(targetRevisions, "Target");
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: Raw {sourceWorkItem} Has {sortedRevisions} revisions", "Source", sourceRevisions.Count);

LogDebugCurrentSortedRevisions(sourceWorkItem, sortedRevisions);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: Raw Source {sourceWorkItem} Has {sortedRevisions} revisions", sourceWorkItem.Id, sortedRevisions.Count);
sourceRevisions = RemoveRevisionsAlreadyOnTarget(targetRevisions, sourceRevisions);

sortedRevisions = RemoveRevisionsAlreadyOnTarget(targetWorkItem, sortedRevisions);
RemoveRevisionsAllExceptLatest(sourceRevisions);

RemoveRevisionsAllExceptLatest(sortedRevisions);
RemoveRevisionsMoreThanMaxRevisions(sourceRevisions);

RemoveRevisionsMoreThanMaxRevisions(sortedRevisions);
LogDebugCurrentSortedRevisions(sourceRevisions);

LogDebugCurrentSortedRevisions(sourceWorkItem, sortedRevisions);

return sortedRevisions;
return sourceRevisions;
}

private void EnforceDatesMustBeIncreasing(List<RevisionItem> sortedRevisions)
public void EnforceDatesMustBeIncreasing(List<RevisionItem> sortedRevisions)
{
Log.LogDebug("TfsRevisionManager::EnforceDatesMustBeIncreasing");
DateTime lastDateTime = DateTime.MinValue;
foreach (var revision in sortedRevisions)
{
if (revision.OriginalChangedDate == lastDateTime || revision.OriginalChangedDate < lastDateTime)
if (revision.ChangedDate == lastDateTime || revision.OriginalChangedDate < lastDateTime)
{
revision.ChangedDate = lastDateTime.AddSeconds(1);
Log.LogDebug("TfsRevisionManager::EnforceDatesMustBeIncreasing[{revision}]::Fix", revision.Number);
Expand All @@ -110,15 +108,20 @@ private void EnforceDatesMustBeIncreasing(List<RevisionItem> sortedRevisions)
}
}

private void LogDebugCurrentSortedRevisions(WorkItemData sourceWorkItem, List<RevisionItem> sortedRevisions)
public void LogDebugCurrentSortedRevisions(List<RevisionItem> sortedRevisions, string designation = "Source")
{
Log.LogInformation("Found {RevisionsCount} revisions to migrate on Work item:{sourceWorkItemId}", sortedRevisions.Count, sourceWorkItem.Id);
Log.LogDebug("RevisionsToMigrate:----------------------------------------------------");
if (sortedRevisions == null)
{
Log.LogDebug("{designation}: RevisionsToMigrate: No revisions to migrate", designation);
return;
}
Log.LogInformation("{designation}: Found {RevisionsCount} revisions to migrate on Work item:{sourceWorkItemId}", designation, sortedRevisions.Count, designation);
Log.LogDebug("{designation}: RevisionsToMigrate:----------------------------------------------------", designation);
foreach (RevisionItem item in sortedRevisions)
{
Log.LogDebug("RevisionsToMigrate: Index:{Index} - Number:{Number} - ChangedDate:{ChangedDate}", item.Index, item.Number, item.ChangedDate);
}
Log.LogDebug("RevisionsToMigrate:----------------------------------------------------");
Log.LogDebug("{designation}: RevisionsToMigrate:----------------------------------------------------", designation);
}

private void RemoveRevisionsMoreThanMaxRevisions(List<RevisionItem> sortedRevisions)
Expand All @@ -130,7 +133,7 @@ private void RemoveRevisionsMoreThanMaxRevisions(List<RevisionItem> sortedRevisi
{
var revisionsToRemove = sortedRevisions.Count - Options.MaxRevisions;
sortedRevisions.RemoveRange(0, revisionsToRemove);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: MaxRevisions={MaxRevisions}! There are {sortedRevisionsCount} left", Options.MaxRevisions, sortedRevisions.Count);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsMoreThanMaxRevisions MaxRevisions={MaxRevisions}! There are {sortedRevisionsCount} left", Options.MaxRevisions, sortedRevisions.Count);
}
}

Expand All @@ -140,29 +143,32 @@ private void RemoveRevisionsAllExceptLatest(List<RevisionItem> sortedRevisions)
{
// Remove all but the latest revision if we are not replaying revisions
sortedRevisions.RemoveRange(0, sortedRevisions.Count - 1);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: ReplayRevisions=false! There are {sortedRevisionsCount} left", sortedRevisions.Count);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAllExceptLatest ReplayRevisions=false! There are {sortedRevisionsCount} left", sortedRevisions.Count);
}
}

private List<RevisionItem> RemoveRevisionsAlreadyOnTarget(WorkItemData targetWorkItem, List<RevisionItem> sortedRevisions)
private List<RevisionItem> RemoveRevisionsAlreadyOnTarget(List<RevisionItem> targetRevisions, List<RevisionItem> sourceRevisions)
{
if (targetWorkItem != null)
if (targetRevisions != null)
{
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: Raw Target {targetWorkItemId} Has {targetWorkItemRevCount} revisions", targetWorkItem.Id, targetWorkItem.Revisions.Count);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAlreadyOnTarget Raw Target Has {targetWorkItemRevCount} revisions", targetRevisions.Count);
// Target exists so remove any Changed Date matches between them
var targetChangedDates = (from RevisionItem x in targetWorkItem.Revisions.Values select x.ChangedDate).ToList();
var targetChangedDates = (from RevisionItem x in targetRevisions select x.ChangedDate).ToList();
if (Options.ReplayRevisions)
{
sortedRevisions = sortedRevisions.Where(x => !targetChangedDates.Contains(x.ChangedDate)).ToList();
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: After removing Date Matches there are {sortedRevisionsCount} left", sortedRevisions.Count);
sourceRevisions = sourceRevisions.Where(x => !targetChangedDates.Contains(x.ChangedDate)).ToList();
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAlreadyOnTarget After removing Date Matches there are {sortedRevisionsCount} left", sourceRevisions.Count);
}
// Find Max target date and remove all source revisions that are newer
var targetLatestDate = targetChangedDates.Max();
sortedRevisions = sortedRevisions.Where(x => x.ChangedDate > targetLatestDate).ToList();
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: After removing revisions before target latest date {targetLatestDate} there are {sortedRevisionsCount} left", targetLatestDate, sortedRevisions.Count);
sourceRevisions = sourceRevisions.Where(x => x.ChangedDate > targetLatestDate).ToList();
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAlreadyOnTarget After removing revisions before target latest date {targetLatestDate} there are {sortedRevisionsCount} left", targetLatestDate, sourceRevisions.Count);
}

return sortedRevisions;
else
{
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAlreadyOnTarget Target is null");
}
return sourceRevisions;
}

public void AttachSourceRevisionHistoryJsonToTarget(WorkItemData sourceWorkItem, WorkItemData targetWorkItem)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@ private async Task ProcessWorkItemAsync(WorkItemData sourceWorkItem, int retryLi
{ "sourceWorkItemRev", sourceWorkItem.Rev },
{ "ReplayRevisions", _revisionManager.Options.ReplayRevisions }}
);
List<RevisionItem> revisionsToMigrate = _revisionManager.GetRevisionsToMigrate(sourceWorkItem, targetWorkItem);
List<RevisionItem> revisionsToMigrate = _revisionManager.GetRevisionsToMigrate(sourceWorkItem.Revisions.Values.ToList(), targetWorkItem.Revisions.Values.ToList());
if (targetWorkItem == null)
{
targetWorkItem = ReplayRevisions(revisionsToMigrate, sourceWorkItem, null);
Expand Down

0 comments on commit bb4936f

Please sign in to comment.