package org.cagrid.gridgrouper.test;
import edu.internet2.middleware.GrouperInit;
import gov.nih.nci.cagrid.metadata.ServiceMetadata;
import gov.nih.nci.cagrid.metadata.security.ServiceSecurityMetadata;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.cxf.configuration.security.KeyStoreType;
import org.apache.karaf.tooling.exam.options.KarafDistributionConfigurationFileExtendOption;
import org.apache.karaf.tooling.exam.options.KarafDistributionConfigurationFileReplacementOption;
import org.cagrid.core.common.security.CredentialFactory;
import org.cagrid.core.common.security.X509Credential;
import org.cagrid.core.soapclient.SingleEntityKeyManager;
import org.cagrid.gridgrouper.model.StemDescriptor;
import org.cagrid.gridgrouper.model.StemIdentifier;
import org.cagrid.gridgrouper.service.GridGrouperService;
import org.cagrid.gridgrouper.soapclient.GridGrouperSoapClientFactory;
import org.cagrid.gridgrouper.wsrf.stubs.GetStemRequest;
import org.cagrid.gridgrouper.wsrf.stubs.GridGrouperPortType;
import org.cagrid.gridgrouper.wsrf.stubs.GridGrouperRuntimeFaultFaultMessage;
import org.cagrid.gridgrouper.wsrf.stubs.StemNotFoundFaultFaultMessage;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.CoreOptions;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.Configuration;
import org.ops4j.pax.exam.junit.ExamReactorStrategy;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
import javax.net.ssl.KeyManager;
import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.ops4j.pax.exam.CoreOptions.maven;
@RunWith(JUnit4TestRunner.class)
@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
public class GridGrouperTest extends CaGridTestSupport {
private static final String GRIDGROUPER_URL = "https://localhost:7738/gridgrouper";
private static final String SERVICEMETADATA = "etc/cagrid-gridgrouper/serviceMetadata.xml";
private static final String SERVICESECURITYMETADATA = "etc/cagrid-gridgrouper/serviceSecurityMetadata.xml";
private static final String HOST = "etc/cagrid-grid-grouper/grid-grouper-host.jks";
private static final String TRUSTSTORE = "etc/cagrid-grid-grouper/truststore.jks";
private static final String TRUSTSTORETYPE = "JKS";
private static final String KEYALIAS = "host";
private static final String TRUSTSTOREPASSWORD = "changeit";
private static final String KEYSTOREPASSWORD = "changeit";
private static final String KEYPASSWORD = "changeit";
@Override
@Configuration
public Option[] config() {
Option[] options = new Option[] {
// need at least internet2 loaded so I can initialize the DB from the test (GrouperInit is part of the internet2 bunle)
new KarafDistributionConfigurationFileExtendOption("etc/org.apache.karaf.features.cfg", "featuresRepositories", ","
+ maven().groupId("org.cagrid").artifactId("cagrid-features").versionAsInProject().classifier("features").type("xml").getURL()),
new KarafDistributionConfigurationFileExtendOption("etc/org.apache.karaf.features.cfg", "featuresBoot", ",cagrid-gridgrouper-internet2"),
CoreOptions.mavenBundle("org.apache.ant", "com.springsource.org.apache.tools.ant", "1.7.0"),
// Get our resource files to the "etc" area
new KarafDistributionConfigurationFileReplacementOption("etc/cagrid.gridgrouper.wsrf.cfg", new File("src/test/resources/cagrid.gridgrouper.wsrf.cfg")),
// new KarafDistributionConfigurationFileReplacementOption("etc/cagrid.gridgrouper.service.cfg", new File("src/test/resources/cagrid.gridgrouper.service.cfg")),
new KarafDistributionConfigurationFileReplacementOption(HOST, new File("src/test/resources/grid-grouper-host.jks")),
new KarafDistributionConfigurationFileReplacementOption("etc/cagrid-grid-grouper/legacy-grid-grouper-host.jks", new File("src/test/resources/legacy-grid-grouper-host.jks")),
new KarafDistributionConfigurationFileReplacementOption(TRUSTSTORE, new File("src/test/resources/truststore.jks")),
new KarafDistributionConfigurationFileReplacementOption(SERVICEMETADATA, new File("src/test/resources/serviceMetadata.xml")),
new KarafDistributionConfigurationFileReplacementOption(SERVICESECURITYMETADATA, new File("src/test/resources/serviceSecurityMetadata.xml")),
// work around smx vs jre soap conflict
new KarafDistributionConfigurationFileExtendOption("etc/jre.properties", "jre-1.6", ",javax.xml.soap;version=\"1.3\""),
new KarafDistributionConfigurationFileExtendOption("etc/jre.properties", "jre-1.7", ",javax.xml.soap;version=\"1.3\"")
};
return CaGridTestSupport.concatAll(super.config(), options);
}
@Test
public void testGrouper() throws Exception {
try {
//
// DB must be initialized before we deploy the service
//
GrouperInit.main(new String[]{
"schema-export.sql",
"../../../src/test/resources/grouper.hibernate.properties",
"../../../src/test/resources/hibernate"});
installAndAssertFeature("cagrid-gridgrouper", 30000L);
System.err.println(executeCommand("features:list"));
assertBundleInstalled("cagrid-gridgrouper-api");
assertBundleInstalled("cagrid-gridgrouper-service");
assertBundleInstalled("cagrid-gridgrouper-wsrf");
GridGrouperService gridGrouperService = getOsgiService(GridGrouperService.class, 30000L);
assertNotNull(gridGrouperService);
// grab its metadata
ServiceMetadata metadata = gridGrouperService.getServiceMetadata();
Assert.assertNotNull(metadata);
assertEquals("Service metadata name was not as expected.", "GridGrouper", metadata.getServiceDescription().getService().getName());
ServiceSecurityMetadata securityMetadata = gridGrouperService.getServiceSecurityMetadata();
Assert.assertNotNull(securityMetadata);
// get soap client
GridGrouperPortType gridGrouperSoapClient = getGridGrouperSoapClient();
assertNotNull(gridGrouperSoapClient);
// get stem
StemDescriptor stem = getStem(gridGrouperSoapClient, "grouperadministration");
assertNotNull(stem);
assertEquals("grouperadministration", stem.getName());
assertEquals("Grouper Administration", stem.getDisplayName());
assertEquals("grouperadministration", stem.getExtension());
assertEquals("Grouper Administration", stem.getDisplayExtension());
assertEquals("GrouperSystem", stem.getCreateSubject());
assertEquals("GrouperSystem", stem.getModifySubject());
// doNothing();
} catch(Throwable t) {
fail(ExceptionUtils.getFullStackTrace(t));
}
}
private void doNothing() throws Exception {
try {
System.out.println("Sleeping......");
Thread.sleep(1000l * 60l * 60l * 24l);//TWENTY_FOUR_HOURS_IN_MILLISECONDS);
} catch (InterruptedException e) {
System.out.println("sleep interrupted");
}
}
private GridGrouperPortType getGridGrouperSoapClient() throws GeneralSecurityException, IOException {
KeyStoreType truststore = new KeyStoreType();
truststore.setFile(TRUSTSTORE);
truststore.setType(TRUSTSTORETYPE);
truststore.setPassword(TRUSTSTOREPASSWORD);
X509Credential credential = CredentialFactory.getCredential(
HOST,
KEYSTOREPASSWORD,
KEYALIAS,
KEYPASSWORD);
KeyManager keyManager = new SingleEntityKeyManager(KEYALIAS, credential);
return GridGrouperSoapClientFactory.createSoapClient(GRIDGROUPER_URL, truststore, keyManager);
}
public StemDescriptor getStem(GridGrouperPortType gridGrouper, String name) throws StemNotFoundFaultFaultMessage, GridGrouperRuntimeFaultFaultMessage {
StemIdentifier id = new StemIdentifier();
id.setStemName(name);
GetStemRequest.Stem value = new GetStemRequest.Stem();
value.setStemIdentifier(id);
GetStemRequest request = new GetStemRequest();
request.setStem(value);
return gridGrouper.getStem(request).getStemDescriptor();
}
}