Skip to content

Commit

Permalink
Fixing null-ref in ShouldFail* assertions when task is cancelled
Browse files Browse the repository at this point in the history
Resolves #4
  • Loading branch information
soxtoby committed Mar 11, 2017
1 parent 2340786 commit 9e907db
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 12 deletions.
25 changes: 13 additions & 12 deletions EasyAssertions/Assertions/TaskAssertions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,26 +78,26 @@ public static void ShouldComplete<TTask>(this TTask actualTask, TimeSpan timeout
/// </summary>
public static ActualException<Exception> ShouldFail(this Task actualTask, string message = null)
{
actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<Exception>(DefaultTimeout, message));
return new ActualException<Exception>(actualTask.Exception.InnerException);
Actual<Exception> result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<Exception>(DefaultTimeout, message));
return new ActualException<Exception>(result.Value);
}

/// <summary>
/// Assert that a task fails within a specified number of milliseconds.
/// </summary>
public static ActualException<Exception> ShouldFail(this Task actualTask, uint millisecondsTimeout, string message = null)
{
actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<Exception>(TimeSpan.FromMilliseconds(millisecondsTimeout), message));
return new ActualException<Exception>(actualTask.Exception.InnerException);
Actual<Exception> result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<Exception>(TimeSpan.FromMilliseconds(millisecondsTimeout), message));
return new ActualException<Exception>(result.Value);
}

/// <summary>
/// Assert that a task fails within a specified time span.
/// </summary>
public static ActualException<Exception> ShouldFail(this Task actualTask, TimeSpan timeout, string message = null)
{
actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<Exception>(timeout, message));
return new ActualException<Exception>(actualTask.Exception.InnerException);
Actual<Exception> result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<Exception>(timeout, message));
return new ActualException<Exception>(result.Value);
}

/// <summary>
Expand All @@ -107,8 +107,8 @@ public static ActualException<Exception> ShouldFail(this Task actualTask, TimeSp
public static ActualException<TException> ShouldFailWith<TException>(this Task actualTask, string message = null)
where TException : Exception
{
actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<TException>(DefaultTimeout, message));
return new ActualException<TException>((TException)actualTask.Exception.InnerException);
Actual<TException> result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<TException>(DefaultTimeout, message));
return new ActualException<TException>(result.Value);
}

/// <summary>
Expand All @@ -117,8 +117,8 @@ public static ActualException<TException> ShouldFailWith<TException>(this Task a
public static ActualException<TException> ShouldFailWith<TException>(this Task actualTask, uint millisecondsTimeout, string message = null)
where TException : Exception
{
actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<TException>(TimeSpan.FromMilliseconds(millisecondsTimeout), message));
return new ActualException<TException>((TException)actualTask.Exception.InnerException);
Actual<TException> result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith<TException>(TimeSpan.FromMilliseconds(millisecondsTimeout), message));
return new ActualException<TException>(result.Value);
}

/// <summary>
Expand All @@ -141,8 +141,9 @@ public static ActualException<TException> ShouldFailWith<TException>(this Task a
}
catch (AggregateException e)
{
if (e.InnerException is TException)
return new ActualException<TException>((TException)actualTask.Exception.InnerException);
TException expectedException = e.InnerException as TException;
if (expectedException != null)
return new ActualException<TException>(expectedException);
throw StandardErrors.Current.WrongException(typeof(TException), e.InnerException, message: message);
}
Expand Down
47 changes: 47 additions & 0 deletions UnitTests/Assertions/TaskAssertionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,12 @@ public void ShouldFailWithType_FailsWithCorrectType_ReturnsException()
AssertReturnsException(new InvalidOperationException(), TimeSpan.FromSeconds(1), () => task.ShouldFailWith<InvalidOperationException>());
}

[Test]
public void ShouldFailWithType_ExpectedTaskCanceledException_TaskCancelled_ReturnsException()
{
AssertReturnsTaskCanceledException(TimeSpan.FromSeconds(1), () => task.ShouldFailWith<TaskCanceledException>());
}

