19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.core; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.xnet.provider.jsse.FileClientSessionCache; 223c7c351a6217ac48b741740167c201a679a0ca65Brian Carlstromimport org.apache.harmony.xnet.provider.jsse.OpenSSLContextImpl; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.conn.scheme.SchemeRegistry; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.conn.scheme.Scheme; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.conn.ClientConnectionManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.conn.ssl.SSLSocketFactory; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.conn.SingleClientConnManager; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.impl.client.DefaultHttpClient; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.client.methods.HttpGet; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.client.ResponseHandler; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.client.ClientProtocolException; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HttpResponse; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.net.ssl.SSLSession; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.net.ssl.SSLSessionContext; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Method; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.InvocationTargetException; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.Principal; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.KeyManagementException; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Arrays; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SSLPerformanceTest extends AndroidTestCase { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final byte[] SESSION_DATA = new byte[6000]; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < SESSION_DATA.length; i++) { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SESSION_DATA[i] = (byte) i; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final File dataDir = new File("/data/data/android.core/"); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final File filesDir = new File(dataDir, "files"); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final File dbDir = new File(dataDir, "databases"); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String CACHE_DIR 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = SSLPerformanceTest.class.getName() + "/cache"; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int ITERATIONS = 10; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testCreateNewEmptyDatabase() { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDatabase(); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseSessionCache cache = new DatabaseSessionCache(getContext()); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.getSessionData("crazybob.org", 443); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testCreateNewEmptyDirectory() throws IOException { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDirectory(); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SSLClientSessionCache cache = FileClientSessionCache.usingDirectory( 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getCacheDirectory()); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.getSessionData("crazybob.org", 443); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testOpenDatabaseWith10Sessions() { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDatabase(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseSessionCache cache = new DatabaseSessionCache(getContext()); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project putSessionsIn(cache); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeDatabase(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Size of ssl_sessions.db w/ 10 sessions: " 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + new File(dbDir, "ssl_sessions.db").length()); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache = new DatabaseSessionCache(getContext()); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.getSessionData("crazybob.org", 443); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testOpenDirectoryWith10Sessions() throws IOException { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDirectory(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SSLClientSessionCache cache = FileClientSessionCache.usingDirectory( 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getCacheDirectory()); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project putSessionsIn(cache); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeDirectoryCache(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache = FileClientSessionCache.usingDirectory( 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getCacheDirectory()); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.getSessionData("crazybob.org", 443); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testGetSessionFromDatabase() { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDatabase(); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseSessionCache cache = new DatabaseSessionCache(getContext()); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.putSessionData(new FakeSession("foo"), SESSION_DATA); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeDatabase(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache = new DatabaseSessionCache(getContext()); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.getSessionData("crazybob.org", 443); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] sessionData = cache.getSessionData("foo", 443); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertTrue(Arrays.equals(SESSION_DATA, sessionData)); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testGetSessionFromDirectory() throws IOException { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDirectory(); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SSLClientSessionCache cache = FileClientSessionCache.usingDirectory( 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getCacheDirectory()); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.putSessionData(new FakeSession("foo"), SESSION_DATA); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeDirectoryCache(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache = FileClientSessionCache.usingDirectory( 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getCacheDirectory()); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.getSessionData("crazybob.org", 443); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] sessionData = cache.getSessionData("foo", 443); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertTrue(Arrays.equals(SESSION_DATA, sessionData)); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testPutSessionIntoDatabase() { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDatabase(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseSessionCache cache = new DatabaseSessionCache(getContext()); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.getSessionData("crazybob.org", 443); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.putSessionData(new FakeSession("foo"), SESSION_DATA); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testPutSessionIntoDirectory() throws IOException { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDirectory(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SSLClientSessionCache cache = FileClientSessionCache.usingDirectory( 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getCacheDirectory()); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.getSessionData("crazybob.org", 443); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.putSessionData(new FakeSession("foo"), SESSION_DATA); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testEngineInit() throws IOException, KeyManagementException { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1923c7c351a6217ac48b741740167c201a679a0ca65Brian Carlstrom new OpenSSLContextImpl().engineInit(null, null, null); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testWebRequestWithoutCache() throws IOException, 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyManagementException { 1993c7c351a6217ac48b741740167c201a679a0ca65Brian Carlstrom OpenSSLContextImpl sslContext = new OpenSSLContextImpl(); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sslContext.engineInit(null, null, null); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getVerisignDotCom(sslContext); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testWebRequestWithFileCache() throws IOException, 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyManagementException { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDirectory(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2133c7c351a6217ac48b741740167c201a679a0ca65Brian Carlstrom OpenSSLContextImpl sslContext = new OpenSSLContextImpl(); 2142c42c8fbaf02be1f3ea6298077128d0c419526f0Brian Carlstrom sslContext.engineInit(null, null, null); 2152c42c8fbaf02be1f3ea6298077128d0c419526f0Brian Carlstrom sslContext.engineGetClientSessionContext().setPersistentCache( 2162c42c8fbaf02be1f3ea6298077128d0c419526f0Brian Carlstrom FileClientSessionCache.usingDirectory(getCacheDirectory())); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure www.google.com is in the cache. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getVerisignDotCom(sslContext); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Re-initialize so we hit the file cache. 2222c42c8fbaf02be1f3ea6298077128d0c419526f0Brian Carlstrom sslContext.engineInit(null, null, null); 2232c42c8fbaf02be1f3ea6298077128d0c419526f0Brian Carlstrom sslContext.engineGetClientSessionContext().setPersistentCache( 2242c42c8fbaf02be1f3ea6298077128d0c419526f0Brian Carlstrom FileClientSessionCache.usingDirectory(getCacheDirectory())); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getVerisignDotCom(sslContext); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testWebRequestWithInMemoryCache() throws IOException, 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyManagementException { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deleteDirectory(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2373c7c351a6217ac48b741740167c201a679a0ca65Brian Carlstrom OpenSSLContextImpl sslContext = new OpenSSLContextImpl(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sslContext.engineInit(null, null, null); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure www.google.com is in the cache. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getVerisignDotCom(sslContext); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stopwatch stopwatch = new Stopwatch(); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getVerisignDotCom(sslContext); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopwatch.stop(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2503c7c351a6217ac48b741740167c201a679a0ca65Brian Carlstrom private void getVerisignDotCom(OpenSSLContextImpl sslContext) 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SchemeRegistry schemeRegistry = new SchemeRegistry(); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project schemeRegistry.register(new Scheme("https", 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SSLSocketFactory(sslContext.engineGetSocketFactory()), 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 443)); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClientConnectionManager manager = 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SingleClientConnManager(null, schemeRegistry); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new DefaultHttpClient(manager, null).execute( 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new HttpGet("https://www.verisign.com"), 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ResponseHandler<Object>() { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object handleResponse(HttpResponse response) 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws ClientProtocolException, IOException { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void putSessionsIn(SSLClientSessionCache cache) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < 10; i++) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cache.putSessionData(new FakeSession("host" + i), SESSION_DATA); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void deleteDatabase() { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeDatabase(); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!new File(dbDir, "ssl_sessions.db").delete()) { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Failed to delete database."); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void closeDatabase() { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DatabaseSessionCache.sDefaultDatabaseHelper != null) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseSessionCache.sDefaultDatabaseHelper.close(); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseSessionCache.sDefaultDatabaseHelper = null; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseSessionCache.sHookInitializationDone = false; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseSessionCache.mNeedsCacheLoad = true; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void deleteDirectory() { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeDirectoryCache(); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File dir = getCacheDirectory(); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!dir.exists()) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (File file : dir.listFiles()) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file.delete(); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!dir.delete()) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Failed to delete directory."); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void closeDirectoryCache() { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Method reset = FileClientSessionCache.class 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getDeclaredMethod("reset"); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reset.setAccessible(true); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reset.invoke(null); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NoSuchMethodException e) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalAccessException e) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InvocationTargetException e) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getCacheDirectory() { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new File(getContext().getFilesDir(), CACHE_DIR); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Stopwatch { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.startAllocCounting(); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long start = System.nanoTime(); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stop() { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long elapsed = (System.nanoTime() - start) / 1000; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.stopAllocCounting(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(getName() + ": " + elapsed + "us, " 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Debug.getThreadAllocCount() + " allocations, " 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Debug.getThreadAllocSize() + " bytes"); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass FakeSession implements SSLSession { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String host; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FakeSession(String host) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.host = host; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getApplicationBufferSize() { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getCipherSuite() { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getCreationTime() { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getId() { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return host.getBytes(); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getLastAccessedTime() { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Certificate[] getLocalCertificates() { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Principal getLocalPrincipal() { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPacketBufferSize() { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public javax.security.cert.X509Certificate[] getPeerCertificateChain() { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Certificate[] getPeerCertificates() { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPeerHost() { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return host; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPeerPort() { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 443; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Principal getPeerPrincipal() { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getProtocol() { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SSLSessionContext getSessionContext() { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getValue(String name) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] getValueNames() { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void invalidate() { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isValid() { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void putValue(String name, Object value) { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeValue(String name) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 433