180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson/* Licensed to the Apache Software Foundation (ASF) under one or more
280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * contributor license agreements.  See the NOTICE file distributed with
380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * this work for additional information regarding copyright ownership.
480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * The ASF licenses this file to You under the Apache License, Version 2.0
580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * (the "License"); you may not use this file except in compliance with
680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * the License.  You may obtain a copy of the License at
780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson *
880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson *
1080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * Unless required by applicable law or agreed to in writing, software
1180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
1280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * See the License for the specific language governing permissions and
1480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson * limitations under the License.
1580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson */
1680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
1780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonpackage libcore.java.util.prefs;
1880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
19b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamathimport java.io.File;
2080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.io.IOException;
2180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.io.OutputStream;
2280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.util.Arrays;
2380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.util.prefs.BackingStoreException;
2480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.util.prefs.NodeChangeEvent;
2580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.util.prefs.NodeChangeListener;
2680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.util.prefs.PreferenceChangeEvent;
2780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.util.prefs.PreferenceChangeListener;
2880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport java.util.prefs.Preferences;
29b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamathimport java.util.prefs.PreferencesFactory;
3080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonimport junit.framework.TestCase;
31b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamathimport libcore.io.IoUtils;
3280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
3380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilsonpublic final class OldPreferencesTest extends TestCase {
3480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
35cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes    private static final boolean ENCOURAGE_RACES = false;
36cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes
37cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes    private static final String longKey;
38cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes    private static final String longValue;
3980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
4080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    static {
41a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        StringBuilder key = new StringBuilder(Preferences.MAX_KEY_LENGTH);
4280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        for (int i = 0; i < Preferences.MAX_KEY_LENGTH; i++) {
4380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            key.append('a');
4480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
4580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        longKey = key.toString();
4680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
47a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        StringBuilder value = new StringBuilder(Preferences.MAX_VALUE_LENGTH);
4880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        for (int i = 0; i < Preferences.MAX_VALUE_LENGTH; i++) {
4980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            value.append('a');
5080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
5180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        longValue = value.toString();
5280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
5380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
54b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath    private PreferencesFactory defaultFactory;
55b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath
56b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath    @Override
57b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath    protected void setUp() throws Exception {
58a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        super.setUp();
59b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath        final File tmpDir = IoUtils.createTemporaryDirectory("OldPreferenceTest");
60b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath        defaultFactory = Preferences.setPreferencesFactory(
61b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath                new PreferencesTest.TestPreferencesFactory(tmpDir.getAbsolutePath()));
62a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson
63a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
64a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        for (String child : pref.childrenNames()) {
65a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson            pref.node(child).removeNode();
66a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        }
67a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        pref.clear();
68a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson    }
69a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson
70b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath    @Override
71b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath    protected void tearDown() throws Exception {
72b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath        Preferences.setPreferencesFactory(defaultFactory);
73b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath    }
74b27fd46c694f8ee4118d6b9bdd61741472ee92b5Narayan Kamath
75a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson    public void testAbstractMethods() throws IOException, BackingStoreException {
7680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences p = new MockPreferences();
7780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.absolutePath();
78a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.childrenNames();
79a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.clear();
80a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.exportNode(null);
81a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.exportSubtree(null);
82a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.flush();
8380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.get(null, null);
8480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.getBoolean(null, false);
8580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.getByteArray(null, null);
8680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.getFloat(null, 0.1f);
8780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.getDouble(null, 0.1);
8880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.getInt(null, 1);
8980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.getLong(null, 1l);
9080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.isUserNode();
91a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.keys();
9280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.name();
9380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.node(null);
94a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.nodeExists(null);
9580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.parent();
9680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.put(null, null);
9780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.putBoolean(null, false);
9880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.putByteArray(null, null);
9980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.putDouble(null, 1);
10080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.putFloat(null, 1f);
10180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.putInt(null, 1);
10280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.putLong(null, 1l);
10380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.remove(null);
104a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.removeNode();
10580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.addNodeChangeListener(null);
10680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.addPreferenceChangeListener(null);
10780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.removeNodeChangeListener(null);
10880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.removePreferenceChangeListener(null);
109a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        p.sync();
11080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        p.toString();
11180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
11280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
11380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testConstructor() {
11480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        MockPreferences mp = new MockPreferences();
11580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(mp.getClass(), MockPreferences.class);
11680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
11780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
11880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testToString() {
11980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences p1 = Preferences.userNodeForPackage(Preferences.class);
12080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNotNull(p1.toString());
12180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
12280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences p2 = Preferences.systemRoot();
12380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNotNull(p2.toString());
12480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
12580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences p3 = Preferences.userRoot();
12680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNotNull(p3.toString());
12780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
12880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
12980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testAbsolutePath() {
13080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences p = Preferences.userNodeForPackage(Preferences.class);
13180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("/java/util/prefs", p.absolutePath());
13280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
13380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
13480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
13580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testChildrenNames() throws BackingStoreException {
13680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
13780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
13880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences child1 = pref.node("child1");
13980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
14080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.node("child2");
14180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.node("child3");
14280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        child1.node("subchild1");
14380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
14480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertSame(pref, child1.parent());
14580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(3, pref.childrenNames().length);
14680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("child1", pref.childrenNames()[0]);
14780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(1, child1.childrenNames().length);
14880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("subchild1", child1.childrenNames()[0]);
14980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
15080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
15180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testClear() throws BackingStoreException {
15280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
15380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testClearKey", "testClearValue");
15480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testClearKey1", "testClearValue1");
15580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("testClearValue", pref.get("testClearKey", null));
15680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("testClearValue1", pref.get("testClearKey1", null));
15780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.clear();
15880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNull(pref.get("testClearKey", null));
15980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNull(pref.get("testClearKey1", null));
16080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
16180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
16280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testGet() throws BackingStoreException {
16380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences root = Preferences.userNodeForPackage(Preferences.class);
16480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = root.node("mock");
16580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNull(pref.get("", null));
16680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("default", pref.get("key", "default"));
16780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNull(pref.get("key", null));
16880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetkey", "value");
16980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNull(pref.get("testGetKey", null));
17080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("value", pref.get("testGetkey", null));
17180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
17280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
17380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.get(null, "abc");
17480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
175a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
17680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
17780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.get("", "abc");
17880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.get("key", null);
17980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.get("key", "");
18080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putFloat("floatKey", 1.0f);
18180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("1.0", pref.get("floatKey", null));
18280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
18380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.removeNode();
18480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
18580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.get("key", "abc");
18680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
187a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalStateException expected) {
18880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
18980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
19080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.get(null, "abc");
19180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
192a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
19380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
19480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
19580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
19680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testGetBoolean() {
19780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
19880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
19980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.getBoolean(null, false);
20080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
201a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
20280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
20380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
20480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetBooleanKey", "false");
20580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetBooleanKey2", "value");
20680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(pref.getBoolean("testGetBooleanKey", true));
20780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref.getBoolean("testGetBooleanKey2", true));
20880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
20980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
21080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testGetByteArray() {
21180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
21280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
21380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.getByteArray(null, new byte[0]);
21480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
215a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
21680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
21780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        byte[] b64Array = new byte[] { 0x59, 0x57, 0x4a, 0x6a };// BASE64
21880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
21980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetByteArrayKey", "abc=");
22080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetByteArrayKey2", new String(b64Array));
22180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("invalidKey", "<>?");
22280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(Arrays.equals(new byte[] { 105, -73 }, pref.getByteArray(
22380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                "testGetByteArrayKey", new byte[0])));
22480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(Arrays.equals(new byte[] { 'a', 'b', 'c' }, pref
22580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                .getByteArray("testGetByteArrayKey2", new byte[0])));
22680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(Arrays.equals(new byte[0], pref.getByteArray("invalidKey",
22780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                new byte[0])));
22880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
22980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putByteArray("testGetByteArrayKey3", b64Array);
23080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putByteArray("testGetByteArrayKey4", "abc".getBytes());
23180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(Arrays.equals(b64Array, pref.getByteArray(
23280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                "testGetByteArrayKey3", new byte[0])));
23380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(Arrays.equals("abc".getBytes(), pref.getByteArray(
23480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                "testGetByteArrayKey4", new byte[0])));
23580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
23680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
23780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testGetDouble() {
23880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
23980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
24080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.getDouble(null, 0);
24180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
242a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
24380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
24480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
24580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetDoubleKey", "1");
24680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetDoubleKey2", "value");
24780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putDouble("testGetDoubleKey3", 1);
24880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putInt("testGetDoubleKey4", 1);
24980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(1.0, pref.getDouble("testGetDoubleKey", 0.0), 0);
25080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(0.0, pref.getDouble("testGetDoubleKey2", 0.0), 0);
25180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(1.0, pref.getDouble("testGetDoubleKey3", 0.0), 0);
25280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(1.0, pref.getDouble("testGetDoubleKey4", 0.0), 0);
25380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
25480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
25580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testGetFloat() {
25680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
25780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
25880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.getFloat(null, 0f);
25980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
260a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
26180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
26280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetFloatKey", "1");
26380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetFloatKey2", "value");
26480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(1f, pref.getFloat("testGetFloatKey", 0f), 0);
26580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(0f, pref.getFloat("testGetFloatKey2", 0f), 0);
26680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
26780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
26880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testGetInt() {
26980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
27080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
27180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.getInt(null, 0);
27280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
273a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
27480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
27580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
27680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetIntKey", "1");
27780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetIntKey2", "value");
27880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(1, pref.getInt("testGetIntKey", 0));
27980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(0, pref.getInt("testGetIntKey2", 0));
28080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
28180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
28280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testGetLong() {
28380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
28480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
28580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.getLong(null, 0);
28680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
287a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
28880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
28980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
29080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetLongKey", "1");
29180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testGetLongKey2", "value");
29280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(1, pref.getInt("testGetLongKey", 0));
29380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(0, pref.getInt("testGetLongKey2", 0));
29480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
29580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
29680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testIsUserNode() {
29780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref1 = Preferences.userNodeForPackage(Preferences.class);
29880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref1.isUserNode());
29980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
30080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref2 = Preferences.systemNodeForPackage(Preferences.class);
30180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(pref2.isUserNode());
30280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
30380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
30480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testKeys() throws BackingStoreException {
30580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
30680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.clear();
30780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
30880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("key0", "value");
30980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("key1", "value1");
31080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("key2", "value2");
31180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("key3", "value3");
31280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
31380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        String[] keys = pref.keys();
31480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(4, keys.length);
315a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        for (String key : keys) {
316a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson            assertEquals(0, key.indexOf("key"));
317a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson            assertEquals(4, key.length());
31880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
31980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
32080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
32180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testName() {
32280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
32380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences child = pref.node("mock");
32480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("mock", child.name());
32580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
32680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
32780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testNode() throws BackingStoreException {
328a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        StringBuilder name = new StringBuilder(Preferences.MAX_NAME_LENGTH);
32980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        for (int i = 0; i < Preferences.MAX_NAME_LENGTH; i++) {
33080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            name.append('a');
33180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
33280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        String longName = name.toString();
33380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
33480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences root = Preferences.userRoot();
335cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        Preferences parent = Preferences.userNodeForPackage(Preferences.class);
33680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = parent.node("mock");
33780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
33880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
33980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.node(null);
34080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
341a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
34280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
34380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
34480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.node("/java/util/prefs/");
34580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
346a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
34780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
34880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
34980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.node("/java//util/prefs");
35080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
351a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
35280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
35380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
35480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.node(longName + "a");
35580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
356a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
35780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
35880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNotNull(pref.node(longName));
35980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
36080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertSame(root, pref.node("/"));
36180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
36280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences prefs = pref.node("/java/util/prefs");
36380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertSame(prefs, parent);
36480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
36580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertSame(pref, pref.node(""));
36680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
36780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
36880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testNodeExists() throws BackingStoreException {
36980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
370cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        Preferences parent = Preferences.userNodeForPackage(Preferences.class);
37180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = parent.node("mock");
37280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
37380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
37480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.nodeExists(null);
37580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
376a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
37780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
37880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
37980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.nodeExists("/java/util/prefs/");
38080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
381a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
38280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
38380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
38480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.nodeExists("/java//util/prefs");
38580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
386a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
38780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
38880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
38980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref.nodeExists("/"));
39080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
39180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref.nodeExists("/java/util/prefs"));
39280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
39380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref.nodeExists(""));
39480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
39580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(pref.nodeExists("child"));
39680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences grandchild = pref.node("child/grandchild");
39780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref.nodeExists("child"));
39880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref.nodeExists("child/grandchild"));
39980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        grandchild.removeNode();
40080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref.nodeExists("child"));
40180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(pref.nodeExists("child/grandchild"));
40280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(grandchild.nodeExists(""));
40380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
40480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(pref.nodeExists("child2/grandchild"));
40580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.node("child2/grandchild");
40680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(pref.nodeExists("child2/grandchild"));
40780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
40880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
40980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testParent() {
410cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        Preferences parent = Preferences.userNodeForPackage(Preferences.class);
41180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = parent.node("mock");
41280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
41380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertSame(parent, pref.parent());
41480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
41580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
41680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testPut() throws BackingStoreException {
417cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
41880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("", "emptyvalue");
41980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("emptyvalue", pref.get("", null));
42080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testPutkey", "value1");
42180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("value1", pref.get("testPutkey", null));
42280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("testPutkey", "value2");
42380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("value2", pref.get("testPutkey", null));
42480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
42580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("", "emptyvalue");
42680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("emptyvalue", pref.get("", null));
42780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
42880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
42980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.put(null, "value");
43080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
431a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
43280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
43380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
43480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.put("key", null);
43580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
436a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
43780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
43880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put(longKey, longValue);
43980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
44080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.put(longKey + 1, longValue);
44180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
442a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
44380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
44480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
44580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.put(longKey, longValue + 1);
44680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
447a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
44880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
44980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
45080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.removeNode();
45180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
45280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.put(longKey, longValue + 1);
45380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
454a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
45580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
45680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
45780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
45880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.put(longKey, longValue);
45980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
460a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalStateException expected) {
46180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
46280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
46380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
46480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testPutBoolean() {
465a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
46680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
46780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putBoolean(null, false);
46880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
469a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
47080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
47180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putBoolean(longKey, false);
47280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
47380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putBoolean(longKey + "a", false);
47480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
475a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
47680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
47780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putBoolean("testPutBooleanKey", false);
47880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("false", pref.get("testPutBooleanKey", null));
47980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(pref.getBoolean("testPutBooleanKey", true));
48080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
48180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
48280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testPutDouble() {
483cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
48480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
48580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putDouble(null, 3);
48680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
487a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
48880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
48980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putDouble(longKey, 3);
49080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
49180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putDouble(longKey + "a", 3);
49280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
493a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
49480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
49580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putDouble("testPutDoubleKey", 3);
49680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("3.0", pref.get("testPutDoubleKey", null));
49780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(3, pref.getDouble("testPutDoubleKey", 0), 0);
49880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
49980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
50080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testPutFloat() {
501a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
50280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
50380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putFloat(null, 3f);
50480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
505a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
50680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
50780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putFloat(longKey, 3f);
50880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
50980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putFloat(longKey + "a", 3f);
51080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
511a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
51280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
51380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putFloat("testPutFloatKey", 3f);
51480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("3.0", pref.get("testPutFloatKey", null));
51580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(3f, pref.getFloat("testPutFloatKey", 0), 0);
51680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
51780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
51880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testPutInt() {
519a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
52080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
52180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putInt(null, 3);
52280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
523a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
52480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
52580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putInt(longKey, 3);
52680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
52780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putInt(longKey + "a", 3);
52880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
529a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
53080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
53180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putInt("testPutIntKey", 3);
53280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("3", pref.get("testPutIntKey", null));
53380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(3, pref.getInt("testPutIntKey", 0));
53480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
53580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
53680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testPutLong() {
537a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
53880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
53980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putLong(null, 3L);
54080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
541a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
54280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
54380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putLong(longKey, 3L);
54480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
54580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putLong(longKey + "a", 3L);
54680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
547a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
54880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
54980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putLong("testPutLongKey", 3L);
55080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("3", pref.get("testPutLongKey", null));
55180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals(3L, pref.getLong("testPutLongKey", 0));
55280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
55380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
55480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testPutByteArray() {
555a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
55680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
55780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putByteArray(null, new byte[0]);
55880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
559a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
56080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
56180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
56280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putByteArray("testPutByteArrayKey4", null);
56380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
564a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
56580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
56680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
56780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putByteArray(longKey, new byte[0]);
56880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
56980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putByteArray(longKey + "a", new byte[0]);
57080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
571a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
57280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
57380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        byte[] longArray = new byte[(int) (Preferences.MAX_VALUE_LENGTH * 0.74)];
57480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        byte[] longerArray = new byte[(int) (Preferences.MAX_VALUE_LENGTH * 0.75) + 1];
57580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putByteArray(longKey, longArray);
57680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
57780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putByteArray(longKey, longerArray);
57880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
579a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
58080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
58180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
58280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putByteArray("testPutByteArrayKey", new byte[0]);
58380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("", pref.get("testPutByteArrayKey", null));
58480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(Arrays.equals(new byte[0], pref.getByteArray(
58580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                "testPutByteArrayKey", null)));
58680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
58780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.putByteArray("testPutByteArrayKey3", new byte[] { 'a', 'b', 'c' });
58880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("YWJj", pref.get("testPutByteArrayKey3", null));
58980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertTrue(Arrays.equals(new byte[] { 'a', 'b', 'c' }, pref
59080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                .getByteArray("testPutByteArrayKey3", null)));
59180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
59280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
59380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testRemove() throws BackingStoreException {
594cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
59580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.remove("key");
59680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
59780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.put("key", "value");
59880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertEquals("value", pref.get("key", null));
59980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.remove("key");
60080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertNull(pref.get("key", null));
60180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
60280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.remove("key");
60380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
60480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
60580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.remove(null);
60680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
607a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
60880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
60980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
61080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.removeNode();
61180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
61280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.remove("key");
61380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
614a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalStateException expected) {
61580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
61680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
61780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
61880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testRemoveNode() throws BackingStoreException {
619cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
62080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences child = pref.node("child");
62180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences child1 = pref.node("child1");
62280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences grandchild = child.node("grandchild");
62380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
62480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.removeNode();
62580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
62680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(child.nodeExists(""));
62780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(child1.nodeExists(""));
62880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(grandchild.nodeExists(""));
62980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        assertFalse(pref.nodeExists(""));
63080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
63180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
63280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testAddNodeChangeListener() throws BackingStoreException {
63380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
63480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
63580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addNodeChangeListener(null);
63680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
637a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
63880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
63980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
64080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences child1 = null;
64180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
64280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        MockNodeChangeListener nl = null;
64380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // To get existed node doesn't create the change event
64480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
64580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl = new MockNodeChangeListener();
64680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addNodeChangeListener(nl);
64780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1 = pref.node("mock1");
648cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            nl.waitForEvent(1);
64980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(1, nl.getAdded());
65080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
651a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson            pref.node("mock1");
652cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            // There shouldn't be an event, but wait in case one arrives...
653cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            try { Thread.sleep(1000); } catch (InterruptedException ignored) {}
65480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(0, nl.getAdded());
65580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
65680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
65780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(nl);
65880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1.removeNode();
65980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
66080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // same listener can be added twice, and must be removed twice
66180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
66280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl = new MockNodeChangeListener();
66380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addNodeChangeListener(nl);
66480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addNodeChangeListener(nl);
66580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1 = pref.node("mock2");
666cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            nl.waitForEvent(2);
66780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(2, nl.getAdded());
66880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
66980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
67080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(nl);
67180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(nl);
67280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1.removeNode();
67380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
67480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // test remove event
67580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
67680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl = new MockNodeChangeListener();
67780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addNodeChangeListener(nl);
67880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1 = pref.node("mock3");
67980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1.removeNode();
680cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            nl.waitForEvent(2);
68180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(1, nl.getRemoved());
68280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
68380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
68480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(nl);
68580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
68680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // test remove event with two listeners
68780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
68880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl = new MockNodeChangeListener();
68980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addNodeChangeListener(nl);
69080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addNodeChangeListener(nl);
69180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1 = pref.node("mock6");
69280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1.removeNode();
693cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            nl.waitForEvent(4);
69480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(2, nl.getRemoved());
69580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
69680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
69780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(nl);
69880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(nl);
69980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
70080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // test add/remove indirect children, or remove several children at the
70180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // same time
702a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        Preferences child3;
70380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
70480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl = new MockNodeChangeListener();
70580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1 = pref.node("mock4");
70680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1.addNodeChangeListener(nl);
707a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson            pref.node("mock4/mock5");
708cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            nl.waitForEvent(1);
70980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(1, nl.getAdded());
71080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
71180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child3 = pref.node("mock4/mock5/mock6");
712cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            // There shouldn't be an event, but wait in case one arrives...
713cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            try { Thread.sleep(1000); } catch (InterruptedException ignored) {}
71480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(0, nl.getAdded());
71580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
71680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
71780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child3.removeNode();
718cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            // There shouldn't be an event, but wait in case one arrives...
719cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            try { Thread.sleep(1000); } catch (InterruptedException ignored) {}
72080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(0, nl.getRemoved());
72180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
72280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
723a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson            pref.node("mock4/mock7");
724cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            nl.waitForEvent(1);
72580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(1, nl.getAdded());
72680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
72780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
72880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            child1.removeNode();
729cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            nl.waitForEvent(2);
730cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            assertEquals(2, nl.getRemoved());
73180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            nl.reset();
73280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
73380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            try {
73480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                child1.removeNode();
735a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson            } catch (Exception ignored) {
73680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            }
73780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
73880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
73980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
740a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson    public void testAddPreferenceChangeListener() throws Exception {
74180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
74280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        MockPreferenceChangeListener pl = null;
74380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
74480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
74580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addPreferenceChangeListener(null);
74680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
747a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (NullPointerException expected) {
74880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
74980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
75080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // To get existed node doesn't create the change event
75180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
75280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl = new MockPreferenceChangeListener();
75380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addPreferenceChangeListener(pl);
75480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putInt("mock1", 123);
75580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.waitForEvent(1);
75680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(1, pl.getChanged());
75780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putLong("long_key", Long.MAX_VALUE);
75880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.waitForEvent(2);
75980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(2, pl.getChanged());
76080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.reset();
76180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            try {
76280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                pref.clear();
76380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                pl.waitForEvent(2);
764cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                assertEquals(2, pl.getChanged());
76580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            } catch(BackingStoreException bse) {
76680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                pl.reset();
76780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                fail("BackingStoreException is thrown");
76880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            }
76980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.reset();
77080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
77180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(pl);
77280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            //child1.removeNode();
77380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
77480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
77580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // same listener can be added twice, and must be removed twice
77680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
77780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl = new MockPreferenceChangeListener();
77880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addPreferenceChangeListener(pl);
77980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addPreferenceChangeListener(pl);
78080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putFloat("float_key", Float.MIN_VALUE);
78180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.waitForEvent(2);
78280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(2, pl.getChanged());
78380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.reset();
78480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
78580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(pl);
78680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(pl);
78780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
78880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
78980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // test remove event
79080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
79180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl = new MockPreferenceChangeListener();
79280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addPreferenceChangeListener(pl);
79380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putDouble("double_key", Double.MAX_VALUE);
79480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.waitForEvent(1);
79580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            assertEquals(1, pl.getChanged());
79680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            try {
79780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                pref.clear();
79880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                pl.waitForEvent(3);
799cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                assertEquals(3, pl.getChanged());
80080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            } catch(BackingStoreException bse) {
80180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                fail("BackingStoreException is thrown");
80280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            }
80380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.reset();
80480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
80580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(pl);
80680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
80780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        // test remove event with two listeners
80880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
80980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl = new MockPreferenceChangeListener();
81080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addPreferenceChangeListener(pl);
81180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.addPreferenceChangeListener(pl);
81280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.putByteArray("byte_array_key", new byte [] {1 ,2 , 3});
81380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            try {
81480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                pref.clear();
81580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                pl.waitForEvent(4);
81680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                assertEquals(4, pl.getChanged());
81780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            } catch(BackingStoreException bse) {
81880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                fail("BackingStoreException is thrown");
81980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            }
82080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pl.reset();
82180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        } finally {
82280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(pl);
82380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(pl);
82480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
82580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
82680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
82780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
82880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testRemoveNodeChangeListener() {
82980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
83080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
83180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(null);
83280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
833a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
83480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
83580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        MockNodeChangeListener l1 = new MockNodeChangeListener();
83680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        MockNodeChangeListener l2 = new MockNodeChangeListener();
83780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.addNodeChangeListener(l1);
83880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.addNodeChangeListener(l1);
83980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
84080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.removeNodeChangeListener(l1);
84180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.removeNodeChangeListener(l1);
84280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
84380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(l1);
84480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
845a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
84680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
84780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
84880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removeNodeChangeListener(l2);
84980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
850a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
85180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
85280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
85380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
85480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    public void testRemovePreferenceChangeListener() {
85580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        Preferences pref = Preferences.userNodeForPackage(Preferences.class);
85680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
85780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(null);
85880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
859a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
86080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
86180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        MockPreferenceChangeListener l1 = new MockPreferenceChangeListener();
86280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        MockPreferenceChangeListener l2 = new MockPreferenceChangeListener();
86380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.addPreferenceChangeListener(l1);
86480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.addPreferenceChangeListener(l1);
86580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
86680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(l2);
86780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
868a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
86980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
87080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.removePreferenceChangeListener(l1);
87180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        pref.removePreferenceChangeListener(l1);
87280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        try {
87380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            pref.removePreferenceChangeListener(l1);
87480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            fail();
875a744a0370d151794f5a20a23fa549cc2f34df7d6Jesse Wilson        } catch (IllegalArgumentException expected) {
87680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
87780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
87880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
87980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
88080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    static class MockNodeChangeListener implements NodeChangeListener {
88180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        private int added = 0;
88280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        private int removed = 0;
883cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        private int eventCount = 0;
88480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
885cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        public void waitForEvent(int count) {
886cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            synchronized (this) {
887cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                while (eventCount < count) {
888cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                    try {
889cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                        wait();
890cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                    } catch (InterruptedException ignored) {
891cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                    }
892cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                }
89380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            }
89480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
89580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
896cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        public void childAdded(NodeChangeEvent e) {
897cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            if (ENCOURAGE_RACES) try { Thread.sleep(1000); } catch (InterruptedException ignored) { }
898cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            synchronized (this) {
899cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                ++eventCount;
900cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                ++added;
901cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                notifyAll();
902cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            }
90380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
90480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
905cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        public void childRemoved(NodeChangeEvent e) {
906cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            if (ENCOURAGE_RACES) try { Thread.sleep(1000); } catch (InterruptedException ignored) { }
907cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            synchronized (this) {
908cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                ++eventCount;
909cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                ++removed;
910cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                notifyAll();
911cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            }
91280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
91380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
914cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        public synchronized int getAdded() {
91580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return added;
91680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
91780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
91880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public synchronized int getRemoved() {
91980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return removed;
92080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
92180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
922cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        public synchronized void reset() {
923cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            eventCount = 0;
92480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            added = 0;
92580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            removed = 0;
92680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
92780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
92880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
92980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    private static class MockPreferenceChangeListener implements PreferenceChangeListener {
93080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        private int changed = 0;
931cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        private int eventCount = 0;
93280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
93380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void waitForEvent(int count) {
934cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            synchronized (this) {
935cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                while (eventCount < count) {
936cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                    try {
937cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                        wait();
938cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                    } catch (InterruptedException ignored) {
93980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                    }
94080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson                }
94180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            }
94280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
94380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
944cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        public void preferenceChange(PreferenceChangeEvent pce) {
945cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            if (ENCOURAGE_RACES) try { Thread.sleep(1000); } catch (InterruptedException ignored) { }
946cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            synchronized (this) {
947cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                ++eventCount;
948cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                ++changed;
949cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes                notifyAll();
95080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            }
95180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
95280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
953cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        public synchronized int getChanged() {
95480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return changed;
95580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
95680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
957cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes        public synchronized void reset() {
958cc5d0071987b9cacd58750e53ede3fd3b53fb2c9Elliott Hughes            eventCount = 0;
95980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            changed = 0;
96080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
96180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
96280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
96380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    @SuppressWarnings("unused")
96480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    static class MockPreferences extends Preferences {
96580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
96680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
96780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public String absolutePath() {
96880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
96980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
97080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
97180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
97280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public String[] childrenNames() throws BackingStoreException {
97380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
97480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
97580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
97680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
97780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void clear() throws BackingStoreException {
97880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
97980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
98080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
98180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void exportNode(OutputStream ostream) throws IOException, BackingStoreException {
98280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
98380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
98480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
98580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void exportSubtree(OutputStream ostream) throws IOException, BackingStoreException {
98680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
98780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
98880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
98980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void flush() throws BackingStoreException {
99080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
99180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
99280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
99380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public String get(String key, String deflt) {
99480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
99580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
99680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
99780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
99880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public boolean getBoolean(String key, boolean deflt) {
99980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return false;
100080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
100180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
100280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
100380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public byte[] getByteArray(String key, byte[] deflt) {
100480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
100580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
100680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
100780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
100880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public double getDouble(String key, double deflt) {
100980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return 0;
101080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
101180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
101280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
101380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public float getFloat(String key, float deflt) {
101480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return 0;
101580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
101680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
101780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
101880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public int getInt(String key, int deflt) {
101980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return 0;
102080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
102180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
102280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
102380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public long getLong(String key, long deflt) {
102480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return 0;
102580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
102680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
102780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
102880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public boolean isUserNode() {
102980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return false;
103080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
103180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
103280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
103380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public String[] keys() throws BackingStoreException {
103480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
103580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
103680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
103780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
103880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public String name() {
103980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
104080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
104180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
104280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
104380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public Preferences node(String name) {
104480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
104580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
104680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
104780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
104880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public boolean nodeExists(String name) throws BackingStoreException {
104980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return false;
105080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
105180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
105280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
105380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public Preferences parent() {
105480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
105580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
105680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
105780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
105880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void put(String key, String value) {
105980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
106080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
106180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
106280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void putBoolean(String key, boolean value) {
106380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
106480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
106580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
106680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void putByteArray(String key, byte[] value) {
106780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
106880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
106980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
107080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void putDouble(String key, double value) {
107180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
107280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
107380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
107480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void putFloat(String key, float value) {
107580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
107680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
107780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
107880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void putInt(String key, int value) {
107980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
108080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
108180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
108280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void putLong(String key, long value) {
108380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
108480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
108580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
108680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void remove(String key) {
108780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
108880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
108980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
109080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void removeNode() throws BackingStoreException {
109180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
109280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
109380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
109480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void addNodeChangeListener(NodeChangeListener ncl) {
109580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
109680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
109780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
109880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void addPreferenceChangeListener(PreferenceChangeListener pcl) {
109980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
110080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
110180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
110280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void removeNodeChangeListener(NodeChangeListener ncl) {
110380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
110480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
110580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
110680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void removePreferenceChangeListener(PreferenceChangeListener pcl) {
110780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
110880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
110980c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
111080c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public void sync() throws BackingStoreException {
111180c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
111280c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson
111380c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        @Override
111480c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        public String toString() {
111580c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson            return null;
111680c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson        }
111780c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson    }
111880c9f71990a6655b7b2b43dc1946487e917f0f9dJesse Wilson}
1119