/*
* Copyright 1999-2010 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
*
* See the License for the specific language governing permissions and limitations under the License.
*/
package org.globus.gsi.jsse;
import static org.junit.Assert.assertEquals;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.globus.gsi.jsse.GlobusSSLConfigurationException;
import org.globus.gsi.jsse.SSLConfigurator;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.security.Security;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import org.globus.gsi.provider.GlobusProvider;
import org.globus.gsi.stores.ResourceSigningPolicyStore;
import org.globus.gsi.stores.Stores;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class SSLConfiguratorTest {
private static SSLSocket sslsocket;
private static SSLServerSocket serverSocket;
private CountDownLatch latch = new CountDownLatch(1);
private StringBuilder builder = new StringBuilder();
@BeforeClass
public static void setup() throws Exception {
Security.addProvider(new GlobusProvider());
}
@Test
public void testConfig() throws Exception {
SSLConfigurator config = new SSLConfigurator();
config.setCrlLocationPattern(null);
config.setCrlStoreType(GlobusProvider.CERTSTORE_TYPE);
config.setCredentialStoreLocation("classpath:/configuratorTest/mykeystore.properties");
config.setCredentialStorePassword("password");
config.setCredentialStoreType(GlobusProvider.KEYSTORE_TYPE);
config.setTrustAnchorStoreLocation("classpath:/configuratorTest/mytruststore.properties");
config.setTrustAnchorStorePassword("password");
config.setTrustAnchorStoreType(GlobusProvider.KEYSTORE_TYPE);
ResourceSigningPolicyStore policyStore = Stores.getSigningPolicyStore("classpath:/configuratorTest/TestCA1.signing_policy");
config.setPolicyStore(policyStore);
serverSocket = startServer(config);
latch.await();
sslsocket = runClient(config);
OutputStream outputstream = sslsocket.getOutputStream();
OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);
bufferedwriter.write("hello");
bufferedwriter.flush();
}
private SSLSocket runClient(SSLConfigurator config) throws IOException,
GlobusSSLConfigurationException {
SSLSocketFactory sslsocketfactory = config.createFactory();
return (SSLSocket) sslsocketfactory.createSocket("localhost", 9991);
}
@AfterClass
public static void stop() throws Exception {
serverSocket.close();
sslsocket.close();
}
Log logger = LogFactory.getLog(SSLConfiguratorTest.class);
private SSLServerSocket startServer(SSLConfigurator config)
throws GlobusSSLConfigurationException, IOException {
SSLServerSocketFactory sslserversocketfactory = config
.createServerFactory();
final SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory
.createServerSocket(9991);
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.execute(new Runnable() {
/**
* When an object implementing interface <code>Runnable</code> is
* used to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p/>
* The general contract of the method <code>run</code> is that it
* may take any action whatsoever.
*
* @see Thread#run()
*/
public void run() {
latch.countDown();
try {
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(
inputstream);
BufferedReader bufferedreader = new BufferedReader(
inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null) {
builder.append(line);
}
assertEquals(builder.toString().trim(), "hello");
} catch (IOException e) {
e.printStackTrace();
}
}
});
return sslserversocket;
}
}