1b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath/* Licensed to the Apache Software Foundation (ASF) under one or more 2b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * contributor license agreements. See the NOTICE file distributed with 3b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * this work for additional information regarding copyright ownership. 4b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * The ASF licenses this file to You under the Apache License, Version 2.0 5b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * (the "License"); you may not use this file except in compliance with 6b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * the License. You may obtain a copy of the License at 7b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * 8b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 9b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * 10b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * Unless required by applicable law or agreed to in writing, software 11b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 12b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * See the License for the specific language governing permissions and 14b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * limitations under the License. 15b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath */ 16b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 17b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathpackage org.apache.harmony.tests.java.util.prefs; 18b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 19b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.io.ByteArrayInputStream; 20b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.io.File; 21b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.io.IOException; 22b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.io.InputStream; 23b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.io.OutputStream; 2444d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniakimport java.io.FileOutputStream; 25b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.net.MalformedURLException; 26b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.nio.charset.StandardCharsets; 27b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.util.prefs.AbstractPreferences; 28b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.util.prefs.BackingStoreException; 29b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.util.prefs.InvalidPreferencesFormatException; 30b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.util.prefs.NodeChangeListener; 31b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.util.prefs.PreferenceChangeListener; 32b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.util.prefs.Preferences; 33b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport java.util.prefs.PreferencesFactory; 34b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport junit.framework.TestCase; 35b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathimport libcore.io.IoUtils; 36b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 37b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath/** 38b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath * 39b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath */ 40b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamathpublic class PreferencesTest extends TestCase { 41b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 42b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath private static final String PREFS = 43b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath "<!DOCTYPE preferences SYSTEM \"http://java.sun.com/dtd/preferences.dtd\">" + 44b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath "<preferences>" + 45b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath "<root type=\"user\">" + 46b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath "<map></map>" + 47b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath "</root>" + 48b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath "</preferences>"; 49b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 50b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 51b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath private MockInputStream stream ; 52b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath private InputStream in; 53b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath private PreferencesFactory defaultFactory; 5444d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak private File backendDir; 55b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 56b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 57b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath protected void setUp() throws Exception { 5844d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak backendDir = IoUtils.createTemporaryDirectory("OldAbstractPreferencesTest"); 59b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath defaultFactory = Preferences.setPreferencesFactory( 6044d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak new AbstractPreferencesTest.TestPreferencesFactory(backendDir.getAbsolutePath())); 61b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 62b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath in = new ByteArrayInputStream(PREFS.getBytes(StandardCharsets.US_ASCII)); 63b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath stream = new MockInputStream(in); 64b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 65b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 66b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 67b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath protected void tearDown() throws Exception { 68b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.setPreferencesFactory(defaultFactory); 69b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath stream.close(); 70b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 71b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 72b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void testSystemNodeForPackage() throws Exception { 73b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences p = Preferences.systemNodeForPackage(Object.class); 74b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 75b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("/java/lang", p.absolutePath()); 76b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertTrue(p instanceof AbstractPreferences); 77b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences root = Preferences.systemRoot(); 78b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences parent = root.node("java"); 79b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertSame(parent, p.parent()); 80b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertFalse(p.isUserNode()); 81b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("lang", p.name()); 82b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("System Preference Node: " + p.absolutePath(), p 83b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath .toString()); 84b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 85b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals(0, p.childrenNames().length); 86b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals(0, p.keys().length); 87b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath parent.removeNode(); 88b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 89b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.userNodeForPackage(null); 90b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath fail("should throw NullPointerException"); 91b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } catch (NullPointerException e) { 92b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath // Expected 93b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 94b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 95b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 96b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void testSystemRoot() throws BackingStoreException { 97b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences p = Preferences.systemRoot(); 98b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertTrue(p instanceof AbstractPreferences); 99b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("/", p.absolutePath()); 100b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertSame(null, p.parent()); 101b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertFalse(p.isUserNode()); 102b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("", p.name()); 103b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("System Preference Node: " + p.absolutePath(), p 104b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath .toString()); 105b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 106b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 107b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void testConsts() { 108b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals(80, Preferences.MAX_KEY_LENGTH); 109b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals(80, Preferences.MAX_NAME_LENGTH); 110b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals(8192, Preferences.MAX_VALUE_LENGTH); 111b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 112b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 113b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void testUserNodeForPackage() throws BackingStoreException { 114b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences p = Preferences.userNodeForPackage(Object.class); 115b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("/java/lang", p.absolutePath()); 116b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertTrue(p instanceof AbstractPreferences); 117b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences root = Preferences.userRoot(); 118b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences parent = root.node("java"); 119b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertSame(parent, p.parent()); 120b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertTrue(p.isUserNode()); 121b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("lang", p.name()); 122b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("User Preference Node: " + p.absolutePath(), p.toString()); 123b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals(0, p.childrenNames().length); 124b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals(0, p.keys().length); 125b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 126b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 127b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.userNodeForPackage(null); 128b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath fail("should throw NullPointerException"); 129b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } catch (NullPointerException e) { 130b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath // Expected 131b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 132b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 133b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 134b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void testUserRoot() throws BackingStoreException { 135b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences p = Preferences.userRoot(); 136b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertTrue(p instanceof AbstractPreferences); 137b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("/", p.absolutePath()); 138b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertSame(null, p.parent()); 139b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertTrue(p.isUserNode()); 140b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("", p.name()); 141b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("User Preference Node: " + p.absolutePath(), p.toString()); 142b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 143b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 144b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void testImportPreferences() throws Exception { 145b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences prefs = null; 146b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 147b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath prefs = Preferences.userNodeForPackage(PreferencesTest.class); 148b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 149b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath prefs.put("prefskey", "oldvalue"); 150b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath prefs.put("prefskey2", "oldvalue2"); 151b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath in = PreferencesTest.class 152b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath .getResourceAsStream("/resources/prefs/java/util/prefs/userprefs.xml"); 153b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.importPreferences(in); 154b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 155b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath prefs = Preferences.userNodeForPackage(PreferencesTest.class); 156b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals(1, prefs.childrenNames().length); 157b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertTrue(prefs.nodeExists("mock/child/grandson")); 158b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("newvalue", prefs.get("prefskey", null)); 159b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("oldvalue2", prefs.get("prefskey2", null)); 160b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath assertEquals("newvalue3", prefs.get("prefskey3", null)); 161b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 162b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath in = PreferencesTest.class.getResourceAsStream( 163b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath "/prefs/java/util/prefs/userprefs-badform.xml"); 164b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 165b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.importPreferences(in); 166b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath fail("should throw InvalidPreferencesFormatException"); 167b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } catch (InvalidPreferencesFormatException expected) { 168b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 169b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } finally { 170b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 171b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath prefs = Preferences.userNodeForPackage(PreferencesTest.class); 172b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath prefs.removeNode(); 173b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } catch (Exception e) { 174b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 175b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 176b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 177b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 178b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void testImportPreferencesException() throws Exception { 179b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 180b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.importPreferences(null); 18196b40e87c32023084d7153360b1fa0c44c598095Narayan Kamath fail("should throw InvalidPreferencesFormatException"); 18296b40e87c32023084d7153360b1fa0c44c598095Narayan Kamath } catch (InvalidPreferencesFormatException expected) { 183b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 184b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 185b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath byte[] source = new byte[0]; 186b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath InputStream in = new ByteArrayInputStream(source); 187b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 188b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.importPreferences(in); 189b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath fail("should throw InvalidPreferencesFormatException"); 190b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } catch (InvalidPreferencesFormatException expected) { 191b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 192b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 193b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath stream.setResult(MockInputStream.exception); 194b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 195b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.importPreferences(stream); 196b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath fail("should throw IOException"); 197b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } catch (IOException expected) { 198b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 199b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 200b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath stream.setResult(MockInputStream.runtimeException); 201b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath try { 202b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath Preferences.importPreferences(stream); 203b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath fail("should throw RuntimeException"); 204b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } catch (RuntimeException expected) { 205b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 206b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 207b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 208b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath static class MockInputStream extends InputStream { 209b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 210b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath static final int normal = 0; 211b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 212b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath static final int exception = 1; 213b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 214b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath static final int runtimeException = 2; 215b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 216b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath int result = normal; 217b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 218b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath InputStream wrapper; 219b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 220b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void setResult(int i) { 221b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath result = i; 222b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 223b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 224b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath private void checkException() throws IOException { 225b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath switch (result) { 226b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath case normal: 227b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return; 228b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath case exception: 229b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath throw new IOException("test"); 230b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath case runtimeException: 231b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath throw new RuntimeException("test"); 232b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 233b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 234b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 235b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public MockInputStream(InputStream in) { 236b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath wrapper = in; 237b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 238b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 239b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 240b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public int read() throws IOException { 241b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath checkException(); 242b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return wrapper.read(); 243b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 244b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 245b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 246b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath static class MockPreferences extends Preferences { 247b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 248b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public MockPreferences() { 249b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath super(); 250b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 251b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 252b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 253b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public String absolutePath() { 254b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 255b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 256b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 257b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 258b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public String[] childrenNames() throws BackingStoreException { 259b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 260b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 261b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 262b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 263b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void clear() throws BackingStoreException { 264b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 265b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 266b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 267b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void exportNode(OutputStream ostream) throws IOException, 268b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath BackingStoreException { 269b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 270b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 271b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 272b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void exportSubtree(OutputStream ostream) throws IOException, 273b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath BackingStoreException { 274b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 275b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 276b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 277b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void flush() throws BackingStoreException { 278b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 279b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 280b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 281b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public String get(String key, String deflt) { 282b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 283b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 284b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 285b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 286b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public boolean getBoolean(String key, boolean deflt) { 287b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return false; 288b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 289b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 290b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 291b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public byte[] getByteArray(String key, byte[] deflt) { 292b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 293b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 294b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 295b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 296b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public double getDouble(String key, double deflt) { 297b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return 0; 298b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 299b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 300b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 301b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public float getFloat(String key, float deflt) { 302b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return 0; 303b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 304b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 305b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 306b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public int getInt(String key, int deflt) { 307b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return 0; 308b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 309b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 310b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 311b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public long getLong(String key, long deflt) { 312b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return 0; 313b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 314b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 315b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 316b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public boolean isUserNode() { 317b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return false; 318b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 319b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 320b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 321b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public String[] keys() throws BackingStoreException { 322b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 323b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 324b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 325b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 326b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public String name() { 327b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 328b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 329b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 330b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 331b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public Preferences node(String name) { 332b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 333b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 334b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 335b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 336b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public boolean nodeExists(String name) throws BackingStoreException { 337b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return false; 338b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 339b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 340b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 341b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public Preferences parent() { 342b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 343b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 344b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 345b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 346b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void put(String key, String value) { 347b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 348b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 349b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 350b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 351b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void putBoolean(String key, boolean value) { 352b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 353b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 354b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 355b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 356b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void putByteArray(String key, byte[] value) { 357b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 358b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 359b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 360b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 361b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void putDouble(String key, double value) { 362b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 363b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 364b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 365b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 366b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void putFloat(String key, float value) { 367b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 368b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 369b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 370b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 371b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void putInt(String key, int value) { 372b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 373b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 374b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 375b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 376b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void putLong(String key, long value) { 377b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 378b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 379b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 380b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 381b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void remove(String key) { 382b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 383b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 384b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 385b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 386b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void removeNode() throws BackingStoreException { 387b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 388b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 389b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 390b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 391b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void addNodeChangeListener(NodeChangeListener ncl) { 392b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 393b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 394b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 395b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 396b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void addPreferenceChangeListener(PreferenceChangeListener pcl) { 397b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 398b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 399b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 400b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 401b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void removeNodeChangeListener(NodeChangeListener ncl) { 402b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 403b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 404b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 405b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 406b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void removePreferenceChangeListener(PreferenceChangeListener pcl) { 407b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 408b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 409b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 410b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 411b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public void sync() throws BackingStoreException { 412b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 413b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 414b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 415b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath @Override 416b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath public String toString() { 417b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath return null; 418b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 419b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 420b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath } 421b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath 42244d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // b/27645233 42344d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak public void testReadingFromBackendCache() throws Exception { 42444d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // Create a preferences filesystem backend storage file. 42544d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // It emulates a situation where we saved some data in the past, 42644d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // restarted the application and we're trying to read it. 42744d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // 42844d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // We need a package without the existing backing file (so a package that 42944d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // wasn't used in this test case), java.io is a good candidate. 43044d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak File backendFile = new File(backendDir, "/user/java/io/prefs.xml"); 43144d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak InputStream inputData = PreferencesTest.class 43244d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak .getResourceAsStream("/resources/prefs/java/util/prefs/backendread.xml"); 43344d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak assertTrue(new File(backendDir, "/user/java/io").mkdirs()); 43444d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak assertTrue(backendFile.createNewFile()); 43544d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak 43644d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // Copy the example content (one test=test1 entry) to a storage file 43744d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak FileOutputStream fos = new FileOutputStream(backendFile); 43844d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak try { 43944d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak byte[] buffer = new byte[1024]; 44044d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak int length; 44144d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak while ((length = inputData.read(buffer)) > 0) { 44244d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak fos.write(buffer, 0, length); 44344d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak } 44444d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak } finally { 44544d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak fos.close(); 44644d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak inputData.close(); 44744d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak } 44844d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak 44944d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak Preferences prefs = Preferences.userNodeForPackage(OutputStream.class); 45044d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // Any exception from reading the file will be swallowed and ignored, 45144d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak // only result we will see is a lack of requested key-value pair. 45244d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak assertEquals("test1", prefs.get("test","")); 45344d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak } 45444d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak 45544d29b0a9012a66f5db5a8130017568a55c11668Przemyslaw Szczepaniak 456b0b81dfb681cf401b3fc108b9abe432ee6736164Narayan Kamath} 457