Skip to content

Commit

Permalink
Avoid deadlock in tests
Browse files Browse the repository at this point in the history
Part of #17019
  • Loading branch information
AndriySvyryd committed Aug 14, 2019
1 parent 2271170 commit 8d44f6a
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 22 deletions.
36 changes: 27 additions & 9 deletions test/EFCore.Specification.Tests/Query/AsyncSimpleQueryTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ public virtual async Task Mixed_sync_async_in_query_cache()
}
}

[ConditionalFact(Skip = "Issue#17019")]
[ConditionalFact]
public virtual async Task Throws_on_concurrent_query_list()
{
using (var context = CreateContext())
Expand All @@ -274,13 +274,22 @@ public virtual async Task Throws_on_concurrent_query_list()
{
var blockingTask = Task.Run(
() =>
context.Customers.Select(
c => Process(c, synchronizationEvent, blockingSemaphore)).ToList());
{
try
{
context.Customers.Select(
c => Process(c, synchronizationEvent, blockingSemaphore)).ToList();
}
finally
{
synchronizationEvent.Set();
}
});

var throwingTask = Task.Run(
async () =>
{
synchronizationEvent.Wait();
synchronizationEvent.Wait(TimeSpan.FromMinutes(5));
Assert.Equal(
CoreStrings.ConcurrentMethodInvocation,
Expand All @@ -298,7 +307,7 @@ public virtual async Task Throws_on_concurrent_query_list()
}
}

[ConditionalFact(Skip = "Issue#17019")]
[ConditionalFact]
public virtual async Task Throws_on_concurrent_query_first()
{
using (var context = CreateContext())
Expand All @@ -309,13 +318,22 @@ public virtual async Task Throws_on_concurrent_query_first()
{
var blockingTask = Task.Run(
() =>
context.Customers.Select(
c => Process(c, synchronizationEvent, blockingSemaphore)).ToList());
{
try
{
context.Customers.Select(
c => Process(c, synchronizationEvent, blockingSemaphore)).ToList();
}
finally
{
synchronizationEvent.Set();
}
});

var throwingTask = Task.Run(
async () =>
{
synchronizationEvent.Wait();
synchronizationEvent.Wait(TimeSpan.FromMinutes(5));
Assert.Equal(
CoreStrings.ConcurrentMethodInvocation,
Expand All @@ -336,7 +354,7 @@ public virtual async Task Throws_on_concurrent_query_first()
private static Customer Process(Customer c, ManualResetEventSlim e, SemaphoreSlim s)
{
e.Set();
s.Wait();
s.Wait(TimeSpan.FromMinutes(5));
s.Release(1);
return c;
}
Expand Down
44 changes: 31 additions & 13 deletions test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3701,7 +3701,7 @@ orderby o.OrderID
}
}

[ConditionalFact(Skip = "Issue#17019")]
[ConditionalFact]
public virtual void Throws_on_concurrent_query_list()
{
using (var context = CreateContext())
Expand All @@ -3714,30 +3714,39 @@ public virtual void Throws_on_concurrent_query_list()
{
var blockingTask = Task.Run(
() =>
context.Customers.Select(
c => Process(c, synchronizationEvent, blockingSemaphore)).ToList());
{
try
{
context.Customers.Select(
c => Process(c, synchronizationEvent, blockingSemaphore)).ToList();
}
finally
{
synchronizationEvent.Set();
}
});

var throwingTask = Task.Run(
() =>
{
synchronizationEvent.Wait();
synchronizationEvent.Wait(TimeSpan.FromMinutes(5));
Assert.Equal(
CoreStrings.ConcurrentMethodInvocation,
Assert.Throws<InvalidOperationException>(
() => context.Customers.ToList()).Message);
});

throwingTask.Wait();
throwingTask.Wait(TimeSpan.FromMinutes(5));

blockingSemaphore.Release(1);

blockingTask.Wait();
blockingTask.Wait(TimeSpan.FromMinutes(5));
}
}
}
}

[ConditionalFact(Skip = "Issue#17019")]
[ConditionalFact]
public virtual void Throws_on_concurrent_query_first()
{
using (var context = CreateContext())
Expand All @@ -3750,24 +3759,33 @@ public virtual void Throws_on_concurrent_query_first()
{
var blockingTask = Task.Run(
() =>
context.Customers.Select(
c => Process(c, synchronizationEvent, blockingSemaphore)).ToList());
{
try
{
context.Customers.Select(
c => Process(c, synchronizationEvent, blockingSemaphore)).ToList();
}
finally
{
synchronizationEvent.Set();
}
});

var throwingTask = Task.Run(
() =>
{
synchronizationEvent.Wait();
synchronizationEvent.Wait(TimeSpan.FromMinutes(5));
Assert.Equal(
CoreStrings.ConcurrentMethodInvocation,
Assert.Throws<InvalidOperationException>(
() => context.Customers.First()).Message);
});

throwingTask.Wait();
throwingTask.Wait(TimeSpan.FromMinutes(5));

blockingSemaphore.Release(1);

blockingTask.Wait();
blockingTask.Wait(TimeSpan.FromMinutes(5));
}
}
}
Expand All @@ -3776,7 +3794,7 @@ public virtual void Throws_on_concurrent_query_first()
private static Customer Process(Customer c, ManualResetEventSlim e, SemaphoreSlim s)
{
e.Set();
s.Wait();
s.Wait(TimeSpan.FromMinutes(5));
s.Release(1);
return c;
}
Expand Down

0 comments on commit 8d44f6a

Please sign in to comment.