1860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root/* 2860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * Copyright (C) 2009 The Android Open Source Project 3860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * 4860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * you may not use this file except in compliance with the License. 6860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * You may obtain a copy of the License at 7860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * 8860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 9860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * 10860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * Unless required by applicable law or agreed to in writing, software 11860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * See the License for the specific language governing permissions and 14860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * limitations under the License. 15860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root */ 16860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 17860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootpackage org.conscrypt; 18860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 19860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport java.util.Enumeration; 20860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport java.util.HashSet; 21860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport java.util.Set; 22860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport javax.net.ssl.SSLSession; 23860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport junit.framework.TestCase; 24860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport libcore.javax.net.ssl.FakeSSLSession; 25860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 26860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootpublic final class ClientSessionContextTest extends TestCase { 27860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 28860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root public void testSimpleAddition() { 29860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ClientSessionContext context = new ClientSessionContext(); 30860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root SSLSession a = new ValidSSLSession("a"); 31860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root SSLSession b = new ValidSSLSession("b"); 32860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 33860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(a); 34860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { a }, new SSLSession[] { b }); 35860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 36860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(b); 37860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { a, b }, new SSLSession[0]); 38860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 39860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 40860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root public void testTrimToSize() { 41860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ClientSessionContext context = new ClientSessionContext(); 42860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession a = new ValidSSLSession("a"); 43860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession b = new ValidSSLSession("b"); 44860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession c = new ValidSSLSession("c"); 45860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession d = new ValidSSLSession("d"); 46860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 47860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(a); 48860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { a }, new SSLSession[] { b, c, d }); 49860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 50860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(b); 51860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { a, b }, new SSLSession[] { c, d }); 52860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 53860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(c); 54860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { a, b, c }, new SSLSession[] { d }); 55860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 56860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(d); 57860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { a, b, c, d }, new SSLSession[0]); 58860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 59860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.setSessionCacheSize(2); 60860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { c, d }, new SSLSession[] { a, b }); 61860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 62860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 63860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root public void testImplicitRemovalOfOldest() { 64860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ClientSessionContext context = new ClientSessionContext(); 65860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.setSessionCacheSize(2); 66860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession a = new ValidSSLSession("a"); 67860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession b = new ValidSSLSession("b"); 68860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession c = new ValidSSLSession("c"); 69860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession d = new ValidSSLSession("d"); 70860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 71860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(a); 72860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { a }, new SSLSession[] { b, c, d }); 73860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 74860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(b); 75860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { a, b }, new SSLSession[] { c, d }); 76860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 77860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(c); 78860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { b, c }, new SSLSession[] { a, d }); 79860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 80860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root context.putSession(d); 81860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSessionContextContents(context, new SSLSession[] { c, d }, new SSLSession[] { a, b }); 82860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 83860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 84860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root private static void assertSessionContextContents(ClientSessionContext context, 85860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root SSLSession[] contains, 86860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root SSLSession[] exludes) { 87860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertEquals(contains.length, context.size()); 88860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 89860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root for (SSLSession s : contains) { 90860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSame(s.getPeerHost(), s, context.getSession(s.getId())); 91860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertSame(s.getPeerHost(), s, context.getSession(s.getPeerHost(), 443)); 92860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 93860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root for (SSLSession s : exludes) { 94860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertNull(s.getPeerHost(), context.getSession(s.getId())); 95860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertNull(s.getPeerHost(), context.getSession(s.getPeerHost(), 443)); 96860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 97860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 98860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root Set<SSLSession> sessions = new HashSet<SSLSession>(); 99860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root Enumeration<byte[]> ids = context.getIds(); 100860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root while (ids.hasMoreElements()) { 101860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root byte[] id = ids.nextElement(); 102860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root sessions.add(context.getSession(id)); 103860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 104860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 105860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root Set<SSLSession> expected = new HashSet<SSLSession>(); 106860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root for (SSLSession s : sessions) { 107860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root expected.add(s); 108860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 109860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root assertEquals(expected, sessions); 110860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 111860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root 112860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root static class ValidSSLSession extends FakeSSLSession { 113860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root ValidSSLSession(String host) { 114860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root super(host); 115860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 116860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root @Override public boolean isValid() { 117860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root return true; 118860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 119860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root } 120860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root} 121