mirror of
				https://github.com/datahub-project/datahub.git
				synced 2025-11-04 04:39:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
package auth.sso.oidc.custom;
 | 
						|
 | 
						|
import static org.junit.jupiter.api.Assertions.*;
 | 
						|
import static org.mockito.Mockito.*;
 | 
						|
 | 
						|
import auth.sso.oidc.OidcConfigs;
 | 
						|
import com.nimbusds.oauth2.sdk.token.AccessToken;
 | 
						|
import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
 | 
						|
import java.io.IOException;
 | 
						|
import java.net.URI;
 | 
						|
import org.junit.jupiter.api.BeforeEach;
 | 
						|
import org.junit.jupiter.api.Test;
 | 
						|
import org.pac4j.core.profile.UserProfile;
 | 
						|
import org.pac4j.oidc.client.OidcClient;
 | 
						|
import org.pac4j.oidc.config.OidcConfiguration;
 | 
						|
import org.pac4j.oidc.metadata.OidcOpMetadataResolver;
 | 
						|
 | 
						|
public class CustomOidcProfileCreatorTest {
 | 
						|
 | 
						|
  private OidcConfiguration configuration;
 | 
						|
  private OidcClient client;
 | 
						|
  private OidcConfigs oidcConfigs;
 | 
						|
  private CustomOidcProfileCreator profileCreator;
 | 
						|
  private URI userInfoEndpointUri;
 | 
						|
  private UserProfile profile;
 | 
						|
  private AccessToken accessToken;
 | 
						|
 | 
						|
  @BeforeEach
 | 
						|
  void setUp() {
 | 
						|
    userInfoEndpointUri = URI.create("https://nonexistent-endpoint-12345.com/userinfo");
 | 
						|
    configuration = mock(OidcConfiguration.class);
 | 
						|
    client = mock(OidcClient.class);
 | 
						|
    oidcConfigs = mock(OidcConfigs.class);
 | 
						|
    profile = mock(UserProfile.class);
 | 
						|
    accessToken = mock(AccessToken.class);
 | 
						|
 | 
						|
    // Mock the OidcOpMetadataResolver to avoid NullPointerException
 | 
						|
    OidcOpMetadataResolver metadataResolver = mock(OidcOpMetadataResolver.class);
 | 
						|
    when(configuration.getOpMetadataResolver()).thenReturn(metadataResolver);
 | 
						|
 | 
						|
    // Mock the OIDCProviderMetadata to avoid NullPointerException
 | 
						|
    OIDCProviderMetadata providerMetadata = mock(OIDCProviderMetadata.class);
 | 
						|
    when(metadataResolver.load()).thenReturn(providerMetadata);
 | 
						|
 | 
						|
    // Set up the provider metadata to return a valid URI (the actual network call will fail)
 | 
						|
    when(providerMetadata.getUserInfoEndpointURI()).thenReturn(userInfoEndpointUri);
 | 
						|
 | 
						|
    profileCreator = new CustomOidcProfileCreator(configuration, client, oidcConfigs);
 | 
						|
  }
 | 
						|
 | 
						|
  @Test
 | 
						|
  void testRetryMechanismWithValidConfig() throws Exception {
 | 
						|
    when(oidcConfigs.getHttpRetryAttempts()).thenReturn("3");
 | 
						|
    when(oidcConfigs.getHttpRetryDelay()).thenReturn("100");
 | 
						|
 | 
						|
    // Should throw IOException after retries are exhausted (network error from non-existent
 | 
						|
    // endpoint)
 | 
						|
    IOException exception =
 | 
						|
        assertThrows(
 | 
						|
            IOException.class,
 | 
						|
            () -> {
 | 
						|
              profileCreator.callUserInfoEndpoint(userInfoEndpointUri, accessToken, profile);
 | 
						|
            });
 | 
						|
 | 
						|
    // Verify the exception is a network-related exception
 | 
						|
    assertTrue(exception instanceof java.net.UnknownHostException);
 | 
						|
  }
 | 
						|
 | 
						|
  @Test
 | 
						|
  void testRetryMechanismWithInvalidConfig() throws Exception {
 | 
						|
    when(oidcConfigs.getHttpRetryAttempts()).thenReturn("invalid");
 | 
						|
    when(oidcConfigs.getHttpRetryDelay()).thenReturn("invalid");
 | 
						|
 | 
						|
    // Should handle invalid config gracefully and still attempt once (defaults to 1)
 | 
						|
    IOException exception =
 | 
						|
        assertThrows(
 | 
						|
            IOException.class,
 | 
						|
            () -> {
 | 
						|
              profileCreator.callUserInfoEndpoint(userInfoEndpointUri, accessToken, profile);
 | 
						|
            });
 | 
						|
 | 
						|
    // Verify the exception is a network-related exception
 | 
						|
    assertTrue(exception instanceof java.net.UnknownHostException);
 | 
						|
  }
 | 
						|
 | 
						|
  @Test
 | 
						|
  void testRetryMechanismWithZeroAttempts() throws Exception {
 | 
						|
    when(oidcConfigs.getHttpRetryAttempts()).thenReturn("0");
 | 
						|
    when(oidcConfigs.getHttpRetryDelay()).thenReturn("100");
 | 
						|
 | 
						|
    // Should default to 1 attempt and throw IOException
 | 
						|
    IOException exception =
 | 
						|
        assertThrows(
 | 
						|
            IOException.class,
 | 
						|
            () -> {
 | 
						|
              profileCreator.callUserInfoEndpoint(userInfoEndpointUri, accessToken, profile);
 | 
						|
            });
 | 
						|
 | 
						|
    // Verify the exception is a network-related exception
 | 
						|
    assertTrue(exception instanceof java.net.UnknownHostException);
 | 
						|
  }
 | 
						|
 | 
						|
  @Test
 | 
						|
  void testRetryMechanismWithNegativeAttempts() throws Exception {
 | 
						|
    when(oidcConfigs.getHttpRetryAttempts()).thenReturn("-1");
 | 
						|
    when(oidcConfigs.getHttpRetryDelay()).thenReturn("100");
 | 
						|
 | 
						|
    // Should default to 1 attempt and throw IOException
 | 
						|
    IOException exception =
 | 
						|
        assertThrows(
 | 
						|
            IOException.class,
 | 
						|
            () -> {
 | 
						|
              profileCreator.callUserInfoEndpoint(userInfoEndpointUri, accessToken, profile);
 | 
						|
            });
 | 
						|
 | 
						|
    // Verify the exception is a network-related exception
 | 
						|
    assertTrue(exception instanceof java.net.UnknownHostException);
 | 
						|
  }
 | 
						|
 | 
						|
  @Test
 | 
						|
  void testRetryMechanismStackTraceDebug() throws Exception {
 | 
						|
    when(oidcConfigs.getHttpRetryAttempts()).thenReturn("2");
 | 
						|
    when(oidcConfigs.getHttpRetryDelay()).thenReturn("50");
 | 
						|
 | 
						|
    try {
 | 
						|
      profileCreator.callUserInfoEndpoint(userInfoEndpointUri, accessToken, profile);
 | 
						|
      fail("Expected IOException to be thrown");
 | 
						|
    } catch (IOException e) {
 | 
						|
      // Print stack trace for debugging
 | 
						|
      System.out.println("=== Stack Trace Debug ===");
 | 
						|
      e.printStackTrace();
 | 
						|
      System.out.println("=== End Stack Trace ===");
 | 
						|
 | 
						|
      // Verify the stack trace contains our retry method
 | 
						|
      StackTraceElement[] stackTrace = e.getStackTrace();
 | 
						|
      boolean foundRetryMethod = false;
 | 
						|
 | 
						|
      for (StackTraceElement element : stackTrace) {
 | 
						|
        String className = element.getClassName();
 | 
						|
        String methodName = element.getMethodName();
 | 
						|
 | 
						|
        if (className.contains("CustomOidcProfileCreator")
 | 
						|
            && methodName.contains("callUserInfoEndpointWithRetry")) {
 | 
						|
          foundRetryMethod = true;
 | 
						|
          System.out.println("Found retry method: " + className + "." + methodName);
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      assertTrue(
 | 
						|
          foundRetryMethod, "Stack trace should contain callUserInfoEndpointWithRetry method");
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |