/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed 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.springframework.boot.env;
import java.util.Map;
import java.util.Properties;
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.origin.OriginTrackedValue;
import org.springframework.boot.origin.TextResourceOrigin;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link OriginTrackedPropertiesLoader}.
*
* @author Madhura Bhave
* @author Phillip Webb
*/
public class OriginTrackedPropertiesLoaderTests {
private ClassPathResource resource;
private Map<String, OriginTrackedValue> properties;
@Before
public void setUp() throws Exception {
String path = "test-properties.properties";
this.resource = new ClassPathResource(path, getClass());
this.properties = new OriginTrackedPropertiesLoader(this.resource).load();
}
@Test
public void compareToJavaProperties() throws Exception {
Properties java = PropertiesLoaderUtils.loadProperties(this.resource);
Properties ours = new Properties();
new OriginTrackedPropertiesLoader(this.resource).load(false)
.forEach((k, v) -> ours.put(k, v.getValue()));
assertThat(ours).isEqualTo(java);
}
@Test
public void getSimpleProperty() throws Exception {
OriginTrackedValue value = this.properties.get("test");
assertThat(getValue(value)).isEqualTo("properties");
assertThat(getLocation(value)).isEqualTo("11:6");
}
@Test
public void getSimplePropertyWithColonSeparator() throws Exception {
OriginTrackedValue value = this.properties.get("test-colon-separator");
assertThat(getValue(value)).isEqualTo("my-property");
assertThat(getLocation(value)).isEqualTo("15:23");
}
@Test
public void getPropertyWithSeparatorSurroundedBySpaces() throws Exception {
OriginTrackedValue value = this.properties.get("blah");
assertThat(getValue(value)).isEqualTo("hello world");
assertThat(getLocation(value)).isEqualTo("2:12");
}
@Test
public void getUnicodeProperty() throws Exception {
OriginTrackedValue value = this.properties.get("test-unicode");
assertThat(getValue(value)).isEqualTo("properties&test");
assertThat(getLocation(value)).isEqualTo("12:14");
}
@Test
public void getEscapedProperty() throws Exception {
OriginTrackedValue value = this.properties.get("test=property");
assertThat(getValue(value)).isEqualTo("helloworld");
assertThat(getLocation(value)).isEqualTo("14:15");
}
@Test
public void getPropertyWithTab() throws Exception {
OriginTrackedValue value = this.properties.get("test-tab-property");
assertThat(getValue(value)).isEqualTo("foo\tbar");
assertThat(getLocation(value)).isEqualTo("16:19");
}
@Test
public void getPropertyWithBang() throws Exception {
OriginTrackedValue value = this.properties.get("test-bang-property");
assertThat(getValue(value)).isEqualTo("foo!");
assertThat(getLocation(value)).isEqualTo("34:20");
}
@Test
public void getPropertyWithValueComment() throws Exception {
OriginTrackedValue value = this.properties.get("test-property-value-comment");
assertThat(getValue(value)).isEqualTo("foo !bar #foo");
assertThat(getLocation(value)).isEqualTo("36:29");
}
@Test
public void getPropertyWithMultilineImmediateBang() {
OriginTrackedValue value = this.properties.get("test-multiline-immediate-bang");
assertThat(getValue(value)).isEqualTo("!foo");
assertThat(getLocation(value)).isEqualTo("39:1");
}
@Test
public void getPropertyWithCarriageReturn() throws Exception {
OriginTrackedValue value = this.properties.get("test-return-property");
assertThat(getValue(value)).isEqualTo("foo\rbar");
assertThat(getLocation(value)).isEqualTo("17:22");
}
@Test
public void getPropertyWithNewLine() throws Exception {
OriginTrackedValue value = this.properties.get("test-newline-property");
assertThat(getValue(value)).isEqualTo("foo\nbar");
assertThat(getLocation(value)).isEqualTo("18:23");
}
@Test
public void getPropertyWithFormFeed() throws Exception {
OriginTrackedValue value = this.properties.get("test-form-feed-property");
assertThat(getValue(value)).isEqualTo("foo\fbar");
assertThat(getLocation(value)).isEqualTo("19:25");
}
@Test
public void getPropertyWithWhiteSpace() throws Exception {
OriginTrackedValue value = this.properties.get("test-whitespace-property");
assertThat(getValue(value)).isEqualTo("foo bar");
assertThat(getLocation(value)).isEqualTo("20:32");
}
@Test
public void getCommentedOutPropertyShouldBeNull() throws Exception {
assertThat(this.properties.get("commented-property")).isNull();
assertThat(this.properties.get("#commented-property")).isNull();
assertThat(this.properties.get("commented-two")).isNull();
assertThat(this.properties.get("!commented-two")).isNull();
}
@Test
public void getMultiline() throws Exception {
OriginTrackedValue value = this.properties.get("test-multiline");
assertThat(getValue(value)).isEqualTo("ab\\c");
assertThat(getLocation(value)).isEqualTo("21:17");
}
@Test
public void getImmediateMultiline() throws Exception {
OriginTrackedValue value = this.properties.get("test-multiline-immediate");
assertThat(getValue(value)).isEqualTo("foo");
assertThat(getLocation(value)).isEqualTo("32:1");
}
@Test
public void getPropertyWithWhitespaceAfterKey() throws Exception {
OriginTrackedValue value = this.properties.get("bar");
assertThat(getValue(value)).isEqualTo("foo=baz");
assertThat(getLocation(value)).isEqualTo("3:7");
}
@Test
public void getPropertyWithSpaceSeparator() throws Exception {
OriginTrackedValue value = this.properties.get("hello");
assertThat(getValue(value)).isEqualTo("world");
assertThat(getLocation(value)).isEqualTo("4:9");
}
@Test
public void getPropertyWithBackslashEscaped() throws Exception {
OriginTrackedValue value = this.properties.get("proper\\ty");
assertThat(getValue(value)).isEqualTo("test");
assertThat(getLocation(value)).isEqualTo("5:11");
}
@Test
public void getPropertyWithEmptyValue() throws Exception {
OriginTrackedValue value = this.properties.get("foo");
assertThat(getValue(value)).isEqualTo("");
assertThat(getLocation(value)).isEqualTo("7:0");
}
@Test
public void getPropertyWithBackslashEscapedInValue() throws Exception {
OriginTrackedValue value = this.properties.get("bat");
assertThat(getValue(value)).isEqualTo("a\\");
assertThat(getLocation(value)).isEqualTo("7:7");
}
@Test
public void getPropertyWithSeparatorInValue() throws Exception {
OriginTrackedValue value = this.properties.get("bling");
assertThat(getValue(value)).isEqualTo("a=b");
assertThat(getLocation(value)).isEqualTo("8:9");
}
@Test
public void getListProperty() throws Exception {
OriginTrackedValue apple = this.properties.get("foods[0]");
assertThat(getValue(apple)).isEqualTo("Apple");
assertThat(getLocation(apple)).isEqualTo("24:9");
OriginTrackedValue orange = this.properties.get("foods[1]");
assertThat(getValue(orange)).isEqualTo("Orange");
assertThat(getLocation(orange)).isEqualTo("25:1");
OriginTrackedValue strawberry = this.properties.get("foods[2]");
assertThat(getValue(strawberry)).isEqualTo("Strawberry");
assertThat(getLocation(strawberry)).isEqualTo("26:1");
OriginTrackedValue mango = this.properties.get("foods[3]");
assertThat(getValue(mango)).isEqualTo("Mango");
assertThat(getLocation(mango)).isEqualTo("27:1");
}
private Object getValue(OriginTrackedValue value) {
return (value == null ? null : value.getValue());
}
private String getLocation(OriginTrackedValue value) {
if (value == null) {
return null;
}
return ((TextResourceOrigin) value.getOrigin()).getLocation()
.toString();
}
}