/*
* 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.brooklyn.core.config;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
import java.util.NoSuchElementException;
import org.apache.brooklyn.core.config.ConfigPredicates;
import org.apache.brooklyn.core.internal.BrooklynProperties;
import org.apache.brooklyn.util.collections.MutableMap;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
@Test
public class BrooklynPropertiesTest {
@Test
public void testGetFirst() {
BrooklynProperties props = BrooklynProperties.Factory.newEmpty().addFromMap(ImmutableMap.of("akey", "aval", "bkey", "bval"));
assertEquals(props.getFirst("akey"), "aval");
assertEquals(props.getFirst("akey", "bkey"), "aval");
assertEquals(props.getFirst("akey", "notThere"), "aval");
assertEquals(props.getFirst("notThere"), null);
assertEquals(props.getFirst("notThere", "notThere2"), null);
}
@Test
public void testGetFirstUsingFailIfNone() {
BrooklynProperties props = BrooklynProperties.Factory.newEmpty().addFromMap(ImmutableMap.of("akey", "aval", "bkey", "bval"));
assertEquals(props.getFirst(MutableMap.of("failIfNone", true), "akey"), "aval");
try {
props.getFirst(MutableMap.of("failIfNone", true), "notThrere");
fail();
} catch (NoSuchElementException e) {
// success
}
}
@Test
public void testGetFirstUsingFailIfNoneFalse() {
BrooklynProperties props = BrooklynProperties.Factory.newEmpty().addFromMap(ImmutableMap.of("akey", "aval", "bkey", "bval"));
assertEquals(props.getFirst(MutableMap.of("failIfNone", false), "notThrere"), null);
}
@Test
public void testGetFirstUsingDefaultIfNone() {
BrooklynProperties props = BrooklynProperties.Factory.newEmpty().addFromMap(ImmutableMap.of("akey", "aval", "bkey", "bval"));
assertEquals(props.getFirst(MutableMap.of("defaultIfNone", "mydef"), "akey"), "aval");
assertEquals(props.getFirst(MutableMap.of("defaultIfNone", "mydef"), "notThere"), "mydef");
}
/*
* sample.properties:
* P1=Property 1
* P2=Property 2
*
* more-sample.properties:
* P3=Property 3
* P1=Property 1 v2
*
* tricky.properties:
* P1=Property 1 v3
* P1=Property 1 v4
* a.b.c=d.e.f
* a=b=c
* aa=$a
*/
@Test
public void testAddFromUrlSimple() {
BrooklynProperties p1 = BrooklynProperties.Factory.newEmpty().addFromUrl("brooklyn/config/sample.properties");
assertForSample(p1);
}
@Test
public void testAddFromUrlClasspath() {
BrooklynProperties p1 = BrooklynProperties.Factory.newEmpty().addFromUrl("classpath://brooklyn/config/sample.properties");
assertForSample(p1);
}
@Test
public void testAddMultipleFromUrl() {
BrooklynProperties p1 = BrooklynProperties.Factory.newEmpty().
addFromUrl("brooklyn/config/sample.properties").
addFromUrl("brooklyn/config/more-sample.properties");
assertForMoreSample(p1);
}
// P1=Property 1 v3
// P1=Property 1 v4
// a.b.c=d.e.f
// a=b=c
// aa=$a
@Test
public void testTrickyAddMultipleFromUrl() {
BrooklynProperties p1 = BrooklynProperties.Factory.newEmpty().
addFromUrl("brooklyn/config/sample.properties").
addFromUrl("brooklyn/config/tricky.properties");
assertForSampleAndTricky(p1);
}
private void assertForSample(BrooklynProperties p) {
Assert.assertEquals(p.getFirst("P1"), "Property 1");
Assert.assertEquals(p.getFirst("P2"), "Property 2");
Assert.assertEquals(p.getFirst("P0", "P3"), null);
}
private void assertForMoreSample(BrooklynProperties p) {
Assert.assertEquals(p.getFirst("P1"), "Property 1 v2");
Assert.assertEquals(p.getFirst("P2"), "Property 2");
Assert.assertEquals(p.getFirst("P0", "P3"), "Property 3");
}
private void assertForSampleAndTricky(BrooklynProperties p) {
Assert.assertEquals(p.getFirst("P1"), "Property 1 v4");
Assert.assertEquals(p.getFirst("P2"), "Property 2");
Assert.assertEquals(p.getFirst("P0", "P3"), null);
Assert.assertEquals(p.getFirst("a.b.c"), "d.e.f");
Assert.assertEquals(p.getFirst("a"), "b=c");
Assert.assertEquals(p.getFirst("aa"), "$a");
}
@Test
public void testGetSubMap() {
BrooklynProperties props = BrooklynProperties.Factory.newEmpty().addFromMap(ImmutableMap.of(
"a.key", "aval", "a.key2", "aval2", "akey", "noval", "b.key", "bval"));
BrooklynProperties p2 = props.submap(ConfigPredicates.matchingGlob("a.*"));
assertEquals(p2.getAllConfig().keySet().size(), 2, "wrong size submap: "+p2);
assertEquals(p2.getFirst("a.key"), "aval");
assertEquals(p2.getFirst("b.key"), null);
assertEquals(p2.getFirst("akey"), null);
BrooklynProperties p3a = props.submap(ConfigPredicates.startingWith("a."));
assertEquals(p3a, p2);
BrooklynProperties p3b = props.submap(ConfigPredicates.matchingRegex("a\\..*"));
assertEquals(p3b, p2);
BrooklynProperties p4 = props.submap(ConfigPredicates.matchingRegex("a.*"));
assertEquals(p4.getAllConfig().keySet().size(), 3, "wrong size submap: "+p4);
assertEquals(p4.getFirst("a.key"), "aval");
assertEquals(p4.getFirst("b.key"), null);
assertEquals(p4.getFirst("akey"), "noval");
}
@Test
public void testGetAndPutConfig() {
BrooklynProperties props = BrooklynProperties.Factory.newEmpty().addFromMap(ImmutableMap.of(
"a.key", "aval", "a.key2", "aval2", "akey", "noval", "n.key", "234"));
BasicConfigKey<String> aString = new BasicConfigKey<String>(String.class, "a.key");
BasicConfigKey<Integer> nNum = new BasicConfigKey<Integer>(Integer.class, "n.key");
BasicConfigKey<Integer> aBsent = new BasicConfigKey<Integer>(Integer.class, "ab.sent");
BasicConfigKey<Integer> aMisstyped = new BasicConfigKey<Integer>(Integer.class, "am.isstyped");
BasicConfigKey<Integer> aDfault = new BasicConfigKey<Integer>(Integer.class, "a.default", "-", 123);
assertEquals(props.getConfig(aString), "aval");
assertEquals(props.getConfig(nNum), (Integer)234);
props.put(aString, "aval2");
assertEquals(props.getConfig(aString), "aval2");
assertEquals(props.get("a.key"), "aval2");
props.put(nNum, "345");
assertEquals(props.getConfig(nNum), (Integer)345);
assertEquals(props.get("n.key"), "345");
assertEquals(props.getConfig(aBsent), null);
assertEquals(props.getConfig(aBsent, 123), (Integer)123);
assertEquals(props.getConfig(aDfault), (Integer)123);
props.put(aMisstyped, "x1");
assertEquals(props.get("am.isstyped"), "x1");
boolean workedWhenShouldntHave = false;
try { props.getConfig(aMisstyped); workedWhenShouldntHave = true; } catch (Exception e) {}
if (workedWhenShouldntHave) fail("should have failed getting "+aMisstyped+" because can't coerce");
}
}