blob: 23b24e4355097654b04f858713e335802829de7c [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 tests.api.javax.net.ssl;
import dalvik.annotation.KnownFailure;
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.PublicKey;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.PKIXBuilderParameters;
import java.security.cert.TrustAnchor;
import java.security.cert.X509CertSelector;
import java.util.HashSet;
import java.util.Set;
import javax.net.ssl.CertPathTrustManagerParameters;
import javax.net.ssl.ManagerFactoryParameters;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.TrustManagerFactorySpi;
import junit.framework.TestCase;
import org.apache.harmony.security.tests.support.SpiEngUtils;
import org.apache.harmony.security.tests.support.TestKeyPair;
import org.apache.harmony.xnet.tests.support.MyTrustManagerFactorySpi;
/**
* Tests for <code>TrustManagerFactory</code> class constructors and methods.
*
*/
public class TrustManagerFactory1Test extends TestCase {
private static final String srvTrustManagerFactory = "TrustManagerFactory";
private static final String[] invalidValues = SpiEngUtils.invalidValues;
private static String DEFAULT_ALGORITHM;
private static String DEFAULT_PROVIDER_NAME;
private static Provider DEFAULT_PROVIDER;
private static String[] VALID_VALUES;
private static String getDefaultAlgorithm() {
init();
return DEFAULT_ALGORITHM;
}
private static String getDefaultProviderName() {
init();
return DEFAULT_PROVIDER_NAME;
}
private static Provider getDefaultProvider() {
init();
return DEFAULT_PROVIDER;
}
private static String[] getValidValues() {
init();
return VALID_VALUES;
}
private static synchronized void init() {
if (DEFAULT_ALGORITHM != null) {
return;
}
DEFAULT_ALGORITHM = Security.getProperty("ssl.TrustManagerFactory.algorithm");
assertNotNull(DEFAULT_ALGORITHM);
DEFAULT_PROVIDER = SpiEngUtils.isSupport(DEFAULT_ALGORITHM, srvTrustManagerFactory);
DEFAULT_PROVIDER_NAME = DEFAULT_PROVIDER.getName();
VALID_VALUES = new String[] { DEFAULT_ALGORITHM,
DEFAULT_ALGORITHM.toUpperCase(),
DEFAULT_ALGORITHM.toLowerCase() };
}
private static TrustManagerFactory[] createTMFac() throws Exception {
return new TrustManagerFactory[] {
TrustManagerFactory.getInstance(getDefaultAlgorithm()),
TrustManagerFactory.getInstance(getDefaultAlgorithm(), getDefaultProvider()),
TrustManagerFactory.getInstance(getDefaultAlgorithm(), getDefaultProviderName())
};
}
public void test_ConstructorLjavax_net_ssl_TrustManagerFactorySpiLjava_security_ProviderLjava_lang_String()
throws NoSuchAlgorithmException {
TrustManagerFactorySpi spi = new MyTrustManagerFactorySpi();
TrustManagerFactory tmF = new myTrustManagerFactory(spi, getDefaultProvider(),
getDefaultAlgorithm());
assertTrue("Not CertStore object", tmF instanceof TrustManagerFactory);
assertEquals("Incorrect algorithm", tmF.getAlgorithm(),
getDefaultAlgorithm());
assertEquals("Incorrect provider", tmF.getProvider(), getDefaultProvider());
assertNull("Incorrect result", tmF.getTrustManagers());
tmF = new myTrustManagerFactory(null, null, null);
assertTrue("Not CertStore object", tmF instanceof TrustManagerFactory);
assertNull("Provider must be null", tmF.getProvider());
assertNull("Algorithm must be null", tmF.getAlgorithm());
try {
tmF.getTrustManagers();
fail("NullPointerException must be thrown");
} catch (NullPointerException e) {
}
}
/**
* Test for <code>getAlgorithm()</code> method
* Assertion: returns the algorithm name of this object
* @throws NoSuchAlgorithmException
* @throws NoSuchProviderException
*/
public void test_getAlgorithm()
throws NoSuchAlgorithmException, NoSuchProviderException {
assertEquals("Incorrect algorithm",
getDefaultAlgorithm(),
TrustManagerFactory
.getInstance(getDefaultAlgorithm()).getAlgorithm());
assertEquals("Incorrect algorithm",
getDefaultAlgorithm(),
TrustManagerFactory
.getInstance(getDefaultAlgorithm(), getDefaultProviderName())
.getAlgorithm());
assertEquals("Incorrect algorithm",
getDefaultAlgorithm(),
TrustManagerFactory.getInstance(getDefaultAlgorithm(), getDefaultProvider())
.getAlgorithm());
}
/**
* Test for <code>getDefaultAlgorithm()</code> method
* Assertion: returns value which is specifoed in security property
*/
public void test_getDefaultAlgorithm() {
String def = TrustManagerFactory.getDefaultAlgorithm();
if (getDefaultAlgorithm() == null) {
assertNull("DefaultAlgorithm must be null", def);
} else {
assertEquals("Invalid default algorithm", def, getDefaultAlgorithm());
}
String defA = "Proba.trustmanagerfactory.defaul.type";
Security.setProperty("ssl.TrustManagerFactory.algorithm", defA);
assertEquals("Incorrect getDefaultAlgorithm()",
TrustManagerFactory.getDefaultAlgorithm(), defA);
if (def == null) {
def = "";
}
Security.setProperty("ssl.TrustManagerFactory.algorithm", def);
assertEquals("Incorrect getDefaultAlgorithm()",
TrustManagerFactory.getDefaultAlgorithm(), def);
}
/**
* Test for <code>getInstance(String algorithm)</code> method
* Assertions: returns security property "ssl.TrustManagerFactory.algorithm";
* returns instance of TrustManagerFactory
*/
public void test_getInstanceLjava_lang_String01() throws NoSuchAlgorithmException {
for (String validValue : getValidValues()) {
TrustManagerFactory trustMF = TrustManagerFactory.getInstance(validValue);
assertTrue("Not TrustManagerFactory object",
trustMF instanceof TrustManagerFactory);
assertEquals("Invalid algorithm", trustMF.getAlgorithm(), validValue);
}
}
/**
* 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 {
TrustManagerFactory.getInstance(null);
fail();
} catch (NoSuchAlgorithmException expected) {
} catch (NullPointerException expected) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
TrustManagerFactory.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 Exception {
for (String validValue : getValidValues()) {
try {
TrustManagerFactory.getInstance(validValue, (String) null);
fail();
} catch (IllegalArgumentException expected) {
}
try {
TrustManagerFactory.getInstance(validValue, "");
fail();
} catch (IllegalArgumentException expected) {
}
}
}
/**
* 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 Exception {
try {
TrustManagerFactory.getInstance(null, getDefaultProviderName());
fail();
} catch (NoSuchAlgorithmException expected) {
} catch (NullPointerException expected) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
TrustManagerFactory.getInstance(invalidValues[i],
getDefaultProviderName());
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 Exception {
for (String invalidValue : invalidValues) {
for (String validValue : getValidValues()) {
try {
TrustManagerFactory.getInstance(validValue, invalidValue);
fail("NoSuchProviderException must be thrown (algorithm: "
.concat(validValue).concat(" provider: ")
.concat(invalidValue).concat(")"));
} catch (NoSuchProviderException expected) {
assertFalse("".equals(invalidValue));
} catch (IllegalArgumentException expected) {
assertEquals("", invalidValue);
}
}
}
}
/**
* Test for <code>getInstance(String algorithm, String provider)</code>
* method
* Assertion: returns instance of TrustManagerFactory
*/
public void test_getInstanceLjava_lang_StringLjava_lang_String04() throws Exception {
for (String validValue : getValidValues()) {
TrustManagerFactory trustMF = TrustManagerFactory.getInstance(validValue,
getDefaultProviderName());
assertTrue("Not TrustManagerFactory object",
trustMF instanceof TrustManagerFactory);
assertEquals("Invalid algorithm", trustMF.getAlgorithm(), validValue);
assertEquals("Invalid provider", trustMF.getProvider(), getDefaultProvider());
}
}
/**
* 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 Exception {
for (String validValue : getValidValues()) {
try {
TrustManagerFactory.getInstance(validValue, (Provider) null);
} catch (IllegalArgumentException expected) {
}
}
}
/**
* 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() {
try {
TrustManagerFactory.getInstance(null, getDefaultProvider());
fail("");
} catch (NoSuchAlgorithmException expected) {
} catch (NullPointerException expected) {
}
for (int i = 0; i < invalidValues.length; i++) {
try {
TrustManagerFactory.getInstance(invalidValues[i],
getDefaultProvider());
fail("NoSuchAlgorithmException must be thrown (algorithm: "
.concat(invalidValues[i]).concat(")"));
} catch (NoSuchAlgorithmException e) {
}
}
}
/**
* Test for <code>getInstance(String algorithm, Provider provider)</code>
* method
* Assertion: returns instance of TrustManagerFactory
*/
public void test_getInstanceLjava_lang_StringLjava_security_Provider03() throws Exception {
for (String validValue : getValidValues()) {
TrustManagerFactory trustMF = TrustManagerFactory.getInstance(validValue,
getDefaultProvider());
assertTrue("Not TrustManagerFactory object",
trustMF instanceof TrustManagerFactory);
assertEquals("Invalid algorithm", trustMF.getAlgorithm(), validValue);
assertEquals("Invalid provider", trustMF.getProvider(), getDefaultProvider());
}
}
/**
* Test for <code>getProvider()</code>
* @throws NoSuchAlgorithmException
* @throws NoSuchProviderException
*/
public void test_getProvider()
throws NoSuchAlgorithmException, NoSuchProviderException {
assertEquals("Incorrect provider",
getDefaultProvider(),
TrustManagerFactory
.getInstance(getDefaultAlgorithm()).getProvider());
assertEquals("Incorrect provider",
getDefaultProvider(),
TrustManagerFactory
.getInstance(getDefaultAlgorithm(), getDefaultProviderName())
.getProvider());
assertEquals("Incorrect provider",
getDefaultProvider(),
TrustManagerFactory.getInstance(getDefaultAlgorithm(), getDefaultProvider())
.getProvider());
}
/**
* Test for <code>geTrustManagers()</code>
* @throws KeyStoreException
* @throws IOException
* @throws CertificateException
* @throws NoSuchAlgorithmException
*/
public void test_getTrustManagers() {
try {
TrustManagerFactory trustMF = TrustManagerFactory.getInstance(getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
trustMF.init(ks);
TrustManager[] tm = trustMF.getTrustManagers();
assertNotNull("Result has not be null", tm);
assertTrue("Length of result TrustManager array should not be 0",
(tm.length > 0));
} catch (Exception ex) {
fail("Unexpected exception " + ex.toString());
}
}
/**
* Test for <code>init(KeyStore keyStore)</code>
* Assertion: call method with null parameter
*/
public void test_initLjava_security_KeyStore_01() throws Exception {
KeyStore ksNull = null;
TrustManagerFactory[] trustMF = createTMFac();
assertNotNull("TrustManagerFactory objects were not created", trustMF);
// null parameter
try {
trustMF[0].init(ksNull);
} catch (Exception ex) {
fail(ex + " unexpected exception was thrown for null parameter");
}
}
/**
* Test for <code>init(KeyStore keyStore)</code>
* Assertion: call method with not null parameter
*/
public void test_initLjava_security_KeyStore_02() throws Exception {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
TrustManagerFactory[] trustMF = createTMFac();
assertNotNull("TrustManagerFactory objects were not created", trustMF);
// not null parameter
trustMF[0].init(ks);
}
/**
* Test for <code>init(ManagerFactoryParameters params)</code>
* Assertion:
* throws InvalidAlgorithmParameterException when params is null
*/
@KnownFailure("ManagerFactoryParameters object is not supported "
+ "and InvalidAlgorithmParameterException was thrown.")
public void test_initLjavax_net_ssl_ManagerFactoryParameters() throws Exception {
ManagerFactoryParameters par = null;
TrustManagerFactory[] trustMF = createTMFac();
assertNotNull("TrustManagerFactory objects were not created", trustMF);
for (int i = 0; i < trustMF.length; i++) {
try {
trustMF[i].init(par);
fail("InvalidAlgorithmParameterException must be thrown");
} catch (InvalidAlgorithmParameterException e) {
}
}
String keyAlg = "DSA";
String validCaNameRfc2253 = ("CN=Test CA,"
+ "OU=Testing Division,"
+ "O=Test It All,"
+ "L=Test Town,"
+ "ST=Testifornia,"
+ "C=Testland");
try {
KeyStore kStore = KeyStore.getInstance(KeyStore.getDefaultType());
kStore.load(null, null);
PublicKey pk = new TestKeyPair(keyAlg).getPublic();
TrustAnchor ta = new TrustAnchor(validCaNameRfc2253, pk, getFullEncoding());
Set<TrustAnchor> trustAnchors = new HashSet<TrustAnchor>();
trustAnchors.add(ta);
X509CertSelector xcs = new X509CertSelector();
PKIXBuilderParameters pkixBP = new PKIXBuilderParameters(trustAnchors, xcs);
CertPathTrustManagerParameters cptmp = new CertPathTrustManagerParameters(pkixBP);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(getDefaultAlgorithm());
try {
tmf.init(cptmp);
} catch (Exception ex) {
fail(ex + " was thrown for init(ManagerFactoryParameters spec)");
}
} catch (Exception e) {
fail("Unexpected exception for configuration: " + e);
}
}
private static final byte[] getFullEncoding() {
// DO NOT MODIFY!
return new byte[] {
(byte)0x30,(byte)0x81,(byte)0x8c,(byte)0xa0,
(byte)0x44,(byte)0x30,(byte)0x16,(byte)0x86,
(byte)0x0e,(byte)0x66,(byte)0x69,(byte)0x6c,
(byte)0x65,(byte)0x3a,(byte)0x2f,(byte)0x2f,
(byte)0x66,(byte)0x6f,(byte)0x6f,(byte)0x2e,
(byte)0x63,(byte)0x6f,(byte)0x6d,(byte)0x80,
(byte)0x01,(byte)0x00,(byte)0x81,(byte)0x01,
(byte)0x01,(byte)0x30,(byte)0x16,(byte)0x86,
(byte)0x0e,(byte)0x66,(byte)0x69,(byte)0x6c,
(byte)0x65,(byte)0x3a,(byte)0x2f,(byte)0x2f,
(byte)0x62,(byte)0x61,(byte)0x72,(byte)0x2e,
(byte)0x63,(byte)0x6f,(byte)0x6d,(byte)0x80,
(byte)0x01,(byte)0x00,(byte)0x81,(byte)0x01,
(byte)0x01,(byte)0x30,(byte)0x12,(byte)0x86,
(byte)0x0a,(byte)0x66,(byte)0x69,(byte)0x6c,
(byte)0x65,(byte)0x3a,(byte)0x2f,(byte)0x2f,
(byte)0x6d,(byte)0x75,(byte)0x75,(byte)0x80,
(byte)0x01,(byte)0x00,(byte)0x81,(byte)0x01,
(byte)0x01,(byte)0xa1,(byte)0x44,(byte)0x30,
(byte)0x16,(byte)0x86,(byte)0x0e,(byte)0x68,
(byte)0x74,(byte)0x74,(byte)0x70,(byte)0x3a,
(byte)0x2f,(byte)0x2f,(byte)0x66,(byte)0x6f,
(byte)0x6f,(byte)0x2e,(byte)0x63,(byte)0x6f,
(byte)0x6d,(byte)0x80,(byte)0x01,(byte)0x00,
(byte)0x81,(byte)0x01,(byte)0x01,(byte)0x30,
(byte)0x16,(byte)0x86,(byte)0x0e,(byte)0x68,
(byte)0x74,(byte)0x74,(byte)0x70,(byte)0x3a,
(byte)0x2f,(byte)0x2f,(byte)0x62,(byte)0x61,
(byte)0x72,(byte)0x2e,(byte)0x63,(byte)0x6f,
(byte)0x6d,(byte)0x80,(byte)0x01,(byte)0x00,
(byte)0x81,(byte)0x01,(byte)0x01,(byte)0x30,
(byte)0x12,(byte)0x86,(byte)0x0a,(byte)0x68,
(byte)0x74,(byte)0x74,(byte)0x70,(byte)0x3a,
(byte)0x2f,(byte)0x2f,(byte)0x6d,(byte)0x75,
(byte)0x75,(byte)0x80,(byte)0x01,(byte)0x00,
(byte)0x81,(byte)0x01,(byte)0x01
};
}
}
/**
* Addifional class to verify TrustManagerFactory constructor
*/
class myTrustManagerFactory extends TrustManagerFactory {
public myTrustManagerFactory(TrustManagerFactorySpi spi, Provider prov,
String alg) {
super(spi, prov, alg);
}
}