package com.meltmedia.jgroups.aws;
import static org.junit.Assert.*;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.jgroups.logging.Log;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.meltmedia.jgroups.aws.AWS_PING;
import static org.mockito.Mockito.*;
/**
* Basic tests for loading credentials provider classes from different contexts.
*
* @author Christian Trimble
*/
public class LoadCredentialsProviderTest {
@SuppressWarnings("unchecked")
@Test
public void credentialProviderNotFound() throws Exception {
Class<?> jgroupsClass = AWS_PING.class;
Log log = Mockito.mock(Log.class);
ClassLoader contextClassLoader = Mockito.mock(ClassLoader.class, answerWith(Thread.currentThread().getContextClassLoader()));
when((Class<UnsupportedAWSCredentialProvider>)contextClassLoader.loadClass(UnsupportedAWSCredentialProvider.class.getName()))
.thenReturn(UnsupportedAWSCredentialProvider.class);
try {
doCall(contextClassLoader, "com.meltmedia.jgroups.aws.NotFoundCredentialProvider", jgroupsClass, log);
fail("load credential provider succeeded for an undefined class.");
}
catch( Exception e ) {
verify(contextClassLoader).loadClass("com.meltmedia.jgroups.aws.NotFoundCredentialProvider");
}
}
@SuppressWarnings("unchecked")
// @Test // jgroups.Util.loadClass prefers jgroupsClass.getClassLoader()
public void contextClassLoaderSearchedFirst() throws Exception {
Class<?> jgroupsClass = AWS_PING.class;
Log log = Mockito.mock(Log.class);
ClassLoader contextClassLoader = Mockito.mock(ClassLoader.class, answerWith(Thread.currentThread().getContextClassLoader()));
when((Class<UnsupportedAWSCredentialProvider>)contextClassLoader.loadClass(UnsupportedAWSCredentialProvider.class.getName()))
.thenReturn(UnsupportedAWSCredentialProvider.class);
doCall(contextClassLoader, UnsupportedAWSCredentialProvider.class.getName(), jgroupsClass, log);
verify(contextClassLoader).loadClass(UnsupportedAWSCredentialProvider.class.getName());
}
@SuppressWarnings("unchecked")
// @Test // Same as above.
public void exceptionOnMissingNoArgConstructor() throws Exception {
Class<?> jgroupsClass = AWS_PING.class;
Log log = Mockito.mock(Log.class);
ClassLoader contextClassLoader = Mockito.mock(ClassLoader.class, answerWith(Thread.currentThread().getContextClassLoader()));
when((Class<BadConstructorAWSCredentialsProvider>)contextClassLoader.loadClass(BadConstructorAWSCredentialsProvider.class.getName()))
.thenReturn(BadConstructorAWSCredentialsProvider.class);
try {
doCall(contextClassLoader, BadConstructorAWSCredentialsProvider.class.getName(), jgroupsClass, log);
fail("This credential provider should not have been constructed.");
}
catch( InstantiationException ie ) {
// make sure that we notified the log.
verify(contextClassLoader).loadClass(BadConstructorAWSCredentialsProvider.class.getName());
verify(log).error(anyString());
}
}
@SuppressWarnings("unchecked")
@Test
public void noContextClassLoader() throws Exception {
Class<?> jgroupsClass = AWS_PING.class;
Log log = Mockito.mock(Log.class);
doCall(null, com.amazonaws.auth.DefaultAWSCredentialsProviderChain.class.getName(), jgroupsClass, log);
}
public static Answer<Object> answerWith(final Object o) {
return new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return invocation.getMethod().invoke(o, invocation.getArguments());
}
};
}
/**
* A credentials provider with no real implementation.
*/
public static class UnsupportedAWSCredentialProvider implements AWSCredentialsProvider {
@Override
public AWSCredentials getCredentials() {
throw new UnsupportedOperationException();
}
@Override
public void refresh() {
throw new UnsupportedOperationException();
}
}
/**
* A credentials provider that does not supply the needed constructor.
*/
public static class BadConstructorAWSCredentialsProvider implements AWSCredentialsProvider {
public BadConstructorAWSCredentialsProvider( String tooManyArgs) {}
@Override
public AWSCredentials getCredentials() {
throw new UnsupportedOperationException();
}
@Override
public void refresh() {
throw new UnsupportedOperationException();
}
}
public static AWSCredentialsProvider doCall( ClassLoader contextClassLoader, String className, Class<?> jgroupsClass, Log log) throws Exception
{
ClassLoader oldCtx = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(contextClassLoader);
return AWS_PING.loadCredentialsProvider(className, jgroupsClass, log);
}
finally {
Thread.currentThread().setContextClassLoader(oldCtx);
}
}
}