package org.cloudfoundry.community.servicebroker.brooklyn.service.plan;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
public class PlaceholderReplacerTest {
private static String PLACEHOLDER = "$(string.random)";
private PlaceholderReplacer placeholderReplacer;
@Before
public void setup() {
placeholderReplacer = new PlaceholderReplacer(new Random());
}
@Test
public void testRandomString() {
final ImmutableList<Integer> lengths = ImmutableList.of(4, 8, 15, 25, 34, 345, 255, 123);
for (Integer length : lengths) {
final String randomString = placeholderReplacer.randomString(length);
assertEquals((int) length, randomString.length());
}
}
@Test
public void testReplaceValueString() {
final MutableList<String> fixtures = MutableList.of("foo", "bar", "${string.random}", PLACEHOLDER);
for (String fixture : fixtures) {
final String actualValue = placeholderReplacer.replaceValue(fixture);
if (PLACEHOLDER.equals(fixture)) {
assertNotEquals(fixture, actualValue);
} else {
assertEquals(fixture, actualValue);
}
assertEquals(PLACEHOLDER.equals(fixture) ? 8 : fixture.length(), actualValue.length());
}
}
@Test
public void testReplaceValueList() {
final ImmutableList<Object> fixtures = ImmutableList.of(
"foo",
PLACEHOLDER,
new Date(),
ImmutableList.of("bar", PLACEHOLDER),
ImmutableMap.of("foo", "bar", PLACEHOLDER, PLACEHOLDER));
final List<Object> actualValues = placeholderReplacer.replaceValues(MutableList.copyOf(fixtures));
this.assertReplacedValues(fixtures, actualValues);
}
@Test
public void testReplaceValueMap() {
final ImmutableMap<String, Object> fixtures = ImmutableMap.of(
"foo", "bar",
PLACEHOLDER, PLACEHOLDER,
"object", new Date(),
"map", ImmutableMap.of(
"foo", "bar",
PLACEHOLDER, PLACEHOLDER
),
"list", ImmutableList.of("bar", PLACEHOLDER)
);
final Map<String, Object> actualValues = placeholderReplacer.replaceValues(MutableMap.copyOf(fixtures));
this.assertReplacedValues(fixtures, actualValues);
}
private void assertReplacedValues(Object fixture, Object actual) {
if (fixture instanceof Map) {
assertTrue(actual instanceof Map);
assertEquals(((Map) fixture).size(), ((Map) actual).size());
for (Map.Entry<String, Object> entry : ((Map<String, Object>) fixture).entrySet()) {
assertTrue(((Map) actual).containsKey(entry.getKey()));
this.assertReplacedValues(entry.getValue(), ((Map) actual).get(entry.getKey()));
}
} else if (fixture instanceof List) {
assertTrue(actual instanceof List);
assertEquals(((List) fixture).size(), ((List) actual).size());
for (int i = 0; i < ((List) fixture).size(); i++) {
this.assertReplacedValues(((List) fixture).get(i), ((List) actual).get(i));
}
} else if (fixture instanceof String) {
assertTrue(actual instanceof String);
if (PLACEHOLDER.equals(fixture)) {
assertNotEquals(fixture, actual);
} else {
assertEquals(fixture, actual);
}
} else {
assertEquals(fixture, actual);
}
}
@Test
public void testReplaceValueInListOfList() {
final MutableList<Object> fixtures = MutableList.of(
MutableList.of("foo", "bar", PLACEHOLDER));
final List<Object> replacedValues = placeholderReplacer.replaceValues(fixtures);
assertNotEquals(replacedValues, fixtures);
assertEquals(replacedValues.size(), fixtures.size());
boolean found = false;
for (Object replacedValue : replacedValues) {
for (Object s : ((List<Object>) replacedValue)) {
assertTrue(s instanceof String);
found |= ((String) s).equals(PLACEHOLDER);
}
}
assertFalse(found);
}
}