1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Boris V. Kuznetsov 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @version $Revision$ 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.tests.java.security; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayInputStream; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.PrintStream; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Permission; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Security; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SecurityPermission; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider.Service; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collection; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashMap; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Iterator; 39a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilsonimport java.util.Locale; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Set; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map.Entry; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests for <code>Provider</code> constructor and methods 47f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ProviderTest extends TestCase { 505850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann /* 515850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Implementation note: The algorithm name ASH-1 might seem a bit strange, 525850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * but since the algorithms cannot be uninstalled anymore we need to make 535850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * sure there are not side-effects on other tests. Simply inserting SHA-1 545850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * destroys the existing provider infrastructure. 555850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann */ 56f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 575850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann Provider[] storedProviders; 58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider p; 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see TestCase#setUp() 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setUp() throws Exception { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.setUp(); 66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 675850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann storedProviders = Security.getProviders(); 68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project p = new MyProvider(); 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 725850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann @Override 735850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann protected void tearDown() throws Exception { 745850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann p.remove("MessageDigest.ASH-1"); 755850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann p.remove("MessageDigest.abc"); 765850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann p.remove("Alg.Alias.MessageDigest.ASH1"); 77f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 785850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann for (Provider p: Security.getProviders()) { 795850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann Security.removeProvider(p.getName()); 805850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann } 815850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann 825850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann for (Provider p: storedProviders) { 835850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann Security.addProvider(p); 845850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann } 85f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 865850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann super.tearDown(); 875850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann } 88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class under test for void Provider() 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testProvider() { 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!p.getProperty("Provider.id name").equals( 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String.valueOf(p.getName()))) { 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Incorrect \"Provider.id name\" value"); 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!p.getProperty("Provider.id version").equals( 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String.valueOf(p.getVersion()))) { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Incorrect \"Provider.id version\" value"); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!p.getProperty("Provider.id info").equals( 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String.valueOf(p.getInfo()))) { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Incorrect \"Provider.id info\" value"); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!p.getProperty("Provider.id className").equals( 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project p.getClass().getName())) { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Incorrect \"Provider.id className\" value"); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testClear() { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project p.clear(); 1132f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertNull(p.getProperty("MessageDigest.SHA-1")); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class under test for void Provider(String, double, String) 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testProviderStringdoubleString() { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider p = new MyProvider("Provider name", 123.456, "Provider info"); 1212f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("Provider name", p.getName()); 1222f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals(123.456, p.getVersion(), 0L); 1232f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("Provider info", p.getInfo()); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testGetName() { 1272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("MyProvider", p.getName()); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testGetVersion() { 1312f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals(1.0, p.getVersion(), 0L); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testGetInfo() { 1352f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("Provider for testing", p.getInfo()); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class under test for void putAll(Map) 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testPutAllMap() { 1422f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes HashMap hm = new HashMap(); 1432f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes hm.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd"); 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hm.put("Property 1", "value 1"); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hm.put("serviceName.algName attrName", "attrValue"); 1462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes hm.put("Alg.Alias.engineClassName.aliasName", "standardName"); 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project p.putAll(hm); 1482f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if (!"value 1".equals(p.getProperty("Property 1").trim()) || 1492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes !"attrValue".equals(p.getProperty("serviceName.algName attrName").trim()) || 1502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes !"standardName".equals(p.getProperty("Alg.Alias.engineClassName.aliasName").trim()) || 1512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes !"aaa.bbb.ccc.ddd".equals(p.getProperty("MessageDigest.SHA-1").trim()) ) { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Incorrect property value"); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class under test for Set entrySet() 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testEntrySet() { 1602f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd"); 161f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 1622f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes Set s = p.entrySet(); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.clear(); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Must return unmodifiable set"); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnsupportedOperationException e) { 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Incorrect set size", 8, s.size()); 170f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 1712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes for (Iterator it = s.iterator(); it.hasNext();) { 1722f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes Entry e = (Entry)it.next(); 1732f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes String key = (String)e.getKey(); 1742f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes String val = (String)e.getValue(); 1752f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if (key.equals("MessageDigest.SHA-1") && val.equals("SomeClassName")) { 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1782f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if (key.equals("Alg.Alias.MessageDigest.SHA1") && val.equals("SHA-1")) { 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key.equals("MessageDigest.abc") && val.equals("SomeClassName")) { 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1842f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if (key.equals("Provider.id className") && val.equals(p.getClass().getName())) { 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key.equals("Provider.id name") && val.equals("MyProvider")) { 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1902f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if (key.equals("MessageDigest.SHA-256") && val.equals("aaa.bbb.ccc.ddd")) { 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key.equals("Provider.id version") && val.equals("1.0")) { 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1962f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if (key.equals("Provider.id info") && val.equals("Provider for testing")) { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Incorrect set"); 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class under test for Set keySet() 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testKeySet() { 2072f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd"); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Set<Object> s = p.keySet(); 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.clear(); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnsupportedOperationException e) { 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2142f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes Set s1 = p.keySet(); 2152f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 2162f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertNotSame(s, s1); 2172f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertFalse(s1.isEmpty()); 2182f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals(8, s1.size()); 2192f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 2202f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(s1.contains("MessageDigest.SHA-256")); 2212f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(s1.contains("MessageDigest.SHA-1")); 2222f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(s1.contains("Alg.Alias.MessageDigest.SHA1")); 2232f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(s1.contains("MessageDigest.abc")); 2242f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(s1.contains("Provider.id info")); 2252f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(s1.contains("Provider.id className")); 2262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(s1.contains("Provider.id version")); 2272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(s1.contains("Provider.id name")); 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class under test for Collection values() 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testValues() { 2345850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann p.put("MessageDigest.ASH-256", "aaa.bbb.ccc.ddd"); 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Collection<Object> c = p.values(); 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.clear(); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnsupportedOperationException e) { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2412f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes Collection c1 = p.values(); 2422f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 2432f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertNotSame(c, c1); 2442f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertFalse(c1.isEmpty()); 2452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals(8, c1.size()); 2462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 2472f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(c1.contains("MyProvider")); 2482f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(c1.contains("aaa.bbb.ccc.ddd")); 2492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(c1.contains("Provider for testing")); 2502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(c1.contains("1.0")); 2512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(c1.contains("SomeClassName")); 2522f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(c1.contains("SHA-1")); 2532f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertTrue(c1.contains(p.getClass().getName())); 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class under test for Object put(Object, Object) 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testPutObjectObject() { 2602f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes p.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd"); 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project p.put("Type.Algorithm", "className"); 2622f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("aaa.bbb.ccc.ddd", p.getProperty("MessageDigest.SHA-1") 2632f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes .trim()); 264f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 2652f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes Set services = p.getServices(); 2662f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals(3, services.size()); 267f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 2682f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes for (Iterator it = services.iterator(); it.hasNext();) { 2692f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes Provider.Service s = (Provider.Service)it.next(); 2702f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if ("Type".equals(s.getType()) && 2712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes "Algorithm".equals(s.getAlgorithm()) && 2722f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes "className".equals(s.getClassName())) { 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2752f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if ("MessageDigest".equals(s.getType()) && 2762f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes "SHA-1".equals(s.getAlgorithm()) && 2772f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes "aaa.bbb.ccc.ddd".equals(s.getClassName())) { 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2802f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if ("MessageDigest".equals(s.getType()) && 2812f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes "abc".equals(s.getAlgorithm()) && 2822f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes "SomeClassName".equals(s.getClassName())) { 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue; 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Incorrect service"); 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2892f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes /* 2902f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * Class under test for Object remove(Object) 2912f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes */ 2922f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes public final void testRemoveObject() { 2932f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes Object o = p.remove("MessageDigest.SHA-1"); 2942f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 2952f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("SomeClassName", o); 2962f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertNull(p.getProperty("MessageDigest.SHA-1")); 2972f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals(1, p.getServices().size()); 2982f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 299f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3002f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes public final void testService1() { 3012f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes p.put("MessageDigest.SHA-1", "AnotherClassName"); 3022f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes Provider.Service s = p.getService("MessageDigest", "SHA-1"); 3032f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("AnotherClassName", s.getClassName()); 3042f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 3052f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 306a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson public final void testGetServiceCaseSensitivity() { 307a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson p.put("i.I", "foo"); 308a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson 309a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson Locale defaultLocale = Locale.getDefault(); 310a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson Locale.setDefault(new Locale("tr", "TR")); 311a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson try { 312a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson assertEquals("foo", p.getService("i", "i").getClassName()); 313a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson assertEquals("foo", p.getService("i", "I").getClassName()); 314a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson assertNull(p.getService("\u0130", "\u0130")); // Turkish dotless i and dotted I 315a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson assertNull(p.getService("\u0131", "\u0131")); 316a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson } finally { 317a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson Locale.setDefault(defaultLocale); 318a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson } 319a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson } 320a695e8fafadd2591cd148e78f19bc6d7c15121bbJesse Wilson 3212f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // Regression for HARMONY-2760. 3222f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes public void testConstructor() { 3232f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes MyProvider myProvider = new MyProvider(null, 1, null); 3242f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertNull(myProvider.getName()); 3252f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertNull(myProvider.getInfo()); 3262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("null", myProvider.getProperty("Provider.id name")); 3272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes assertEquals("null", myProvider.getProperty("Provider.id info")); 3282f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 3292f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 3302f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes class MyProvider extends Provider { 3312f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes MyProvider() { 3322f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes super("MyProvider", 1.0, "Provider for testing"); 3332f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes put("MessageDigest.SHA-1", "SomeClassName"); 3342f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes put("MessageDigest.abc", "SomeClassName"); 3352f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes put("Alg.Alias.MessageDigest.SHA1", "SHA-1"); 3362f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 337f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3382f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes MyProvider(String name, double version, String info) { 3392f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes super(name, version, info); 3402f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 341f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3422f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 3432f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes public void putService(Provider.Service s) { 3442f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes super.putService(s); 3452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 3462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 347f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3482f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 3492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes public void removeService(Provider.Service s) { 3502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes super.removeService(s); 3512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 3522f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 353f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3542f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 3552f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes public int getNumServices() { 3562f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes return getServices().size(); 3572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 3582f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 3592f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 3602f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 3612f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testService2() { 3635850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann Provider[] pp = Security.getProviders("MessageDigest.ASH-1"); 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (pp == null) { 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider p2 = pp[0]; 3685850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann String old = p2.getProperty("MessageDigest.ASH-1"); 3695850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann p2.put("MessageDigest.ASH-1", "AnotherClassName"); 3705850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann Provider.Service s = p2.getService("MessageDigest", "ASH-1"); 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!"AnotherClassName".equals(s.getClassName())) { 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Incorrect class name " + s.getClassName()); 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.newInstance(null); 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("No expected NoSuchAlgorithmException"); 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NoSuchAlgorithmException e) { 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3802f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3822f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testGetServices() { 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MyProvider myProvider = new MyProvider(null, 1, null); 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Set<Provider.Service> services = myProvider.getServices(); 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(0, services.size()); 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider.Service s[] = new Provider.Service[3]; 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[0] = new Provider.Service(p, "type1", "algorithm1", "className1", 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[1] = new Provider.Service(p, "type2", "algorithm2", "className2", 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[2] = new Provider.Service(p, "type3", "algorithm3", "className3", 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[0]); 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[1]); 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(2, myProvider.getNumServices()); 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Set<Service> actual = myProvider.getServices(); 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[1])); 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[2])); 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.removeService(s[1]); 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project actual = myProvider.getServices(); 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(1, myProvider.getNumServices()); 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[1])); 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[2])); 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[2]); 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project actual = myProvider.getServices(); 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(2, myProvider.getNumServices()); 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[1])); 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[2])); 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 4202f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4222f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testPutService() { 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MyProvider myProvider = new MyProvider(null, 1, null); 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider.Service s[] = new Provider.Service[3]; 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[0] = new Provider.Service(p, "type1", "algorithm1", "className1", 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[1] = new Provider.Service(p, "type2", "algorithm2", "className2", 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[2] = new Provider.Service(p, "type3", "algorithm3", "className3", 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[0]); 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[1]); 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(2, myProvider.getNumServices()); 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Set<Service> actual = myProvider.getServices(); 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[1])); 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[2])); 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.removeService(s[1]); 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(1, myProvider.getNumServices()); 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project actual = myProvider.getServices(); 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[1])); 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[2])); 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[2]); 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project actual = myProvider.getServices(); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(2, myProvider.getNumServices()); 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[1])); 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[2])); 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[2]); 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project actual = myProvider.getServices(); 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(2, myProvider.getNumServices()); 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[1])); 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[2])); 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(null); 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("NullPointerException expected"); 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NullPointerException e) { 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 4712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4732f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testRemoveService() { 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MyProvider myProvider = new MyProvider(null, 1, null); 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.removeService(null); 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("NullPoiterException expected"); 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NullPointerException e) { 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider.Service s[] = new Provider.Service[3]; 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[0] = new Provider.Service(p, "type0", "algorithm0", "className0", 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[1] = new Provider.Service(p, "type1", "algorithm1", "className1", 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s[2] = new Provider.Service(p, "type2", "algorithm2", "className2", 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, null); 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.removeService(s[0]); 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NullPointerException e) { 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Unexpected exception"); 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[0]); 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[1]); 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.putService(s[2]); 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(3, myProvider.getNumServices()); 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Set<Service> actual = myProvider.getServices(); 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[1])); 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[2])); 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.removeService(s[1]); 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(2, myProvider.getNumServices()); 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project actual = myProvider.getServices(); 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[0])); 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[1])); 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[2])); 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.removeService(s[0]); 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(1, myProvider.getNumServices()); 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project actual = myProvider.getServices(); 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[0])); 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[1])); 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(actual.contains(s[2])); 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.removeService(s[2]); 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(0, myProvider.getNumServices()); 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project actual = myProvider.getServices(); 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[0])); 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[1])); 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(!actual.contains(s[2])); 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.removeService(null); 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("NullPoiterException expected"); 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NullPointerException e) { 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 5392f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5412f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testLoad() throws IOException { 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream is = new ByteArrayInputStream(writeProperties()); 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MyProvider myProvider = new MyProvider("name", 1, "info"); 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.load(is); 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("tests.security", myProvider.get("test.pkg")); 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Unit Tests", myProvider.get("test.proj")); 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull(myProvider.get("#commented.entry")); 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("info", myProvider.get("Provider.id info")); 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String className = myProvider.getClass().toString(); 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals( 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project className.substring("class ".length(), className.length()), 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project myProvider.get("Provider.id className")); 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("1.0", myProvider.get("Provider.id version")); 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 558565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes myProvider.load((InputStream) null); 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("NullPointerException expected"); 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NullPointerException e) { 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 5642f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 5652f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 5662f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void testLoad2() { 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project class TestInputStream extends InputStream { 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException(); 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 574f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MyProvider p = new MyProvider(); 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project p.load(new TestInputStream()); 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("expected IOException"); 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 5802f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // expected 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 5832f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5852f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected byte[] writeProperties() { 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream bout = new ByteArrayOutputStream(); 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PrintStream ps = new PrintStream(bout); 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.println("#commented.entry=Bogus"); 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.println("test.pkg=tests.security"); 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.println("test.proj=Unit Tests"); 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.close(); 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return bout.toByteArray(); 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 5952f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5972f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-added 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class TestSecurityManager extends SecurityManager { 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean called = false; 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String permissionName; 601f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public TestSecurityManager(String permissionName) { 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.permissionName = permissionName; 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 605f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void checkPermission(Permission permission) { 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (permission instanceof SecurityPermission) { 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (permissionName.equals(permission.getName())) { 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project called = true; 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 6152f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-added 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 617