/* * 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 com.squareup.okhttp.internal; import com.android.org.conscrypt.OpenSSLSocketImpl; import com.squareup.okhttp.Protocol; import org.junit.Test; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import javax.net.ssl.HandshakeCompletedListener; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import okio.ByteString; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** * Tests for {@link Platform}. */ public class PlatformTest { @Test public void enableTlsExtensionOptionalMethods() throws Exception { Platform platform = new Platform(); // Expect no error TestSSLSocketImpl arbitrarySocketImpl = new TestSSLSocketImpl(); List protocols = Arrays.asList(Protocol.HTTP_1_1, Protocol.SPDY_3); platform.configureTlsExtensions(arbitrarySocketImpl, "host", protocols); NpnOnlySSLSocketImpl npnOnlySSLSocketImpl = new NpnOnlySSLSocketImpl(); platform.configureTlsExtensions(npnOnlySSLSocketImpl, "host", protocols); FullOpenSSLSocketImpl openSslSocket = new FullOpenSSLSocketImpl(); platform.configureTlsExtensions(openSslSocket, "host", protocols); assertTrue(openSslSocket.useSessionTickets); assertEquals("host", openSslSocket.hostname); assertArrayEquals(Platform.concatLengthPrefixed(protocols), openSslSocket.alpnProtocols); } @Test public void getSelectedProtocol() throws Exception { Platform platform = new Platform(); String selectedProtocol = "alpn"; TestSSLSocketImpl arbitrarySocketImpl = new TestSSLSocketImpl(); assertNull(platform.getSelectedProtocol(arbitrarySocketImpl)); NpnOnlySSLSocketImpl npnOnlySSLSocketImpl = new NpnOnlySSLSocketImpl(); assertNull(platform.getSelectedProtocol(npnOnlySSLSocketImpl)); FullOpenSSLSocketImpl openSslSocket = new FullOpenSSLSocketImpl(); openSslSocket.alpnProtocols = selectedProtocol.getBytes(StandardCharsets.UTF_8); assertEquals(selectedProtocol, platform.getSelectedProtocol(openSslSocket)); } private static class FullOpenSSLSocketImpl extends OpenSSLSocketImpl { private boolean useSessionTickets; private String hostname; private byte[] alpnProtocols; public FullOpenSSLSocketImpl() throws IOException { super(null); } @Override public void setUseSessionTickets(boolean useSessionTickets) { this.useSessionTickets = useSessionTickets; } @Override public void setHostname(String hostname) { this.hostname = hostname; } @Override public void setAlpnProtocols(byte[] alpnProtocols) { this.alpnProtocols = alpnProtocols; } @Override public byte[] getAlpnSelectedProtocol() { return alpnProtocols; } } // Legacy case - NPN support has been dropped. private static class NpnOnlySSLSocketImpl extends TestSSLSocketImpl { private byte[] npnProtocols; public void setNpnProtocols(byte[] npnProtocols) { this.npnProtocols = npnProtocols; } public byte[] getNpnSelectedProtocol() { return npnProtocols; } } private static class TestSSLSocketImpl extends SSLSocket { @Override public String[] getSupportedCipherSuites() { return new String[0]; } @Override public String[] getEnabledCipherSuites() { return new String[0]; } @Override public void setEnabledCipherSuites(String[] suites) { } @Override public String[] getSupportedProtocols() { return new String[0]; } @Override public String[] getEnabledProtocols() { return new String[0]; } @Override public void setEnabledProtocols(String[] protocols) { } @Override public SSLSession getSession() { return null; } @Override public void addHandshakeCompletedListener(HandshakeCompletedListener listener) { } @Override public void removeHandshakeCompletedListener(HandshakeCompletedListener listener) { } @Override public void startHandshake() throws IOException { } @Override public void setUseClientMode(boolean mode) { } @Override public boolean getUseClientMode() { return false; } @Override public void setNeedClientAuth(boolean need) { } @Override public void setWantClientAuth(boolean want) { } @Override public boolean getNeedClientAuth() { return false; } @Override public boolean getWantClientAuth() { return false; } @Override public void setEnableSessionCreation(boolean flag) { } @Override public boolean getEnableSessionCreation() { return false; } } }