blob: b21f773e7db7053e724e047b8866adc14afaa750 [file] [log] [blame]
/**
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.openejb.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
public class SuperPropertiesTest extends PropertiesTest {
protected void setUp() throws Exception {
super.setUp();
}
public void testCaseSensitivity() throws Exception {
SuperProperties properties = createProperties();
properties.setProperty("foo", "bar");
properties.setComment("foo", "comment");
properties.getAttributes("foo").put("name", "value");
// case sensitive
assertTrue(properties.containsKey("foo"));
assertEquals("bar", properties.get("foo"));
assertEquals("bar", properties.getProperty("foo"));
assertEquals("comment", properties.getComment("foo"));
assertNotNull(properties.getAttributes("foo"));
assertEquals("value", properties.getAttributes("foo").get("name"));
assertFalse(properties.containsKey("FOO"));
assertNull(properties.get("FOO"));
assertNull(properties.getProperty("FOO"));
assertNull(properties.getComment("FOO"));
assertNull(properties.getAttributes("FOO"));
// property differing only incase
properties.setProperty("FOO", "BAR");
properties.setComment("FOO", "COMMENT");
properties.getAttributes("FOO").put("NAME", "VALUE");
assertTrue(properties.containsKey("foo"));
assertEquals("bar", properties.get("foo"));
assertEquals("bar", properties.getProperty("foo"));
assertEquals("comment", properties.getComment("foo"));
assertNotNull(properties.getAttributes("foo"));
assertEquals("value", properties.getAttributes("foo").get("name"));
assertTrue(properties.containsKey("FOO"));
assertEquals("BAR", properties.get("FOO"));
assertEquals("BAR", properties.getProperty("FOO"));
assertEquals("COMMENT", properties.getComment("FOO"));
assertNotNull(properties.getAttributes("FOO"));
assertEquals("VALUE", properties.getAttributes("FOO").get("NAME"));
// case insensitive
properties = createProperties();
properties.setCaseInsensitive(true);
properties.setProperty("foo", "bar");
properties.setComment("foo", "comment");
properties.getAttributes("foo").put("name", "value");
assertTrue(properties.containsKey("foo"));
assertEquals("bar", properties.get("foo"));
assertEquals("bar", properties.getProperty("foo"));
assertEquals("comment", properties.getComment("foo"));
assertNotNull(properties.getAttributes("foo"));
assertEquals("value", properties.getAttributes("foo").get("name"));
assertTrue(properties.containsKey("FOO"));
assertEquals("bar", properties.get("FOO"));
assertEquals("bar", properties.getProperty("FOO"));
assertEquals("comment", properties.getComment("FOO"));
assertNotNull(properties.getAttributes("FOO"));
assertEquals("value", properties.getAttributes("FOO").get("name"));
// property differing only incase
properties.setProperty("FOO", "BAR");
properties.setComment("FOO", "COMMENT");
properties.getAttributes("FOO").put("name", "VALUE");
assertTrue(properties.containsKey("foo"));
assertEquals("BAR", properties.get("foo"));
assertEquals("BAR", properties.getProperty("foo"));
assertEquals("COMMENT", properties.getComment("foo"));
assertNotNull(properties.getAttributes("foo"));
assertEquals("VALUE", properties.getAttributes("foo").get("name"));
assertTrue(properties.containsKey("FOO"));
assertEquals("BAR", properties.get("FOO"));
assertEquals("BAR", properties.getProperty("FOO"));
assertEquals("COMMENT", properties.getComment("FOO"));
assertNotNull(properties.getAttributes("FOO"));
assertEquals("VALUE", properties.getAttributes("FOO").get("name"));
}
public void testSynchronization() throws Exception {
SuperProperties properties = createProperties();
properties.setProperty("foo", "bar");
properties.setComment("foo", "comment");
assertNotNull(properties.getAttributes("foo"));
properties.getAttributes("foo").put("name", "value");
// changing a property value should not effect comments or attributes
properties.put("foo", "bar2");
assertEquals("comment", properties.getComment("foo"));
assertNotNull(properties.getAttributes("foo"));
assertEquals("value", properties.getAttributes("foo").get("name"));
// removing a property should remove comments and attributes
properties.remove("foo");
assertNull(properties.getComment("foo"));
assertNull(properties.getAttributes("foo"));
}
public void testLoadStoreLoad() throws Exception {
SuperProperties expected = new SuperProperties();
expected.load(getClass().getResourceAsStream("test.properties"));
ByteArrayOutputStream out = new ByteArrayOutputStream();
expected.store(out, null);
SuperProperties actual = createProperties();
actual.load(new ByteArrayInputStream(out.toByteArray()));
assertProperties(expected, actual);
}
public void testLoadStoreLoadXml() throws Exception {
SuperProperties expected = new SuperProperties();
expected.load(getClass().getResourceAsStream("test.properties"));
ByteArrayOutputStream out = new ByteArrayOutputStream();
expected.storeToXML(out, null);
SuperProperties actual = createProperties();
actual.loadFromXML(new ByteArrayInputStream(out.toByteArray()));
assertProperties(expected, actual);
}
public void testStore() throws Exception {
SuperProperties properties = createProperties();
assertTrue(properties.isSpaceBetweenProperties());
assertFalse(properties.isSpaceAfterComment());
// one property
properties.setProperty("foo", "bar");
assertEquals("foo=bar\n", store(properties));
properties.setIndent(4);
assertEquals(" foo=bar\n", store(properties));
// two properties
properties.setProperty("number", "42");
assertEquals(" foo=bar\n\n number=42\n", store(properties));
properties.setSpaceBetweenProperties(false);
assertEquals(" foo=bar\n number=42\n", store(properties));
// one comment
properties.setComment("foo", "foo comment");
assertEquals(" # foo comment\n foo=bar\n number=42\n", store(properties));
properties.setCommentIndent(0);
assertEquals(" #foo comment\n foo=bar\n number=42\n", store(properties));
properties.setCommentIndent(2);
assertEquals(" # foo comment\n foo=bar\n number=42\n", store(properties));
properties.setSpaceAfterComment(true);
assertEquals(" # foo comment\n\n foo=bar\n number=42\n", store(properties));
properties.setSpaceBetweenProperties(true);
assertEquals(" # foo comment\n\n foo=bar\n\n number=42\n", store(properties));
// one attribute
properties.getAttributes("foo").put("name", "value");
assertEquals(" # foo comment\n # @name=value\n\n foo=bar\n\n number=42\n", store(properties));
properties.getAttributes("foo").put("name", null);
assertEquals(" # foo comment\n # @name\n\n foo=bar\n\n number=42\n", store(properties));
properties.getAttributes("foo").put("name", "");
assertEquals(" # foo comment\n # @name\n\n foo=bar\n\n number=42\n", store(properties));
// two attribute
properties.getAttributes("number").put("hidden", "yes");
assertEquals(" # foo comment\n # @name\n\n foo=bar\n\n # @hidden=yes\n\n number=42\n", store(properties));
// key value separator
properties = createProperties();
properties.setProperty("foo", "bar");
properties.setKeyValueSeparator(" ");
assertEquals("foo bar\n", store(properties));
properties.setKeyValueSeparator(":");
assertEquals("foo:bar\n", store(properties));
properties.setKeyValueSeparator(" = ");
assertEquals("foo = bar\n", store(properties));
properties.setKeyValueSeparator("XXXX");
assertEquals("fooXXXXbar\n", store(properties));
}
public void testLoadComments() throws Exception {
SuperProperties properties;
properties = createProperties();
properties.load(new ByteArrayInputStream("# Comment\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals("Comment", properties.getComment("foo"));
properties = createProperties();
properties.load(new ByteArrayInputStream("# Line1\n# Line2\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals("Line1\nLine2", properties.getComment("foo"));
properties = createProperties();
properties.load(new ByteArrayInputStream("# Comment\n# Indented\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals("Comment\n Indented", properties.getComment("foo"));
properties = createProperties();
properties.load(new ByteArrayInputStream("# Comment\n#Outdented\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals("Comment\nOutdented", properties.getComment("foo"));
}
public void testLoadCommentsXml() throws Exception {
SuperProperties properties;
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", null).getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", "\nComment\n").getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals("Comment\n", properties.getComment("foo"));
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", "Line1\n Line2\n").getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals("Line1\nLine2\n", properties.getComment("foo"));
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", "Line1\n Line2\n Indented").getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals("Line1\nLine2\n Indented", properties.getComment("foo"));
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", "Line1\n Line2\nOutdented").getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals("Line1\nLine2\nOutdented", properties.getComment("foo"));
}
public void testLoadAttributes() throws Exception {
SuperProperties properties;
properties = createProperties();
properties.load(new ByteArrayInputStream("# @name=value\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(map("name", "value"), properties.getAttributes("foo"));
properties = createProperties();
properties.load(new ByteArrayInputStream("# @name\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(map("name", ""), properties.getAttributes("foo"));
properties = createProperties();
properties.load(new ByteArrayInputStream("# @name=\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(map("name", ""), properties.getAttributes("foo"));
properties = createProperties();
properties.load(new ByteArrayInputStream("# @a=b\n# @c=d\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(map("a", "b", "c", "d"), properties.getAttributes("foo"));
}
public void testLoadAttributesXml() throws Exception {
SuperProperties properties;
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", "@name=value").getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(map("name", "value"), properties.getAttributes("foo"));
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", "@name").getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(map("name", ""), properties.getAttributes("foo"));
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", "@name=").getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(map("name", ""), properties.getAttributes("foo"));
properties = createProperties();
properties.loadFromXML(new ByteArrayInputStream(getXml("foo", "bar", "@a = b \n@ c = d ").getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(map("a", "b", "c", "d"), properties.getAttributes("foo"));
}
public void testIndentDetection() throws Exception {
SuperProperties properties;
properties = createProperties();
assertEquals(0, properties.getIndent());
assertEquals(1, properties.getCommentIndent());
properties = createProperties();
properties.load(new ByteArrayInputStream(" foo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(4, properties.getIndent());
assertEquals(1, properties.getCommentIndent());
properties = createProperties();
properties.load(new ByteArrayInputStream(" # Comment\n foo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(4, properties.getIndent());
assertEquals(2, properties.getCommentIndent());
properties = createProperties();
properties.load(new ByteArrayInputStream(" # Line1\n# Line2\n foo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(4, properties.getIndent());
assertEquals(2, properties.getCommentIndent());
properties = createProperties();
properties.load(new ByteArrayInputStream(" # Comment\n# Indented\n foo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(4, properties.getIndent());
assertEquals(2, properties.getCommentIndent());
properties = createProperties();
properties.load(new ByteArrayInputStream(" # Comment\n#Outdented\nfoo=bar".getBytes()));
assertEquals(singletonProperty("foo", "bar"), properties);
assertEquals(4, properties.getIndent());
assertEquals(2, properties.getCommentIndent());
}
protected SuperProperties createProperties() {
SuperProperties superProperties = new SuperProperties();
superProperties.setLineSeparator("\n");
return superProperties;
}
protected static Map<String,String> map(String... keysAndValues) {
Map<String,String> map = new LinkedHashMap<String,String>();
for (int i = 0; i+1 < keysAndValues.length; i += 2) {
String key = keysAndValues[i];
String value = keysAndValues[i + 1];
map.put(key, value);
}
return map;
}
private String getXml(String key, String value, String comment) {
StringBuilder buf = new StringBuilder();
buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
buf.append("<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">\n");
buf.append("<properties>\n");
if (comment != null) {
buf.append(" <!--").append(comment).append("-->\n");
}
buf.append(" <entry key=\"").append(key).append("\">").append(value).append("</entry>\n");
buf.append("</properties>\n");
return buf.toString();
}
}