blob: 8d7d797c74accf26635b8d2340a4a5f370c96d56 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed 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.android.unit_tests;
import android.content.ContentResolver;
import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.Settings;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.Suppress;
import com.google.android.net.GoogleHttpClient;
import com.android.internal.net.DbSSLSessionCache;
import com.android.internal.net.DbSSLSessionCache.DatabaseHelper;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import java.io.IOException;
import java.security.Principal;
import java.security.cert.Certificate;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSessionContext;
import javax.security.cert.X509Certificate;
/** Unit test for SSL session caching with {@link GoogleHttpClient}.
* Uses network resources.
*/
@Suppress
public class DbSSLSessionCacheTest extends AndroidTestCase {
protected void setUp() throws Exception {
}
protected void tearDown() throws Exception {
}
/**
* We want to test the actual database write - the actual hooking into
* low-level SSL is tested.
*/
@LargeTest
public void testSslCacheAdd() throws Exception {
// Let's verify the database has the rows.
// Use internal details of the implementation - could make the field
// visible for testing, but it's same.
// Use default database
DbSSLSessionCache cache = DbSSLSessionCache.getInstanceForPackage(getContext());
cache.clear();
makeRequestInNewContext("https://www.google.com");
// Verify the key was inserted
SQLiteOpenHelper helper = new DatabaseHelper(getContext());
Cursor query = null;
try {
query = helper.getReadableDatabase().query(DbSSLSessionCache.SSL_CACHE_TABLE,
new String[] {"hostport"}, null,
null, null, null, null);
assertTrue(query.moveToFirst()); // one row inserted
String hostPort = query.getString(0);
assertEquals(hostPort, "www.google.com:443");
} finally {
query.close();
}
}
@LargeTest
public void testExpire() throws Exception {
DatabaseHelper helper = new DatabaseHelper(getContext());
// clean up
DbSSLSessionCache cache = new DbSSLSessionCache(helper);
cache.clear();
long t0 = System.currentTimeMillis();
for (int i = 0; i < DbSSLSessionCache.MAX_CACHE_SIZE + 2; i++) {
final int port = i;
cache.putSessionData(new MockSession() {
public String getPeerHost() {
return "test.host.com";
}
public int getPeerPort() {
return port;
}
}, new byte[256]);
}
long t1 = System.currentTimeMillis();
System.err.println("Time to insert " +
(DbSSLSessionCache.MAX_CACHE_SIZE + 2) + " " + (t1 - t0));
// first entry should have port 1.
Cursor query = helper.getReadableDatabase().query(DbSSLSessionCache.SSL_CACHE_TABLE,
new String[] {"hostport", "session"}, null,
null, null, null, null);
int cnt = query.getCount();
assertTrue(query.moveToFirst()); // one row inserted
String hostPort = query.getString(0);
assertEquals("test.host.com:2", hostPort);
while (query.moveToNext()) {
hostPort = query.getString(0);
String session = query.getString(1);
}
long t2 = System.currentTimeMillis();
System.err.println("Time to load " + cnt + " " + (t2 - t1));
query.close();
}
private void makeRequestInNewContext(String url) throws IOException {
GoogleHttpClient client = new GoogleHttpClient(getContext(), "Test",
false /* no gzip */);
try {
// Note: we must test against a real server, because the connection
// gets established before the interceptor can crash the request.
HttpGet method = new HttpGet(url);
HttpResponse response = client.execute(method);
} finally {
client.close();
}
}
private static class MockSession implements SSLSession {
public String getPeerHost() {
throw new UnsupportedOperationException();
}
public int getPeerPort() {
throw new UnsupportedOperationException();
}
public int getApplicationBufferSize() {
throw new UnsupportedOperationException();
}
public String getCipherSuite() {
throw new UnsupportedOperationException();
}
public long getCreationTime() {
throw new UnsupportedOperationException();
}
public byte[] getId() {
throw new UnsupportedOperationException();
}
public long getLastAccessedTime() {
throw new UnsupportedOperationException();
}
public Certificate[] getLocalCertificates() {
throw new UnsupportedOperationException();
}
public Principal getLocalPrincipal() {
throw new UnsupportedOperationException();
}
public int getPacketBufferSize() {
throw new UnsupportedOperationException();
}
public X509Certificate[] getPeerCertificateChain()
throws SSLPeerUnverifiedException {
throw new UnsupportedOperationException();
}
public Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException {
throw new UnsupportedOperationException();
}
public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
throw new UnsupportedOperationException();
}
public String getProtocol() {
throw new UnsupportedOperationException();
}
public SSLSessionContext getSessionContext() {
throw new UnsupportedOperationException();
}
public Object getValue(String name) {
throw new UnsupportedOperationException();
}
public String[] getValueNames() {
throw new UnsupportedOperationException();
}
public void invalidate() {
throw new UnsupportedOperationException();
}
public boolean isValid() {
throw new UnsupportedOperationException();
}
public void putValue(String name, Object value) {
throw new UnsupportedOperationException();
}
public void removeValue(String name) {
throw new UnsupportedOperationException();
}
}
}