blob: 13673bda85a06d4deba7a2ff9901d4c755194473 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.harmony.xnet.tests.javax.net.ssl;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Provider;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLContextSpi;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLSessionContext;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import org.apache.harmony.xnet.tests.support.SpiEngUtils;
import org.apache.harmony.xnet.tests.support.MySSLContextSpi;
import junit.framework.TestCase;
/**
* Tests for <code>SSLContext</code> class constructors and methods.
*
*/
public class SSLContext1Test extends TestCase {
private static String srvSSLContext = "SSLContext";
public static String defaultProtocol = "TLS";
private static final String NotSupportMsg = "Default protocol is not supported";
private static String defaultProviderName = null;
private static Provider defaultProvider = null;
private static final String[] invalidValues = SpiEngUtils.invalidValues;
private static boolean DEFSupported = false;
private static final String NotSupportedMsg = "There is no suitable provider for SSLContext";
private static String[] validValues = new String[3];
static {
defaultProvider = SpiEngUtils.isSupport(defaultProtocol, srvSSLContext);
DEFSupported = (defaultProvider != null);
if (DEFSupported) {
defaultProviderName = (DEFSupported ? defaultProvider.getName()
: null);
validValues[0] = defaultProtocol;
validValues[1] = defaultProtocol.toUpperCase();
validValues[2] = defaultProtocol.toLowerCase();
} else {
defaultProtocol = null;
}
}
protected SSLContext[] createSSLCon() {
if (!DEFSupported) {
fail(defaultProtocol + " protocol is not supported");
return null;
}
SSLContext[] sslC = new SSLContext[3];
try {
sslC[0] = SSLContext.getInstance(defaultProtocol);
sslC[1] = SSLContext.getInstance(defaultProtocol, defaultProvider);
sslC[2] = SSLContext.getInstance(defaultProtocol,
defaultProviderName);
return sslC;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Test for <code>getInstance(String protocol)</code> method Assertion:
* returns SSLContext object
*/
public void testSSLContext01() throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
SSLContext sslContext;
for (int i = 0; i < validValues.length; i++) {
sslContext = SSLContext.getInstance(validValues[i]);
assertTrue("Not SSLContext object",
sslContext instanceof SSLContext);
assertEquals("Invalid protocol", sslContext.getProtocol(),
validValues[i]);
}
}
/**
* Test for <code>getInstance(String protocol)</code> method Assertion:
* throws NullPointerException when protocol is null; throws
* NoSuchAlgorithmException when protocol is not correct;
*/
public void testSSLContext02() {
try {
SSLContext.getInstance(null);
fail("NoSuchAlgorithmException or NullPointerException should be thrown (protocol is null");
} catch (NoSuchAlgorithmException e) {
} catch (NullPointerException e) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
SSLContext.getInstance(invalidValues[i]);
fail("NoSuchAlgorithmException was not thrown as expected for provider: "
.concat(invalidValues[i]));
} catch (NoSuchAlgorithmException e) {
}
}
}
/**
* Test for <code>getInstance(String protocol, String provider)</code>
* method Assertion: throws IllegalArgumentException when provider is null
* or empty
*/
public void testSSLContext03() throws NoSuchProviderException,
NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
String provider = null;
for (int i = 0; i < validValues.length; i++) {
try {
SSLContext.getInstance(defaultProtocol, provider);
fail("IllegalArgumentException must be thrown when provider is null");
} catch (IllegalArgumentException e) {
}
try {
SSLContext.getInstance(defaultProtocol, "");
fail("IllegalArgumentException must be thrown when provider is empty");
} catch (IllegalArgumentException e) {
}
}
}
/**
* Test for <code>getInstance(String protocol, String provider)</code>
* method Assertion: throws NullPointerException when protocol is null;
* throws NoSuchAlgorithmException when protocol is not correct;
*/
public void testSSLContext04() throws NoSuchProviderException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
try {
SSLContext.getInstance(null, defaultProviderName);
fail("NoSuchAlgorithmException or NullPointerException should be thrown (protocol is null");
} catch (NoSuchAlgorithmException e) {
} catch (NullPointerException e) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
SSLContext.getInstance(invalidValues[i], defaultProviderName);
fail("NoSuchAlgorithmException was not thrown as expected (protocol: "
.concat(invalidValues[i]).concat(")"));
} catch (NoSuchAlgorithmException e) {
}
}
}
/**
* Test for <code>getInstance(String protocol, String provider)</code>
* method Assertion: throws NoSuchProviderException when provider has
* invalid value
*/
public void testSSLContext05() throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
for (int i = 1; i < invalidValues.length; i++) {
for (int j = 0; j < validValues.length; j++) {
try {
SSLContext.getInstance(validValues[j], invalidValues[i]);
fail("NuSuchProviderException must be thrown (protocol: "
.concat(validValues[j]).concat(" provider: ")
.concat(invalidValues[i]).concat(")"));
} catch (NoSuchProviderException e) {
}
}
}
}
/**
* Test for <code>getInstance(String protocol, String provider)</code>
* method Assertion: returns instance of SSLContext
*/
public void testSSLContext06() throws NoSuchAlgorithmException,
NoSuchProviderException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
SSLContext sslContext;
for (int i = 0; i < validValues.length; i++) {
sslContext = SSLContext.getInstance(validValues[i],
defaultProviderName);
assertTrue("Not SSLContext object",
sslContext instanceof SSLContext);
assertEquals("Invalid protocol", sslContext.getProtocol(),
validValues[i]);
assertEquals("Invalid provider", sslContext.getProvider(),
defaultProvider);
}
}
/**
* Test for <code>getInstance(String protocol, Provider provider)</code>
* method Assertion: throws IllegalArgumentException when provider is null
*/
public void testSSLContext07() throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
Provider provider = null;
for (int i = 0; i < validValues.length; i++) {
try {
SSLContext.getInstance(validValues[i], provider);
fail("IllegalArgumentException must be thrown when provider is null");
} catch (IllegalArgumentException e) {
}
}
}
/**
* Test for <code>getInstance(String protocol, Provider provider)</code>
* method Assertion: throws NullPointerException when protocol is null;
* throws NoSuchAlgorithmException when protocol is not correct;
*/
public void testSSLContext08() {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
try {
SSLContext.getInstance(null, defaultProvider);
fail("NoSuchAlgorithmException or NullPointerException should be thrown (protocol is null");
} catch (NoSuchAlgorithmException e) {
} catch (NullPointerException e) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
SSLContext.getInstance(invalidValues[i], defaultProvider);
fail("Expected NoSuchAlgorithmException was not thrown as expected");
} catch (NoSuchAlgorithmException e) {
}
}
}
/**
* Test for <code>getInstance(String protocol, Provider provider)</code>
* method Assertion: returns instance of SSLContext
*/
public void testSSLContext09() throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
SSLContext sslContext;
for (int i = 0; i < validValues.length; i++) {
sslContext = SSLContext
.getInstance(validValues[i], defaultProvider);
assertTrue("Not SSLContext object",
sslContext instanceof SSLContext);
assertEquals("Invalid protocol", sslContext.getProtocol(),
validValues[i]);
assertEquals("Invalid provider", sslContext.getProvider(),
defaultProvider);
}
}
/**
* Test for <code>getClientSessionContext()</code>
* <code>getServiceSessionContext()</code>
* methods Assertion: returns correspondent object
*/
public void testSSLContext10() throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
SSLContext[] sslC = createSSLCon();
assertNotNull("SSLContext objects were not created", sslC);
for (int i = 0; i < sslC.length; i++) {
assertTrue(sslC[i].getClientSessionContext() instanceof SSLSessionContext);
assertTrue(sslC[i].getServerSessionContext() instanceof SSLSessionContext);
}
}
/**
* Test for <code>getServerSocketFactory()</code>
* <code>getSocketFactory()</code>
* <code>init(KeyManager[] km, TrustManager[] tm, SecureRandom random)</code>
* methods Assertion: returns correspondent object
*
*/
public void testSSLContext11() throws NoSuchAlgorithmException,
KeyManagementException, KeyStoreException,
UnrecoverableKeyException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
SSLContext[] sslC = createSSLCon();
assertNotNull("SSLContext objects were not created", sslC);
String tAlg = TrustManagerFactory.getDefaultAlgorithm();
String kAlg = KeyManagerFactory.getDefaultAlgorithm();
if (tAlg == null) {
fail("TrustManagerFactory default algorithm is not defined");
return;
}
if (kAlg == null) {
fail("KeyManagerFactory default algorithm is not defined");
return;
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(kAlg);
KeyStore ks = null;
kmf.init(ks, new char[10]);
KeyManager[] kms = kmf.getKeyManagers();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tAlg);
tmf.init(ks);
TrustManager[] tms = tmf.getTrustManagers();
for (int i = 0; i < sslC.length; i++) {
sslC[i].init(kms, tms, new SecureRandom());
assertTrue(sslC[i].getServerSocketFactory() instanceof SSLServerSocketFactory);
assertTrue(sslC[i].getSocketFactory() instanceof SSLSocketFactory);
}
}
/**
* Test for <code>SSLContext</code> constructor Assertion: returns
* SSLContext object
*/
public void testSSLContext12() throws NoSuchAlgorithmException,
KeyManagementException {
if (!DEFSupported) {
fail(NotSupportMsg);
return;
}
SSLContextSpi spi = new MySSLContextSpi();
SSLContext sslContext = new mySSLContext(spi, defaultProvider,
defaultProtocol);
assertTrue("Not CertStore object", sslContext instanceof SSLContext);
assertEquals("Incorrect protocol", sslContext.getProtocol(),
defaultProtocol);
assertEquals("Incorrect provider", sslContext.getProvider(),
defaultProvider);
TrustManager[] tm = null;
KeyManager[] km = null;
sslContext.init(km, tm, new SecureRandom());
assertTrue(sslContext.createSSLEngine() instanceof SSLEngine);
assertTrue(sslContext.createSSLEngine("host host", 8888) instanceof SSLEngine);
try {
sslContext.init(km, tm, null);
fail("KeyManagementException should be thrown for null SEcureRandom");
} catch (KeyManagementException e) {
}
sslContext = new mySSLContext(null, null, null);
assertTrue("Not CertStore object", sslContext instanceof SSLContext);
assertNull("Incorrect protocol", sslContext.getProtocol());
assertNull("Incorrect provider", sslContext.getProvider());
try {
sslContext.createSSLEngine();
fail("NullPointerException should be thrown");
} catch (NullPointerException e) {
}
try {
sslContext.getSocketFactory();
fail("NullPointerException should be thrown");
} catch (NullPointerException e) {
}
}
}
/**
* Addifional class to verify SSLContext constructor
*/
class mySSLContext extends SSLContext {
public mySSLContext(SSLContextSpi spi, Provider prov, String alg) {
super(spi, prov, alg);
}
}