/* * 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.TestTargetClass; import dalvik.annotation.TestLevel; import dalvik.annotation.TestTargetNew; import java.io.ByteArrayInputStream; import java.net.URL; import java.security.Principal; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLPeerUnverifiedException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import org.apache.harmony.security.tests.support.cert.TestUtils; import junit.framework.TestCase; /** * Tests for <code>HttpsURLConnection</code> class constructors and methods. * */ @TestTargetClass(HttpsURLConnection.class) public class HttpsURLConnectionTest extends TestCase { /** * @tests javax.net.ssl.HttpsURLConnection#HttpsURLConnection(java_net_URL) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "HttpsURLConnection", args = {java.net.URL.class} ) public final void test_Constructor() { try { MyHttpsURLConnection huc = new MyHttpsURLConnection(new URL("https://www.fortify.net/")); } catch (Exception e) { fail("Unexpected exception: " + e.toString()); } try { MyHttpsURLConnection huc = new MyHttpsURLConnection(null); } catch (Exception e) { fail("Unexpected exception " + e.toString()); } } /** * @tests javax.net.ssl.HttpsURLConnection#getCipherSuite() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getCipherSuite", args = {} ) public final void test_getCipherSuite() { try { URL url = new URL("https://localhost:55555"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); try { connection.getCipherSuite(); fail("IllegalStateException wasn't thrown"); } catch (IllegalStateException ise) { //expected } } catch (Exception e) { fail("Unexpected exception " + e + " for exception case"); } try { HttpsURLConnection con = new MyHttpsURLConnection(new URL("https://www.fortify.net/")); assertEquals("CipherSuite", con.getCipherSuite()); } catch (Exception e) { fail("Unexpected exception " + e); } } /** * @tests javax.net.ssl.HttpsURLConnection#getLocalCertificates() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getLocalCertificates", args = {} ) public final void test_getLocalCertificates() { try { URL url = new URL("https://localhost:55555"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); try { connection.getLocalCertificates(); fail("IllegalStateException wasn't thrown"); } catch (IllegalStateException ise) { //expected } } catch (Exception e) { fail("Unexpected exception " + e + " for exception case"); } try { HttpsURLConnection con = new MyHttpsURLConnection(new URL("https://www.fortify.net/"), "X.508"); assertNull(con.getLocalCertificates()); con = new MyHttpsURLConnection(new URL("https://www.fortify.net/"), "X.509"); Certificate[] cert = con.getLocalCertificates(); assertNotNull(cert); assertEquals(1, cert.length); } catch (Exception e) { fail("Unexpected exception " + e); } } /** * @tests javax.net.ssl.HttpsURLConnection#getDefaultHostnameVerifier() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getDefaultHostnameVerifier", args = {} ) public final void test_getDefaultHostnameVerifier() { HostnameVerifier verifyer = HttpsURLConnection.getDefaultHostnameVerifier(); assertNotNull("Default hostname verifyer is null", verifyer); } /** * @tests javax.net.ssl.HttpsURLConnection#getDefaultSSLSocketFactory() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getDefaultSSLSocketFactory", args = {} ) public final void test_getDefaultSSLSocketFactory() { SSLSocketFactory sf = HttpsURLConnection.getDefaultSSLSocketFactory(); if (!sf.equals(SSLSocketFactory.getDefault())) { fail("incorrect DefaultSSLSocketFactory"); } } /** * @tests javax.net.ssl.HttpsURLConnection#getHostnameVerifier() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getHostnameVerifier", args = {} ) public final void test_getHostnameVerifier() throws Exception { HttpsURLConnection con = new MyHttpsURLConnection( new URL("https://www.fortify.net/")); HostnameVerifier verifyer = con.getHostnameVerifier(); assertNotNull("Hostname verifyer is null", verifyer); assertEquals("Incorrect value of hostname verirfyer", HttpsURLConnection.getDefaultHostnameVerifier(), verifyer); } /** * @tests javax.net.ssl.HttpsURLConnection#getLocalPrincipal() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getLocalPrincipal", args = {} ) public final void test_getLocalPrincipal() { try { URL url = new URL("https://localhost:55555"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); try { connection.getLocalPrincipal(); fail("IllegalStateException wasn't thrown"); } catch (IllegalStateException ise) { //expected } } catch (Exception e) { fail("Unexpected exception " + e + " for exception case"); } try { HttpsURLConnection con = new MyHttpsURLConnection(new URL("https://www.fortify.net/"), "X.508"); assertNull(con.getLocalPrincipal()); con = new MyHttpsURLConnection(new URL("https://www.fortify.net/"), "X.509"); assertNotNull("Local principal is null", con.getLocalPrincipal()); } catch (Exception e) { fail("Unexpected exception " + e); } } /** * @tests javax.net.ssl.HttpsURLConnection#getPeerPrincipal() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getPeerPrincipal", args = {} ) public final void test_getPeerPrincipal() throws Exception { try { URL url = new URL("https://localhost:55555"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); try { connection.getPeerPrincipal(); fail("IllegalStateException wasn't thrown"); } catch (IllegalStateException ise) { //expected } } catch (Exception e) { fail("Unexpected exception " + e + " for exception case"); } HttpsURLConnection con = new MyHttpsURLConnection(new URL("https://www.fortify.net/"), "X.508"); try { Principal p = con.getPeerPrincipal(); fail("SSLPeerUnverifiedException wasn't thrown"); } catch (SSLPeerUnverifiedException e) { //expected } con = new MyHttpsURLConnection(new URL("https://www.fortify.net/"), "X.509"); try { Principal p = con.getPeerPrincipal(); assertNotNull(p); } catch (Exception e) { fail("Unexpected exception " + e); } } /** * @tests javax.net.ssl.HttpsURLConnection#getServerCertificates() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getServerCertificates", args = {} ) public final void test_getServerCertificates() throws Exception { try { URL url = new URL("https://localhost:55555"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); try { connection.getServerCertificates(); fail("IllegalStateException wasn't thrown"); } catch (IllegalStateException ise) { //expected } } catch (Exception e) { fail("Unexpected exception " + e + " for exception case"); } HttpsURLConnection con = new MyHttpsURLConnection(new URL("https://www.fortify.net/"), "X.508"); try { Certificate[] cert = con.getServerCertificates(); fail("SSLPeerUnverifiedException wasn't thrown"); } catch (SSLPeerUnverifiedException e) { //expected } con = new MyHttpsURLConnection(new URL("https://www.fortify.net/"), "X.509"); try { Certificate[] cert = con.getServerCertificates(); assertNotNull(cert); assertEquals(1, cert.length); } catch (Exception e) { fail("Unexpected exception " + e); } } /** * @tests javax.net.ssl.HttpsURLConnection#getSSLSocketFactory() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getSSLSocketFactory", args = {} ) public final void test_getSSLSocketFactory() { HttpsURLConnection con = new MyHttpsURLConnection(null); SSLSocketFactory sf = con.getSSLSocketFactory(); if (!sf.equals(SSLSocketFactory.getDefault())) { fail("incorrect DefaultSSLSocketFactory"); } } /** * @tests javax.net.ssl.HttpsURLConnection#setDefaultHostnameVerifier() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "setDefaultHostnameVerifier", args = {javax.net.ssl.HostnameVerifier.class} ) public final void test_setDefaultHostnameVerifier() { try { HttpsURLConnection.setDefaultHostnameVerifier(null); fail("No expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // expected } try { myHostnameVerifier hnv = new myHostnameVerifier(); HttpsURLConnection.setDefaultHostnameVerifier(hnv); } catch (Exception e) { fail("Unexpected exception " + e); } } /** * @tests javax.net.ssl.HttpsURLConnection#setHostnameVerifier() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "setHostnameVerifier", args = {javax.net.ssl.HostnameVerifier.class} ) public final void test_setHostnameVerifier() { HttpsURLConnection con = new MyHttpsURLConnection(null); try { con.setHostnameVerifier(null); fail("No expected IllegalArgumentException"); } catch (IllegalArgumentException e) { } try { myHostnameVerifier hnv = new myHostnameVerifier(); con.setHostnameVerifier(hnv); } catch (Exception e) { fail("Unexpected exception " + e); } } /** * @tests javax.net.ssl.HttpsURLConnection#setDefaultSSLSocketFactory() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "setDefaultSSLSocketFactory", args = {javax.net.ssl.SSLSocketFactory.class} ) public final void test_setDefaultSSLSocketFactory() { try { HttpsURLConnection.setDefaultSSLSocketFactory(null); fail("No expected IllegalArgumentException"); } catch (IllegalArgumentException e) { } try { SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory .getDefault(); HttpsURLConnection.setDefaultSSLSocketFactory(ssf); } catch (Exception e) { fail("Unexpected exception " + e); } } /** * @tests javax.net.ssl.HttpsURLConnection#setSSLSocketFactory() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "setSSLSocketFactory", args = {javax.net.ssl.SSLSocketFactory.class} ) public final void test_setSSLSocketFactory() { HttpsURLConnection con = new MyHttpsURLConnection(null); try { con.setSSLSocketFactory(null); fail("No expected IllegalArgumentException"); } catch (IllegalArgumentException e) { } try { SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory .getDefault(); con.setSSLSocketFactory(ssf); } catch (Exception e) { fail("Unexpected exception " + e); } } } class MyHttpsURLConnection extends javax.net.ssl.HttpsURLConnection { private String typeDone; public MyHttpsURLConnection(URL url) { super(url); } public MyHttpsURLConnection(URL url, String type) { super(url); typeDone = type; } /* * @see javax.net.ssl.HttpsURLConnection#getCipherSuite() */ public String getCipherSuite() { return "CipherSuite"; } /* * @see javax.net.ssl.HttpsURLConnection#getLocalCertificates() */ public Certificate[] getLocalCertificates() { Certificate cert = null; try { CertificateFactory cf = CertificateFactory.getInstance(typeDone); byte[] barr = TestUtils.getX509Certificate_v1(); ByteArrayInputStream bis = new ByteArrayInputStream(barr); cert = cf.generateCertificate(bis); } catch (CertificateException se) { cert = null; } return cert == null ? null : new Certificate[]{cert}; } /* * @see javax.net.ssl.HttpsURLConnection#getServerCertificates() */ public Certificate[] getServerCertificates() throws SSLPeerUnverifiedException { Certificate cert = null; try { CertificateFactory cf = CertificateFactory.getInstance(typeDone); byte[] barr = TestUtils.getX509Certificate_v3(); ByteArrayInputStream bis = new ByteArrayInputStream(barr); cert = cf.generateCertificate(bis); } catch (CertificateException se) { throw new SSLPeerUnverifiedException("No server's end-entity certificate"); } return cert == null ? null : new Certificate[]{cert}; } /* * @see java.net.HttpURLConnection#disconnect() */ public void disconnect() { } /* * @see java.net.HttpURLConnection#usingProxy() */ public boolean usingProxy() { return false; } public void connect() { } } class myHostnameVerifier implements HostnameVerifier { myHostnameVerifier() { } public boolean verify(String hostname, SSLSession session) { if (hostname == session.getPeerHost()) { return true; } else return false; } }