Fix BackgroundDocumentGenerator flaky tests.
- Some time spans were too aggressive for parsing a Razor file on a slow environment. - Fixed an obvious race where we'd expect 0 pending notifications when it was possible to be in the process of clearing notifications. #2506
This commit is contained in:
parent
676543b8c9
commit
38e145389e
|
|
@ -56,6 +56,9 @@ namespace Microsoft.CodeAnalysis.Razor
|
||||||
// Used in unit tests to ensure we can know when background work finishes.
|
// Used in unit tests to ensure we can know when background work finishes.
|
||||||
public ManualResetEventSlim NotifyBackgroundWorkStarting { get; set; }
|
public ManualResetEventSlim NotifyBackgroundWorkStarting { get; set; }
|
||||||
|
|
||||||
|
// Used in unit tests to ensure we can know when background has captured its current workload.
|
||||||
|
public ManualResetEventSlim NotifyBackgroundCapturedWorkload { get; set; }
|
||||||
|
|
||||||
// Used in unit tests to ensure we can control when background work completes.
|
// Used in unit tests to ensure we can control when background work completes.
|
||||||
public ManualResetEventSlim BlockBackgroundWorkCompleting { get; set; }
|
public ManualResetEventSlim BlockBackgroundWorkCompleting { get; set; }
|
||||||
|
|
||||||
|
|
@ -93,6 +96,14 @@ namespace Microsoft.CodeAnalysis.Razor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnBackgroundCapturedWorkload()
|
||||||
|
{
|
||||||
|
if (NotifyBackgroundCapturedWorkload != null)
|
||||||
|
{
|
||||||
|
NotifyBackgroundCapturedWorkload.Set();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void Initialize(ProjectSnapshotManagerBase projectManager)
|
public override void Initialize(ProjectSnapshotManagerBase projectManager)
|
||||||
{
|
{
|
||||||
if (projectManager == null)
|
if (projectManager == null)
|
||||||
|
|
@ -161,6 +172,8 @@ namespace Microsoft.CodeAnalysis.Razor
|
||||||
_files.Clear();
|
_files.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OnBackgroundCapturedWorkload();
|
||||||
|
|
||||||
for (var i = 0; i < work.Length; i++)
|
for (var i = 0; i < work.Length; i++)
|
||||||
{
|
{
|
||||||
var document = work[i];
|
var document = work[i];
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
queue.BlockBackgroundWorkStart.Set();
|
queue.BlockBackgroundWorkStart.Set();
|
||||||
queue.BlockBackgroundWorkCompleting.Set();
|
queue.BlockBackgroundWorkCompleting.Set();
|
||||||
|
|
||||||
await Task.Run(() => queue.NotifyBackgroundWorkCompleted.Wait(TimeSpan.FromSeconds(1)));
|
await Task.Run(() => queue.NotifyBackgroundWorkCompleted.Wait(TimeSpan.FromSeconds(3)));
|
||||||
|
|
||||||
Assert.False(queue.IsScheduledOrRunning, "Queue should not have restarted");
|
Assert.False(queue.IsScheduledOrRunning, "Queue should not have restarted");
|
||||||
Assert.False(queue.HasPendingNotifications, "Queue should have processed all notifications");
|
Assert.False(queue.HasPendingNotifications, "Queue should have processed all notifications");
|
||||||
|
|
@ -120,6 +120,7 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
Delay = TimeSpan.FromMilliseconds(1),
|
Delay = TimeSpan.FromMilliseconds(1),
|
||||||
BlockBackgroundWorkStart = new ManualResetEventSlim(initialState: false),
|
BlockBackgroundWorkStart = new ManualResetEventSlim(initialState: false),
|
||||||
NotifyBackgroundWorkStarting = new ManualResetEventSlim(initialState: false),
|
NotifyBackgroundWorkStarting = new ManualResetEventSlim(initialState: false),
|
||||||
|
NotifyBackgroundCapturedWorkload = new ManualResetEventSlim(initialState: false),
|
||||||
BlockBackgroundWorkCompleting = new ManualResetEventSlim(initialState: false),
|
BlockBackgroundWorkCompleting = new ManualResetEventSlim(initialState: false),
|
||||||
NotifyBackgroundWorkCompleted = new ManualResetEventSlim(initialState: false),
|
NotifyBackgroundWorkCompleted = new ManualResetEventSlim(initialState: false),
|
||||||
};
|
};
|
||||||
|
|
@ -136,6 +137,8 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
await Task.Run(() => queue.NotifyBackgroundWorkStarting.Wait(TimeSpan.FromSeconds(1)));
|
await Task.Run(() => queue.NotifyBackgroundWorkStarting.Wait(TimeSpan.FromSeconds(1)));
|
||||||
|
|
||||||
Assert.True(queue.IsScheduledOrRunning, "Worker should be processing now");
|
Assert.True(queue.IsScheduledOrRunning, "Worker should be processing now");
|
||||||
|
|
||||||
|
await Task.Run(() => queue.NotifyBackgroundCapturedWorkload.Wait(TimeSpan.FromSeconds(1)));
|
||||||
Assert.False(queue.HasPendingNotifications, "Worker should have taken all notifications");
|
Assert.False(queue.HasPendingNotifications, "Worker should have taken all notifications");
|
||||||
|
|
||||||
queue.Enqueue(project, project.GetDocument(Documents[1].FilePath));
|
queue.Enqueue(project, project.GetDocument(Documents[1].FilePath));
|
||||||
|
|
@ -144,7 +147,7 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
// Allow work to complete, which should restart the timer.
|
// Allow work to complete, which should restart the timer.
|
||||||
queue.BlockBackgroundWorkCompleting.Set();
|
queue.BlockBackgroundWorkCompleting.Set();
|
||||||
|
|
||||||
await Task.Run(() => queue.NotifyBackgroundWorkCompleted.Wait(TimeSpan.FromSeconds(1)));
|
await Task.Run(() => queue.NotifyBackgroundWorkCompleted.Wait(TimeSpan.FromSeconds(3)));
|
||||||
queue.NotifyBackgroundWorkCompleted.Reset();
|
queue.NotifyBackgroundWorkCompleted.Reset();
|
||||||
|
|
||||||
// It should start running again right away.
|
// It should start running again right away.
|
||||||
|
|
@ -155,7 +158,7 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
queue.BlockBackgroundWorkStart.Set();
|
queue.BlockBackgroundWorkStart.Set();
|
||||||
|
|
||||||
queue.BlockBackgroundWorkCompleting.Set();
|
queue.BlockBackgroundWorkCompleting.Set();
|
||||||
await Task.Run(() => queue.NotifyBackgroundWorkCompleted.Wait(TimeSpan.FromSeconds(1)));
|
await Task.Run(() => queue.NotifyBackgroundWorkCompleted.Wait(TimeSpan.FromSeconds(3)));
|
||||||
|
|
||||||
Assert.False(queue.IsScheduledOrRunning, "Queue should not have restarted");
|
Assert.False(queue.IsScheduledOrRunning, "Queue should not have restarted");
|
||||||
Assert.False(queue.HasPendingNotifications, "Queue should have processed all notifications");
|
Assert.False(queue.HasPendingNotifications, "Queue should have processed all notifications");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue