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