/*
* 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.tests.javax.net.ssl;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Provider;
import java.security.Security;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.KeyStoreBuilderParameters;
import javax.net.ssl.ManagerFactoryParameters;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.KeyManagerFactorySpi;
import org.apache.harmony.security.tests.support.SpiEngUtils;
import org.apache.harmony.xnet.tests.support.MyKeyManagerFactorySpi;
import junit.framework.TestCase;
/**
* Tests for <code>KeyManagerFactory</code> class constructors and methods.
*
*/
public class KeyManagerFactory1Test extends TestCase {
private static final String srvKeyManagerFactory = "KeyManagerFactory";
private static String defaultAlgorithm = null;
private static String defaultProviderName = null;
private static Provider defaultProvider = null;
private static boolean DEFSupported = false;
private static final String NotSupportedMsg = "There is no suitable provider for KeyManagerFactory";
private static final String[] invalidValues = SpiEngUtils.invalidValues;
private static String[] validValues = new String[3];
static {
defaultAlgorithm = Security
.getProperty("ssl.KeyManagerFactory.algorithm");
if (defaultAlgorithm != null) {
defaultProvider = SpiEngUtils.isSupport(defaultAlgorithm,
srvKeyManagerFactory);
DEFSupported = (defaultProvider != null);
defaultProviderName = (DEFSupported ? defaultProvider.getName()
: null);
validValues[0] = defaultAlgorithm;
validValues[1] = defaultAlgorithm.toUpperCase();
validValues[2] = defaultAlgorithm.toLowerCase();
}
}
protected KeyManagerFactory[] createKMFac() {
if (!DEFSupported) {
fail(defaultAlgorithm + " algorithm is not supported");
return null;
}
KeyManagerFactory[] kMF = new KeyManagerFactory[3];
try {
kMF[0] = KeyManagerFactory.getInstance(defaultAlgorithm);
kMF[1] = KeyManagerFactory.getInstance(defaultAlgorithm,
defaultProvider);
kMF[2] = KeyManagerFactory.getInstance(defaultAlgorithm,
defaultProviderName);
return kMF;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* avax.net.ssl.KeyManagerFactory#getAlgorithm()
*/
public void test_getAlgorithm()
throws NoSuchAlgorithmException, NoSuchProviderException {
if (!DEFSupported) fail(NotSupportedMsg);
assertEquals("Incorrect algorithm",
defaultAlgorithm,
KeyManagerFactory
.getInstance(defaultAlgorithm).getAlgorithm());
assertEquals("Incorrect algorithm",
defaultAlgorithm,
KeyManagerFactory
.getInstance(defaultAlgorithm, defaultProviderName)
.getAlgorithm());
assertEquals("Incorrect algorithm",
defaultAlgorithm,
KeyManagerFactory.getInstance(defaultAlgorithm, defaultProvider)
.getAlgorithm());
}
/**
* Test for <code>getDefaultAlgorithm()</code> method
* Assertion: returns value which is specifoed in security property
*/
public void test_getDefaultAlgorithm() {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
String def = KeyManagerFactory.getDefaultAlgorithm();
if (defaultAlgorithm == null) {
assertNull("DefaultAlgorithm must be null", def);
} else {
assertEquals("Invalid default algorithm", def, defaultAlgorithm);
}
String defA = "Proba.keymanagerfactory.defaul.type";
Security.setProperty("ssl.KeyManagerFactory.algorithm", defA);
assertEquals("Incorrect defaultAlgorithm",
KeyManagerFactory.getDefaultAlgorithm(), defA);
if (def == null) {
def = "";
}
Security.setProperty("ssl.KeyManagerFactory.algorithm", def);
assertEquals("Incorrect defaultAlgorithm",
KeyManagerFactory.getDefaultAlgorithm(), def);
}
/**
* Test for <code>getInstance(String algorithm)</code> method
* Assertions:
* returns security property "ssl.KeyManagerFactory.algorithm";
* returns instance of KeyManagerFactory
*/
public void test_getInstanceLjava_lang_String01() throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
KeyManagerFactory keyMF;
for (int i = 0; i < validValues.length; i++) {
keyMF = KeyManagerFactory.getInstance(validValues[i]);
assertNotNull("No KeyManagerFactory created", keyMF);
assertEquals("Invalid algorithm", keyMF.getAlgorithm(),
validValues[i]);
}
}
/**
* Test for <code>getInstance(String algorithm)</code> method
* Assertion:
* throws NullPointerException when algorithm is null;
* throws NoSuchAlgorithmException when algorithm is not correct;
*/
public void test_getInstanceLjava_lang_String02() {
try {
KeyManagerFactory.getInstance(null);
fail("NoSuchAlgorithmException or NullPointerException should be thrown (algorithm is null");
} catch (NoSuchAlgorithmException e) {
} catch (NullPointerException e) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
KeyManagerFactory.getInstance(invalidValues[i]);
fail("NoSuchAlgorithmException was not thrown as expected for algorithm: "
.concat(invalidValues[i]));
} catch (NoSuchAlgorithmException e) {
}
}
}
/**
* Test for <code>getInstance(String algorithm, String provider)</code>
* method
* Assertion: throws IllegalArgumentException when provider is null or empty
*/
public void test_getInstanceLjava_lang_StringLjava_lang_String01() throws NoSuchProviderException,
NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
String provider = null;
for (int i = 0; i < validValues.length; i++) {
try {
KeyManagerFactory.getInstance(validValues[i], provider);
fail("Expected IllegalArgumentException was not thrown for null provider");
} catch (IllegalArgumentException e) {
}
try {
KeyManagerFactory.getInstance(validValues[i], "");
fail("Expected IllegalArgumentException was not thrown for empty provider");
} catch (IllegalArgumentException e) {
}
}
}
/**
* Test for <code>getInstance(String algorithm, String provider)</code>
* method
* Assertion:
* throws NullPointerException when algorithm is null;
* throws NoSuchAlgorithmException when algorithm is not correct;
*/
public void test_getInstanceLjava_lang_StringLjava_lang_String02() throws NoSuchProviderException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
try {
KeyManagerFactory.getInstance(null, defaultProviderName);
fail("NoSuchAlgorithmException or NullPointerException should be thrown (algorithm is null");
} catch (NoSuchAlgorithmException e) {
} catch (NullPointerException e) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
KeyManagerFactory.getInstance(invalidValues[i],
defaultProviderName);
fail("NoSuchAlgorithmException must be thrown (algorithm: "
.concat(invalidValues[i]).concat(")"));
} catch (NoSuchAlgorithmException e) {
}
}
}
/**
* Test for <code>getInstance(String algorithm, String provider)</code>
* method
* Assertion: throws NoSuchProviderException when provider has
* invalid value
*/
public void test_getInstanceLjava_lang_StringLjava_lang_String03()
throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
for (int i = 0; i < validValues.length; i++) {
for (int j = 1; j < invalidValues.length; j++) {
try {
KeyManagerFactory.getInstance(validValues[i],
invalidValues[j]);
fail("NuSuchProviderException must be thrown (algorithm: "
+ validValues[i] + " provider: " + invalidValues[j]
+ ")");
} catch (NoSuchProviderException e) {
}
}
}
}
/**
* Test for <code>getInstance(String algorithm, String provider)</code>
* method Assertion: returns instance of KeyManagerFactory
*/
public void test_getInstanceLjava_lang_StringLjava_lang_String04()
throws NoSuchProviderException,
NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
KeyManagerFactory kMF;
for (int i = 0; i < validValues.length; i++) {
kMF = KeyManagerFactory.getInstance(validValues[i],
defaultProviderName);
assertNotNull("No KeyManagerFactory created", kMF);
assertEquals("Incorrect algorithm", kMF.getAlgorithm(),
validValues[i]);
assertEquals("Incorrect provider", kMF.getProvider().getName(),
defaultProviderName);
}
}
/**
* Test for <code>getInstance(String algorithm, Provider provider)</code>
* method
* Assertion: throws IllegalArgumentException when provider is null
*/
public void test_getInstanceLjava_lang_StringLjava_security_Provider01()
throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
Provider provider = null;
for (int i = 0; i < validValues.length; i++) {
try {
KeyManagerFactory.getInstance(validValues[i], provider);
fail("Expected IllegalArgumentException was not thrown when provider is null");
} catch (IllegalArgumentException e) {
}
}
}
/**
* Test for <code>getInstance(String algorithm, Provider provider)</code>
* method
* Assertion:
* throws NullPointerException when algorithm is null;
* throws NoSuchAlgorithmException when algorithm is not correct;
*/
public void test_getInstanceLjava_lang_StringLjava_security_Provider02() {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
try {
KeyManagerFactory.getInstance(null, defaultProvider);
fail("NoSuchAlgorithmException or NullPointerException should be thrown (algorithm is null");
} catch (NoSuchAlgorithmException e) {
} catch (NullPointerException e) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
KeyManagerFactory
.getInstance(invalidValues[i], defaultProvider);
fail("Expected NuSuchAlgorithmException was not thrown");
} catch (NoSuchAlgorithmException e) {
}
}
}
/**
* Test for <code>getInstance(String algorithm, Provider provider)</code>
* method
* Assertion: returns instance of KeyManagerFactory
*/
public void test_getInstanceLjava_lang_StringLjava_security_Provider03()
throws NoSuchAlgorithmException,
IllegalArgumentException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
KeyManagerFactory kMF;
for (int i = 0; i < validValues.length; i++) {
kMF = KeyManagerFactory
.getInstance(validValues[i], defaultProvider);
assertNotNull("No KeyManagerFactory created", kMF);
assertEquals(kMF.getAlgorithm(), validValues[i]);
assertEquals(kMF.getProvider(), defaultProvider);
}
}
/**
* Test for <code>KeyManagerFactory</code> constructor
* Assertion: returns KeyManagerFactory object
*/
public void test_Constructor() throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
KeyManagerFactorySpi spi = new MyKeyManagerFactorySpi();
KeyManagerFactory keyMF = new myKeyManagerFactory(spi, defaultProvider,
defaultAlgorithm);
assertEquals("Incorrect algorithm", keyMF.getAlgorithm(),
defaultAlgorithm);
assertEquals("Incorrect provider", keyMF.getProvider(), defaultProvider);
try {
keyMF.init(null, new char[1]);
fail("UnrecoverableKeyException must be thrown");
} catch (UnrecoverableKeyException e) {
} catch (Exception e) {
fail("Unexpected: "+e.toString()+" was thrown");
}
keyMF = new myKeyManagerFactory(null, null, null);
assertNull("Aalgorithm must be null", keyMF.getAlgorithm());
assertNull("Provider must be null", keyMF.getProvider());
try {
keyMF.getKeyManagers();
} catch (NullPointerException e) {
}
}
/**
* avax.net.ssl.KeyManagerFactory#getKeyManagers()
* @throws NoSuchAlgorithmException
* @throws KeyStoreException
* @throws IOException
* @throws CertificateException
* @throws UnrecoverableKeyException
*/
public void test_getKeyManagers()
throws Exception {
if (!DEFSupported) fail(NotSupportedMsg);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(defaultAlgorithm);
char[] pass = "password".toCharArray();
kmf.init(null, pass);
assertNotNull("Key manager array is null", kmf.getKeyManagers());
assertEquals("Incorrect size of array",
1, kmf.getKeyManagers().length);
}
/**
* avax.net.ssl.KeyManagerFactory#getProvider()
*/
public void test_getProvider()
throws Exception {
if (!DEFSupported) fail(NotSupportedMsg);
assertEquals("Incorrect provider",
defaultProvider,
KeyManagerFactory
.getInstance(defaultAlgorithm).getProvider());
assertEquals("Incorrect provider",
defaultProvider,
KeyManagerFactory
.getInstance(defaultAlgorithm, defaultProviderName)
.getProvider());
assertEquals("Incorrect provider",
defaultProvider,
KeyManagerFactory.getInstance(defaultAlgorithm, defaultProvider)
.getProvider());
}
/**
* Test for <code>init(KeyStore keyStore, char[] password)</code> and
* <code>getKeyManagers()</code>
* Assertion: returns not empty KeyManager array
*/
public void test_initLjava_security_KeyStore$C()
throws NoSuchAlgorithmException,
KeyStoreException, UnrecoverableKeyException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
KeyManagerFactory[] keyMF = createKMFac();
assertNotNull("KeyManagerFactory object were not created", keyMF);
KeyStore ksNull = null;
KeyManager[] km;
for (int i = 0; i < keyMF.length; i++) {
keyMF[i].init(ksNull, new char[10]);
km = keyMF[i].getKeyManagers();
assertNotNull("Result should not be null", km);
assertTrue("Length of result KeyManager array should not be 0",
(km.length > 0));
}
KeyStore ks;
try {
ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
} catch (KeyStoreException e) {
fail(e.toString() + "default KeyStore type is not supported");
return;
} catch (Exception e) {
fail("Unexpected: " + e.toString());
return;
}
for (int i = 0; i < keyMF.length; i++) {
try {
keyMF[i].init(ks, new char[10]);
} catch (KeyStoreException e) {
}
km = keyMF[i].getKeyManagers();
assertNotNull("Result has not be null", km);
assertTrue("Length of result KeyManager array should not be 0",
(km.length > 0));
}
}
/**
* Test for <code>init(ManagerFactoryParameters params)</code>
* Assertion:
* throws InvalidAlgorithmParameterException when params is null
*/
public void test_initLjavax_net_ssl_ManagerFactoryParameters()
throws NoSuchAlgorithmException {
if (!DEFSupported) {
fail(NotSupportedMsg);
return;
}
ManagerFactoryParameters par = null;
KeyManagerFactory[] keyMF = createKMFac();
assertNotNull("KeyManagerFactory object were not created", keyMF);
for (int i = 0; i < keyMF.length; i++) {
try {
keyMF[i].init(par);
fail("InvalidAlgorithmParameterException must be thrown");
} catch (InvalidAlgorithmParameterException e) {
}
}
KeyStore.ProtectionParameter pp = new ProtectionParameterImpl();
KeyStore.Builder bld = KeyStore.Builder.newInstance("testType", null, pp);
assertNotNull("Null object KeyStore.Builder", bld);
try {
KeyManagerFactory kmf = KeyManagerFactory.getInstance(defaultAlgorithm);
KeyStoreBuilderParameters ksp = new KeyStoreBuilderParameters(bld);
assertNotNull(ksp.getParameters());
kmf.init(ksp);
fail("InvalidAlgorithmParameterException must be thrown");
} catch (InvalidAlgorithmParameterException e) {
}
}
}
/**
* Additional class for KeyManagerFactory constructor verification
*/
class myKeyManagerFactory extends KeyManagerFactory {
public myKeyManagerFactory(KeyManagerFactorySpi spi, Provider prov,
String alg) {
super(spi, prov, alg);
}
}
class ProtectionParameterImpl implements KeyStore.ProtectionParameter {
ProtectionParameterImpl(){}
}