1035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson/*
2035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * Copyright (C) 2011 The Android Open Source Project
3035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson *
4035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * you may not use this file except in compliance with the License.
6035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * You may obtain a copy of the License at
7035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson *
8035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson *
10035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * Unless required by applicable law or agreed to in writing, software
11035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * See the License for the specific language governing permissions and
14035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson * limitations under the License.
15035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson */
16035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson
17035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilsonpackage libcore.java.util.prefs;
18035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson
1966e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughesimport java.io.ByteArrayOutputStream;
20035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilsonimport java.io.File;
21035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilsonimport java.io.FileWriter;
22035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilsonimport java.util.prefs.Preferences;
23035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilsonimport junit.framework.TestCase;
24035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson
25035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilsonpublic final class PreferencesTest extends TestCase {
26035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson
27035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson    /**
28035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson     * The preferences API is designed to be hostile towards files that exist
29035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson     * where it wants to store its XML data. http://b/3431233
30035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson     */
31035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson    public void testPreferencesClobbersExistingFiles() throws Exception {
32035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        File userPrefs = new File(System.getProperty("user.home") + "/.java/.userPrefs/prefs.xml");
33035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        FileWriter writer = new FileWriter(userPrefs);
34035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        writer.write("lamb");
35035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        writer.close();
36035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        userPrefs.setReadable(false);
37035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        userPrefs.setWritable(false);
38035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        long oldLength = userPrefs.length();
39035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson
40035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        Preferences userPreferences = Preferences.userRoot();
41035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        userPreferences.sync();
42035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        userPreferences.put("a", "lion");
43035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        userPreferences.flush();
44035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        assertTrue("Expected to exist " + userPrefs, userPrefs.exists());
45035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson        assertTrue("Expected file to be clobbered", oldLength != userPrefs.length());
46035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson    }
4766e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes
4866e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes    public void testHtmlEncoding() throws Exception {
4966e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes        Preferences parent = Preferences.userNodeForPackage(this.getClass());
5066e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes        Preferences p = parent.node("testHtmlEncoding");
5166e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes        p.put("key", "a<>&'\"\\b");
5266e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes        p.flush();
5366e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes
5466e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes        ByteArrayOutputStream baos = new ByteArrayOutputStream();
5566e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes        p.exportNode(baos);
5666e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes
5766e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes        String s = new String(baos.toByteArray(), "UTF-8");
5866e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes        assertTrue(s, s.contains("value=\"a&lt;&gt;&amp;'&quot;\\b\""));
5966e1a782c0ffafcb7c4226798d6ecc4cfc071916Elliott Hughes    }
60035932b8f19aeb0eb5b25a0b6cbe7f0ab3567ddeJesse Wilson}
61