16a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler/*
26a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * Copyright (C) 2010 The Android Open Source Project
36a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler *
46a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * Licensed under the Apache License, Version 2.0 (the "License");
56a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * you may not use this file except in compliance with the License.
66a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * You may obtain a copy of the License at
76a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler *
86a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler *      http://www.apache.org/licenses/LICENSE-2.0
96a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler *
106a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * Unless required by applicable law or agreed to in writing, software
116a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * distributed under the License is distributed on an "AS IS" BASIS,
126a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * See the License for the specific language governing permissions and
146a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * limitations under the License.
156a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler */
166a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
17f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianpackage org.conscrypt.javax.net.ssl;
186a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
196a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertEquals;
206a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertFalse;
216a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertNotNull;
226a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertNotSame;
236a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertNull;
246a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertSame;
256a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertTrue;
266a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.fail;
276a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
28f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport java.lang.reflect.Field;
29f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport java.lang.reflect.Method;
30f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport java.net.InetAddress;
316a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport java.util.Arrays;
32ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport java.util.concurrent.Callable;
3392cc61e22c168d305e9fecccc064248bda3d5413David Benjaminimport java.util.concurrent.ExecutionException;
34ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport java.util.concurrent.ExecutorService;
35ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport java.util.concurrent.Executors;
36ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport java.util.concurrent.Future;
376a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport javax.net.ssl.SSLPeerUnverifiedException;
38f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport javax.net.ssl.SSLSession;
39ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport javax.net.ssl.SSLSocket;
406a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport libcore.java.security.StandardNames;
41f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport org.conscrypt.TestUtils;
426b42eebd40b25618f1110d709f60d65a22e3dc2bAdam Vartanianimport org.conscrypt.java.security.TestKeyStore;
436a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport org.junit.Test;
446a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport org.junit.runner.RunWith;
456a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport org.junit.runners.JUnit4;
466a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
476a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler@RunWith(JUnit4.class)
48f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianpublic class SSLSessionTest {
496a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
506a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSocket_TestSSLSessions_create() {
516a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
526a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.invalid);
536a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertFalse(s.invalid.isValid());
546a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.server.isValid());
556a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.client.isValid());
566a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
576a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
586a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
596a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
606a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getApplicationBufferSize() {
616a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
626a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.invalid.getApplicationBufferSize() > 0);
636a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.server.getApplicationBufferSize() > 0);
646a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.client.getApplicationBufferSize() > 0);
656a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
666a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
676a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
686a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
696a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getCipherSuite() {
706a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
716a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.invalid.getCipherSuite());
726a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(StandardNames.CIPHER_SUITE_INVALID, s.invalid.getCipherSuite());
736a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.server.getCipherSuite());
746a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getCipherSuite());
756a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(s.server.getCipherSuite(), s.client.getCipherSuite());
766a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        StandardNames.assertValidCipherSuites(new String[] {s.server.getCipherSuite()});
776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
786a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
796a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
806a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
816a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getCreationTime() {
826a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        // We use OpenSSL, which only returns times accurate to the nearest second.
836a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        // NativeCrypto just multiplies by 1000, which looks like truncation, which
846a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        // would make it appear as if the OpenSSL side of things was created before
856a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        // we called it.
866a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        long t0 = System.currentTimeMillis() / 1000;
876a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
886a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        long t1 = System.currentTimeMillis() / 1000;
896a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
906a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.invalid.getCreationTime() > 0);
916a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
926a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        long sTime = s.server.getCreationTime() / 1000;
936a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(sTime + " >= " + t0, sTime >= t0);
946a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(sTime + " <= " + t1, sTime <= t1);
956a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
966a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        long cTime = s.client.getCreationTime() / 1000;
976a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(cTime + " >= " + t0, cTime >= t0);
986a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(cTime + " <= " + t1, cTime <= t1);
996a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
1006a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
1016a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
1026a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
1036a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
1046a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getId() {
1056a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
1066a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.invalid.getId());
1076a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.server.getId());
1086a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getId());
1096a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(0, s.invalid.getId().length);
1106a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        if (TestSSLContext.sslServerSocketSupportsSessionTickets()) {
1116a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            assertEquals(0, s.server.getId().length);
1126a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        } else {
1136a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            assertEquals(32, s.server.getId().length);
1146a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            assertTrue(Arrays.equals(s.server.getId(), s.client.getId()));
1156a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        }
1166a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(32, s.client.getId().length);
1176a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
1186a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
1196a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
1206a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
1216a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getLastAccessedTime() {
1226a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
1236a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.invalid.getLastAccessedTime() > 0);
1246a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.server.getLastAccessedTime() > 0);
1256a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.client.getLastAccessedTime() > 0);
1266a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue("s.server.getLastAccessedTime()=" + s.server.getLastAccessedTime() + " "
1276a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                        + "s.client.getLastAccessedTime()=" + s.client.getLastAccessedTime(),
1286a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                Math.abs(s.server.getLastAccessedTime() - s.client.getLastAccessedTime())
1296a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                        <= 1000);
1306a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.server.getLastAccessedTime() >= s.server.getCreationTime());
1316a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.client.getLastAccessedTime() >= s.client.getCreationTime());
1326a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
1336a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
1346a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
1356a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
1366a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getLocalCertificates() throws Exception {
1376a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
1386a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.invalid.getLocalCertificates());
1396a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.client.getLocalCertificates());
1406a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.server.getLocalCertificates());
1416a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestKeyStore.assertChainLength(s.server.getLocalCertificates());
1426a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLContext.assertServerCertificateChain(
1436a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                s.s.c.serverTrustManager, s.server.getLocalCertificates());
1446a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLContext.assertCertificateInKeyStore(
1456a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                s.server.getLocalCertificates()[0], s.s.c.serverKeyStore);
1466a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
1476a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
1486a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
1496a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
1506a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getLocalPrincipal() throws Exception {
1516a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
1526a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.invalid.getLocalPrincipal());
1536a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.client.getLocalPrincipal());
1546a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.server.getLocalPrincipal());
1556a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.server.getLocalPrincipal().getName());
1566a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLContext.assertCertificateInKeyStore(
1576a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                s.server.getLocalPrincipal(), s.s.c.serverKeyStore);
1586a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
1596a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
1606a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
1616a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
1626a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getPacketBufferSize() {
1636a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
1646a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.invalid.getPacketBufferSize() > 0);
1656a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.server.getPacketBufferSize() > 0);
1666a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.client.getPacketBufferSize() > 0);
1676a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
1686a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
1696a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
1706a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
1716a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getPeerCertificateChain() throws Exception {
1726a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
1736a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        try {
1746a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            s.invalid.getPeerCertificateChain();
1756a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            fail();
1766a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        } catch (SSLPeerUnverifiedException expected) {
1776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            // Ignored.
1786a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        }
1796a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getPeerCertificates());
1806a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestKeyStore.assertChainLength(s.client.getPeerCertificateChain());
1816a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        try {
1826a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            assertNull(s.server.getPeerCertificateChain());
1836a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            fail();
1846a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        } catch (SSLPeerUnverifiedException expected) {
1856a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            // Ignored.
1866a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        }
1876a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
1886a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
1896a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
1906a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
1916a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getPeerCertificates() throws Exception {
1926a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
1936a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        try {
1946a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            s.invalid.getPeerCertificates();
1956a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            fail();
1966a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        } catch (SSLPeerUnverifiedException expected) {
1976a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            // Ignored.
1986a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        }
1996a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getPeerCertificates());
2006a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestKeyStore.assertChainLength(s.client.getPeerCertificates());
2016a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLContext.assertServerCertificateChain(
2026a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                s.s.c.serverTrustManager, s.client.getPeerCertificates());
2036a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLContext.assertCertificateInKeyStore(
2046a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                s.client.getPeerCertificates()[0], s.s.c.serverKeyStore);
2056a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        try {
2066a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            s.server.getPeerCertificates();
2076a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            fail();
2086a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        } catch (SSLPeerUnverifiedException expected) {
2096a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            // Ignored.
2106a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        }
2116a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
2126a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
2136a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
2146a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
215ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian    public void test_SSLSession_getPeerCertificates_resumption() throws Exception {
216ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        TestSSLContext context = TestSSLContext.create();
217ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
218ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        // Ensure that the session is reused to the best of our ability
219ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        context.clientContext.getClientSessionContext().setSessionTimeout(1000000);
220ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        context.clientContext.getClientSessionContext().setSessionCacheSize(0);
221ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
222ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        SSLSocket client = (SSLSocket) context.clientContext.getSocketFactory().createSocket(
223ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian                context.host, context.port);
224ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        SSLSocket server = (SSLSocket) context.serverSocket.accept();
225ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        connect(client, server);
226ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
227ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        assertNotNull(client.getSession().getPeerCertificates());
228ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
229ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        client.close();
230ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        server.close();
231ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
232ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        client = (SSLSocket) context.clientContext.getSocketFactory().createSocket(
233ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian                context.host, context.port);
234ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        server = (SSLSocket) context.serverSocket.accept();
235ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        connect(client, server);
236ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
237ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        assertNotNull(client.getSession().getPeerCertificates());
238ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
239ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        client.close();
240ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        server.close();
241ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        context.close();
242ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian    }
243ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
244401f1c4645f5ec715516ee9674c662448d115e66Nathan Mittler    private static void connect(final SSLSocket client, final SSLSocket server)
24592cc61e22c168d305e9fecccc064248bda3d5413David Benjamin            throws InterruptedException, ExecutionException {
246ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        ExecutorService executor = Executors.newFixedThreadPool(2);
247ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        Future<Void> s = executor.submit(new Callable<Void>() {
248ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian            @Override
249ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian            public Void call() throws Exception {
250ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian                server.startHandshake();
251ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian                return null;
252ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian            }
253ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        });
254ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        Future<Void> c = executor.submit(new Callable<Void>() {
255ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian            @Override
256ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian            public Void call() throws Exception {
257ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian                client.startHandshake();
258ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian                return null;
259ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian            }
260ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        });
261ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian        executor.shutdown();
26292cc61e22c168d305e9fecccc064248bda3d5413David Benjamin        s.get();
26392cc61e22c168d305e9fecccc064248bda3d5413David Benjamin        c.get();
264ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian    }
265ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian
266ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian    @Test
2676a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getPeerHost() {
2686a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
2696a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.invalid.getPeerHost());
2706a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.server.getPeerHost());
2716a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getPeerHost());
2726a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
2736a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
2746a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
2756a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
2766a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getPeerPort() {
2776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
2786a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(-1, s.invalid.getPeerPort());
2796a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.server.getPeerPort() > 0);
2806a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(s.s.c.port, s.client.getPeerPort());
2816a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
2826a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
2836a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
2846a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
2856a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getPeerPrincipal() throws Exception {
2866a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
2876a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        try {
2886a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            s.invalid.getPeerPrincipal();
2896a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            fail();
2906a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        } catch (SSLPeerUnverifiedException expected) {
2916a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            // Ignored.
2926a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        }
2936a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        try {
2946a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            s.server.getPeerPrincipal();
2956a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            fail();
2966a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        } catch (SSLPeerUnverifiedException expected) {
2976a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            // Ignored.
2986a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        }
2996a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getPeerPrincipal());
3006a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getPeerPrincipal().getName());
3016a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLContext.assertCertificateInKeyStore(
3026a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler                s.client.getPeerPrincipal(), s.s.c.serverKeyStore);
3036a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
3046a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
3056a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3066a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
3076a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getProtocol() {
3086a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
3096a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.invalid.getProtocol());
3106a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals("NONE", s.invalid.getProtocol());
3116a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.server.getProtocol());
3126a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getProtocol());
3136a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(s.server.getProtocol(), s.client.getProtocol());
3146a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(StandardNames.SSL_SOCKET_PROTOCOLS.contains(s.server.getProtocol()));
3156a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
3166a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
3176a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3186a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
3196a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getSessionContext() {
3206a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
3216a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.invalid.getSessionContext());
3226a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.server.getSessionContext());
3236a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.client.getSessionContext());
3246a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(s.s.c.serverContext.getServerSessionContext(), s.server.getSessionContext());
3256a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(s.s.c.clientContext.getClientSessionContext(), s.client.getSessionContext());
3266a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotSame(s.server.getSessionContext(), s.client.getSessionContext());
3276a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
3286a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
3296a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3306a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
3316a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getValue() {
3326a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
3336a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        try {
3346a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            s.invalid.getValue(null);
3356a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            fail();
3366a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        } catch (IllegalArgumentException expected) {
3376a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler            // Ignored.
3386a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        }
3396a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.invalid.getValue("BOGUS"));
3406a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
3416a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
3426a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3436a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
3446a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_getValueNames() {
3456a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
3466a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNotNull(s.invalid.getValueNames());
3476a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(0, s.invalid.getValueNames().length);
3486a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
3496a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
3506a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3516a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
3526a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_invalidate() {
3536a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
3546a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3556a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertFalse(s.invalid.isValid());
3566a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.invalid.invalidate();
3576a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertFalse(s.invalid.isValid());
3586a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.invalid.getSessionContext());
3596a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3606a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.server.isValid());
3616a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.server.invalidate();
3626a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertFalse(s.server.isValid());
3636a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.server.getSessionContext());
3646a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3656a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.client.isValid());
3666a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.client.invalidate();
3676a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertFalse(s.client.isValid());
3686a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.client.getSessionContext());
3696a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3706a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
3716a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
3726a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3736a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
3746a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_isValid() {
3756a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
3766a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertFalse(s.invalid.isValid());
3776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.server.isValid());
3786a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertTrue(s.client.isValid());
3796a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
3806a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
3816a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3826a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
3836a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_putValue() {
3846a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
3856a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        String key = "KEY";
3866a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        String value = "VALUE";
3876a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.invalid.getValue(key));
3886a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(0, s.invalid.getValueNames().length);
3896a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.invalid.putValue(key, value);
3906a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertSame(value, s.invalid.getValue(key));
3916a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(1, s.invalid.getValueNames().length);
3926a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(key, s.invalid.getValueNames()[0]);
3936a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
3946a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
3956a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler
3966a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    @Test
3976a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    public void test_SSLSession_removeValue() {
3986a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        TestSSLSessions s = TestSSLSessions.create();
3996a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        String key = "KEY";
4006a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        String value = "VALUE";
4016a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.invalid.putValue(key, value);
4026a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(1, s.invalid.getValueNames().length);
4036a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(key, s.invalid.getValueNames()[0]);
4046a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.invalid.removeValue(key);
4056a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertNull(s.invalid.getValue(key));
4066a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        assertEquals(0, s.invalid.getValueNames().length);
4076a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler        s.close();
4086a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler    }
40982dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian
41082dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian    @Test
41182dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian    public void test_SSLSession_valueIndependence() {
41282dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian        // Multiple sessions should have independent value stores
41382dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian        for (int i = 0; i < 2; i++) {
41482dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            TestSSLSessions s = TestSSLSessions.create();
41582dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            String key = "KEY";
41682dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            String value = "VALUE";
41782dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            assertNull(s.invalid.getValue(key));
41882dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            assertEquals(0, s.invalid.getValueNames().length);
41982dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            s.invalid.putValue(key, value);
42082dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            assertSame(value, s.invalid.getValue(key));
42182dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            assertEquals(1, s.invalid.getValueNames().length);
42282dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            assertEquals(key, s.invalid.getValueNames()[0]);
42382dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian            s.close();
42482dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian        }
42582dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian    }
426f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian
427f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian    private static String alterOriginalHostName(InetAddress inetAddress, String originalHostName)
428f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            throws Exception {
429f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        Method getHolder = InetAddress.class.getDeclaredMethod("holder");
430f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        getHolder.setAccessible(true);
431f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian
432f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        Field originalHostNameField = Class.forName("java.net.InetAddress$InetAddressHolder")
433f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian                .getDeclaredField("originalHostName");
434f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        originalHostNameField.setAccessible(true);
435f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian
436f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        Object holder = getHolder.invoke(inetAddress);
437f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        String oldValue = (String)originalHostNameField.get(holder);
438f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        originalHostNameField.set(holder, originalHostName);
439f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        return oldValue;
440f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian    }
441f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian
442f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian    // http://b/35942385
443f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian    @Test
444f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian    public void test_SSLSession_getPeerHostFromInetAddress() throws Exception {
445f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        TestUtils.assumeAndroid();
4466b42eebd40b25618f1110d709f60d65a22e3dc2bAdam Vartanian        InetAddress inetAddress = TestUtils.getLoopbackAddress();
447f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        String oldOriginalHostName = alterOriginalHostName(inetAddress, "foobar");
448f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        try {
449f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            final TestSSLContext c = TestSSLContext.create();
450f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            final SSLSocket client = (SSLSocket) c.clientContext.getSocketFactory().createSocket(
4516b42eebd40b25618f1110d709f60d65a22e3dc2bAdam Vartanian                    TestUtils.getLoopbackAddress(), c.port);
452f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            final SSLSocket server = (SSLSocket) c.serverSocket.accept();
453f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian
454f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            ExecutorService executor = Executors.newSingleThreadExecutor();
455f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            Future<Void> future = executor.submit(new Callable<Void>() {
456f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian                                                      @Override
457f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian                                                      public Void call() throws Exception {
458f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian                                                          server.startHandshake();
459f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian                                                          return null;
460f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian                                                      }
461f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian                                                  });
462f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            executor.shutdown();
463f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            client.startHandshake();
464f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian
465f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            SSLSession sslSession = client.getSession();
466f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            assertEquals("foobar", sslSession.getPeerHost());
467f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian
468f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            future.get();
469f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            client.close();
470f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            server.close();
471f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            c.close();
472f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        } finally {
473f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            // Restore the original value (InetAddress objects are cached).
474f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian            alterOriginalHostName(inetAddress, oldOriginalHostName);
475f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian        }
476f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian    }
4776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler}
478