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