11fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root/* 2f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler * Copyright (C) 2017 The Android Open Source Project 31fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * 4f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler * Licensed under the Apache License, Version 2.0 (the "License"); 51fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * you may not use this file except in compliance with the License. 61fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * You may obtain a copy of the License at 71fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * 81fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * http://www.apache.org/licenses/LICENSE-2.0 91fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * 101fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * Unless required by applicable law or agreed to in writing, software 111fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 121fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * See the License for the specific language governing permissions and 141fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root * limitations under the License. 151fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root */ 161fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 171fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Rootpackage org.conscrypt; 181fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 1979e580368d00dc9de51993e883c2dc08dcbe6672Kenny Rootimport static org.junit.Assert.assertEquals; 201fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Rootimport static org.junit.Assert.assertNull; 21f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerimport static org.junit.Assert.assertSame; 22f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerimport static org.mockito.Matchers.same; 23f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerimport static org.mockito.Mockito.any; 24f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerimport static org.mockito.Mockito.mock; 25f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerimport static org.mockito.Mockito.verify; 26f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerimport static org.mockito.Mockito.when; 27f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler 28f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerimport java.security.cert.Certificate; 29e6d4b95d5472a70f1ce9f7455eb7f02bd91e95d0Tobias Thiererimport javax.net.ssl.SSLSession; 30f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerimport org.junit.Before; 311fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Rootimport org.junit.Test; 321fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 33f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittlerpublic abstract class AbstractSessionContextTest<T extends AbstractSessionContext> { 34f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler private T context; 3579e580368d00dc9de51993e883c2dc08dcbe6672Kenny Root 36f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler @Before 37f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler public void setup() { 38f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context = newContext(); 391fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root } 401fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 41f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler abstract T newContext(); 42f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler abstract int size(T context); 43c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler private static NativeSslSession[] toArray(NativeSslSession... sessions) { 44c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler return sessions; 45c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler } 46c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler 47c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler abstract NativeSslSession getCachedSession(T context, NativeSslSession s); 481fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 491fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root @Test 50f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler public void testSimpleAddition() { 51c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession a = newSession("a"); 52c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession b = newSession("b"); 531fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 54f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(a); 55f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSessionContextContents(toArray(a), toArray(b)); 561fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 57f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(b); 58f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSessionContextContents(toArray(a, b), toArray()); 591fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root } 601fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 611fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root @Test 62f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler public void testTrimToSize() { 63c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession a = newSession("a"); 64c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession b = newSession("b"); 65c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession c = newSession("c"); 66c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession d = newSession("d"); 671fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 68f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(a); 69f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(b); 70f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(c); 71f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(d); 72f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSessionContextContents(toArray(a, b, c, d), toArray()); 733cfdcb593943a161a861611fda7ab474fa3ec045Kenny Root 74f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.setSessionCacheSize(2); 75f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSessionContextContents(toArray(c, d), toArray(a, b)); 761fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root } 771fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 781fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root @Test 79f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler public void testImplicitRemovalOfOldest() { 80f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.setSessionCacheSize(2); 81c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession a = newSession("a"); 82c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession b = newSession("b"); 83c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession c = newSession("c"); 84c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession d = newSession("d"); 851fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 86f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(a); 87f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSessionContextContents(toArray(a), toArray(b, c, d)); 881fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 89f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(b); 90f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSessionContextContents(toArray(a, b), toArray(c, d)); 911fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 92f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(c); 93f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSessionContextContents(toArray(b, c), toArray(a, d)); 941fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 95f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(d); 96f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSessionContextContents(toArray(c, d), toArray(a, b)); 971fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root } 981fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 991fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root @Test 100f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler public void testSerializeSession() throws Exception { 101f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler Certificate mockCert = mock(Certificate.class); 102f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler when(mockCert.getEncoded()).thenReturn(new byte[] {0x05, 0x06, 0x07, 0x10}); 1031fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 104f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler byte[] encodedBytes = new byte[] {0x01, 0x02, 0x03}; 105c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler NativeSslSession session = new MockSessionBuilder() 106f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler .id(new byte[] {0x11, 0x09, 0x03, 0x20}) 107f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler .host("ssl.example.com") 108f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler .encodedBytes(encodedBytes) 109f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler .build(); 1101fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 111f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler SSLClientSessionCache mockCache = mock(SSLClientSessionCache.class); 112f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler ClientSessionContext context = new ClientSessionContext(); 113f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.setPersistentCache(mockCache); 1141fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 115f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler context.cacheSession(session); 116f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler verify(mockCache).putSessionData(any(SSLSession.class), same(encodedBytes)); 1171fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root } 1181fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 119f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler private void assertSessionContextContents( 120a5c2000f427edf9377c3e6a6cbbe0f8d6d21de40John Eismeier NativeSslSession[] contains, NativeSslSession[] excludes) { 121f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertEquals(contains.length, size(context)); 1221fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root 123c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler for (NativeSslSession s : contains) { 124f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertSame(s.getPeerHost(), s, getCachedSession(context, s)); 125f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler } 126a5c2000f427edf9377c3e6a6cbbe0f8d6d21de40John Eismeier for (NativeSslSession s : excludes) { 127f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler assertNull(s.getPeerHost(), getCachedSession(context, s)); 128e6d4b95d5472a70f1ce9f7455eb7f02bd91e95d0Tobias Thierer } 129e6d4b95d5472a70f1ce9f7455eb7f02bd91e95d0Tobias Thierer } 130e6d4b95d5472a70f1ce9f7455eb7f02bd91e95d0Tobias Thierer 131c88f9f55a523f128f0e4dace76a34724bfa1e88cNathan Mittler private NativeSslSession newSession(String host) { 132f0e05d561147458e3a10b4806e24d0752dfd5d4bNathan Mittler return new MockSessionBuilder().host(host).build(); 133e6d4b95d5472a70f1ce9f7455eb7f02bd91e95d0Tobias Thierer } 1341fa6994406158e6391b5d8b576a6a8aa5a52d13dKenny Root} 135