@ -23,6 +23,7 @@ public class OpenIddictQuartzJobTests
// Arrange
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) = = Mock . Of < IOpenIddictAuthorizationManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = Mock . Of < IOpenIddictSessionManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictTokenManager ) ) = = Mock . Of < IOpenIddictTokenManager > ( ) ) ;
var scope = Mock . Of < IServiceScope > ( scope = > scope . ServiceProvider = = provider ) ;
@ -52,6 +53,7 @@ public class OpenIddictQuartzJobTests
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) = = Mock . Of < IOpenIddictAuthorizationManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = Mock . Of < IOpenIddictSessionManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictTokenManager ) ) = = manager . Object ) ;
var job = CreateJob ( provider , options = > options . DisableTokenPruning = true ) ;
@ -72,6 +74,7 @@ public class OpenIddictQuartzJobTests
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) = = manager . Object & &
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = Mock . Of < IOpenIddictSessionManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictTokenManager ) ) = = Mock . Of < IOpenIddictTokenManager > ( ) ) ;
var job = CreateJob ( provider , options = > options . DisableAuthorizationPruning = true ) ;
@ -83,12 +86,34 @@ public class OpenIddictQuartzJobTests
manager . Verify ( manager = > manager . PruneAsync ( It . IsAny < DateTimeOffset > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
}
[Fact]
public async Task Execute_IgnoresPruningWhenSessionPruningIsDisabled ( )
{
// Arrange
var manager = new Mock < IOpenIddictSessionManager > ( ) ;
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) = = Mock . Of < IOpenIddictAuthorizationManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = manager . Object & &
provider . GetService ( typeof ( IOpenIddictTokenManager ) ) = = Mock . Of < IOpenIddictTokenManager > ( ) ) ;
var job = CreateJob ( provider , options = > options . DisableSessionPruning = true ) ;
// Act
await job . Execute ( Mock . Of < IJobExecutionContext > ( ) ) ;
// Assert
manager . Verify ( manager = > manager . PruneAsync ( It . IsAny < DateTimeOffset > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
}
[Fact]
public async Task Execute_UnschedulesTriggersWhenTokenManagerIsMissing ( )
{
// Arrange
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) = = Mock . Of < IOpenIddictAuthorizationManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = Mock . Of < IOpenIddictSessionManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictTokenManager ) ) = = null ) ;
var job = CreateJob ( provider ) ;
@ -124,6 +149,26 @@ public class OpenIddictQuartzJobTests
Assert . Equal ( SR . GetResourceString ( SR . ID0278 ) , exception . InnerException ! . Message ) ;
}
[Fact]
public async Task Execute_UnschedulesTriggersWhenSessionManagerIsMissing ( )
{
// Arrange
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = null ) ;
var job = CreateJob ( provider ) ;
// Act and assert
var exception = await Assert . ThrowsAsync < JobExecutionException > ( ( ) = > job . Execute ( Mock . Of < IJobExecutionContext > ( ) ) ) ;
Assert . False ( exception . RefireImmediately ) ;
Assert . True ( exception . UnscheduleAllTriggers ) ;
Assert . True ( exception . UnscheduleFiringTrigger ) ;
Assert . IsType < InvalidOperationException > ( exception . InnerException ) ;
Assert . Equal ( SR . GetResourceString ( SR . ID0278 ) , exception . InnerException ! . Message ) ;
}
[Fact]
public async Task Execute_RethrowsOutOfMemoryExceptionsThrownDuringTokenPruning ( )
{
@ -160,6 +205,25 @@ public class OpenIddictQuartzJobTests
await Assert . ThrowsAsync < OutOfMemoryException > ( ( ) = > job . Execute ( Mock . Of < IJobExecutionContext > ( ) ) ) ;
}
[Fact]
public async Task Execute_RethrowsOutOfMemoryExceptionsThrownDuringSessionPruning ( )
{
// Arrange
var manager = new Mock < IOpenIddictSessionManager > ( ) ;
manager . Setup ( manager = > manager . PruneAsync ( It . IsAny < DateTimeOffset > ( ) , It . IsAny < CancellationToken > ( ) ) )
. Throws ( new OutOfMemoryException ( ) ) ;
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) = = Mock . Of < IOpenIddictAuthorizationManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictTokenManager ) ) = = Mock . Of < IOpenIddictTokenManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = manager . Object ) ;
var job = CreateJob ( provider ) ;
// Act and assert
await Assert . ThrowsAsync < OutOfMemoryException > ( ( ) = > job . Execute ( Mock . Of < IJobExecutionContext > ( ) ) ) ;
}
[Fact]
public async Task Execute_DisablesRefiringWhenJobIsCanceledDuringTokenPruning ( )
{
@ -212,6 +276,33 @@ public class OpenIddictQuartzJobTests
manager . Verify ( manager = > manager . PruneAsync ( It . IsAny < DateTimeOffset > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task Execute_DisablesRefiringWhenJobIsCanceledDuringSessionPruning ( )
{
// Arrange
var token = new CancellationToken ( canceled : true ) ;
var manager = new Mock < IOpenIddictSessionManager > ( ) ;
manager . Setup ( manager = > manager . PruneAsync ( It . IsAny < DateTimeOffset > ( ) , It . IsAny < CancellationToken > ( ) ) )
. Throws ( new OperationCanceledException ( token ) ) ;
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) = = Mock . Of < IOpenIddictAuthorizationManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictTokenManager ) ) = = Mock . Of < IOpenIddictTokenManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = manager . Object ) ;
var context = Mock . Of < IJobExecutionContext > ( context = > context . CancellationToken = = token ) ;
var job = CreateJob ( provider ) ;
// Act and assert
var exception = await Assert . ThrowsAsync < JobExecutionException > ( ( ) = > job . Execute ( context ) ) ;
Assert . False ( exception . RefireImmediately ) ;
manager . Verify ( manager = > manager . PruneAsync ( It . IsAny < DateTimeOffset > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task Execute_AllowsRefiringWhenExceptionsAreThrown ( )
{
@ -220,6 +311,9 @@ public class OpenIddictQuartzJobTests
provider . Setup ( provider = > provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) )
. Returns ( CreateAuthorizationManager ( new ApplicationException ( ) ) ) ;
provider . Setup ( provider = > provider . GetService ( typeof ( IOpenIddictSessionManager ) ) )
. Returns ( CreateSessionManager ( new ApplicationException ( ) ) ) ;
provider . Setup ( provider = > provider . GetService ( typeof ( IOpenIddictTokenManager ) ) )
. Returns ( CreateTokenManager ( new ApplicationException ( ) ) ) ;
@ -232,9 +326,10 @@ public class OpenIddictQuartzJobTests
Assert . True ( exception . RefireImmediately ) ;
Assert . IsType < AggregateException > ( exception . InnerException ) ;
Assert . Equal ( 2 , ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions . Count ) ;
Assert . Equal ( 3 , ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions . Count ) ;
Assert . IsType < ApplicationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 0 ] ) ;
Assert . IsType < ApplicationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 1 ] ) ;
Assert . IsType < ApplicationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 2 ] ) ;
static IOpenIddictAuthorizationManager CreateAuthorizationManager ( Exception exception )
{
@ -245,6 +340,15 @@ public class OpenIddictQuartzJobTests
return mock . Object ;
}
static IOpenIddictSessionManager CreateSessionManager ( Exception exception )
{
var mock = new Mock < IOpenIddictSessionManager > ( ) ;
mock . Setup ( manager = > manager . PruneAsync ( It . IsAny < DateTimeOffset > ( ) , It . IsAny < CancellationToken > ( ) ) )
. Throws ( exception ) ;
return mock . Object ;
}
static IOpenIddictTokenManager CreateTokenManager ( Exception exception )
{
var mock = new Mock < IOpenIddictTokenManager > ( ) ;
@ -264,6 +368,10 @@ public class OpenIddictQuartzJobTests
. Returns ( CreateAuthorizationManager ( new AggregateException (
new InvalidOperationException ( ) , new ApplicationException ( ) ) ) ) ;
provider . Setup ( provider = > provider . GetService ( typeof ( IOpenIddictSessionManager ) ) )
. Returns ( CreateSessionManager ( new AggregateException (
new InvalidOperationException ( ) , new ApplicationException ( ) ) ) ) ;
provider . Setup ( provider = > provider . GetService ( typeof ( IOpenIddictTokenManager ) ) )
. Returns ( CreateTokenManager ( new AggregateException (
new InvalidOperationException ( ) , new ApplicationException ( ) ) ) ) ;
@ -277,11 +385,13 @@ public class OpenIddictQuartzJobTests
Assert . True ( exception . RefireImmediately ) ;
Assert . IsType < AggregateException > ( exception . InnerException ) ;
Assert . Equal ( 4 , ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions . Count ) ;
Assert . Equal ( 6 , ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions . Count ) ;
Assert . IsType < InvalidOperationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 0 ] ) ;
Assert . IsType < ApplicationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 1 ] ) ;
Assert . IsType < InvalidOperationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 2 ] ) ;
Assert . IsType < ApplicationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 3 ] ) ;
Assert . IsType < InvalidOperationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 4 ] ) ;
Assert . IsType < ApplicationException > ( ( ( AggregateException ) exception . InnerException ! ) . InnerExceptions [ 5 ] ) ;
static IOpenIddictAuthorizationManager CreateAuthorizationManager ( Exception exception )
{
@ -292,6 +402,15 @@ public class OpenIddictQuartzJobTests
return mock . Object ;
}
static IOpenIddictSessionManager CreateSessionManager ( Exception exception )
{
var mock = new Mock < IOpenIddictSessionManager > ( ) ;
mock . Setup ( manager = > manager . PruneAsync ( It . IsAny < DateTimeOffset > ( ) , It . IsAny < CancellationToken > ( ) ) )
. Throws ( exception ) ;
return mock . Object ;
}
static IOpenIddictTokenManager CreateTokenManager ( Exception exception )
{
var mock = new Mock < IOpenIddictTokenManager > ( ) ;
@ -312,6 +431,7 @@ public class OpenIddictQuartzJobTests
var provider = Mock . Of < IServiceProvider > ( provider = >
provider . GetService ( typeof ( IOpenIddictAuthorizationManager ) ) = = manager . Object & &
provider . GetService ( typeof ( IOpenIddictSessionManager ) ) = = Mock . Of < IOpenIddictSessionManager > ( ) & &
provider . GetService ( typeof ( IOpenIddictTokenManager ) ) = = Mock . Of < IOpenIddictTokenManager > ( ) ) ;
var context = Mock . Of < IJobExecutionContext > ( context = > context . RefireCount = = 5 ) ;