[Test]
public void ShouldFailWithType_FailsWithWrongType_FailsWithWrongExceptionMessage()
{
Expand Down Expand Up @@ -267,6 +273,12 @@ public void ShouldFailWithinMillisecondsWithType_FailsWithCorrectType_ReturnsExc
AssertReturnsException(new InvalidOperationException(), TimeSpan.FromMilliseconds(1), () => task.ShouldFailWith<InvalidOperationException>(1));
}

[Test]
public void ShouldFailWithinMillisecondsWithType_ExpectedTaskCanceledExcepton_TaskCancelled_ReturnsException()
{
AssertReturnsTaskCanceledException(TimeSpan.FromMilliseconds(1), () => task.ShouldFailWith<TaskCanceledException>(1));
}

[Test]
public void ShouldFailWithinMillisecondsWithType_FailsWithWrongType_FailsWithWrongExceptionMessage()
{
Expand Down Expand Up @@ -307,6 +319,12 @@ public void ShouldFailWithinTimeSpanWithType_FailsWithCorrectType_ReturnsExcepti
AssertReturnsException(new InvalidOperationException(), TimeSpan.FromMilliseconds(1), () => task.ShouldFailWith<InvalidOperationException>(TimeSpan.FromMilliseconds(1)));
}

[Test]
public void ShouldFailWithinTimeSpanWithType_ExpectedTaskCanceledException_TaskCancelled_ReturnsException()
{
AssertReturnsTaskCanceledException(TimeSpan.FromMilliseconds(1), () => task.ShouldFailWith<TaskCanceledException>(TimeSpan.FromMilliseconds(1)));
}

[Test]
public void ShouldFailWithinTimeSpanWithType_NegativeTimeSpan_ThrowsArgumentOutOfRangeException()
{
Expand Down Expand Up @@ -355,6 +373,12 @@ public void ShouldFail_Fails_ReturnsException()
AssertReturnsException(new Exception(), TimeSpan.FromSeconds(1), () => task.ShouldFail());
}

[Test]
public void ShouldFail_TaskCancelled_ReturnsException()
{
AssertReturnsTaskCanceledException(TimeSpan.FromSeconds(1), () => task.ShouldFail());
}

[Test]
public void ShouldFail_TimesOut_FailsWithTimeoutMessage()
{
Expand Down Expand Up @@ -390,6 +414,12 @@ public void ShouldFailWithinMilliseconds_Fails_ReturnsException()
AssertReturnsException(new Exception(), TimeSpan.FromMilliseconds(1), () => task.ShouldFail(1));
}

[Test]
public void ShouldFailWithinMilliseconds_TaskCancelled_ReturnsException()
{
AssertReturnsTaskCanceledException(TimeSpan.FromMilliseconds(1), () => task.ShouldFail(1));
}

[Test]
public void ShouldFailWithinMilliseconds_TimesOut_FailsWithTimeoutMessage()
{
Expand Down Expand Up @@ -424,6 +454,12 @@ public void ShouldFailWithinTimeSpan_Fails_ReturnsException()
AssertReturnsException(new Exception(), TimeSpan.FromMilliseconds(1), () => task.ShouldFail(TimeSpan.FromMilliseconds(1)));
}

[Test]
public void ShouldFailWithinTimeSpan_TaskCancelled_ReturnsException()
{
AssertReturnsTaskCanceledException(TimeSpan.FromMilliseconds(1), () => task.ShouldFail(TimeSpan.FromMilliseconds(1)));
}

[Test]
public void ShouldFailWithinTimeSpan_NegativeTimeSpan_ThrowsArgumentOutOfRangeException()
{
Expand Down Expand Up @@ -478,6 +514,17 @@ private void AssertReturnsResult(int expectedResult, TimeSpan timeout, Func<Actu
Assert.AreSame(expectedException, result.And);
}

private void AssertReturnsTaskCanceledException<TException>(TimeSpan timeout, Func<ActualException<TException>> callAssertion)
where TException : Exception
{
wait(task, timeout).Returns(c => task.Wait(timeout));
taskSource.SetCanceled();

ActualException<TException> result = callAssertion();

Assert.IsInstanceOf<TaskCanceledException>(result.And);
}

private void AssertTimesOut(TimeSpan timeout, Action<string> callAssertion)
{
Error.TaskTimedOut(timeout, "foo").Returns(ExpectedException);
Expand Down

0 comments on commit 9e907db

Please sign in to comment.