You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ha...@apache.org on 2015/08/17 21:17:45 UTC
[14/42] incubator-brooklyn git commit: [BROOKLYN-162] Refactor
package in ./core/util
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/task/system/SystemTasksTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/task/system/SystemTasksTest.java b/core/src/test/java/brooklyn/util/task/system/SystemTasksTest.java
deleted file mode 100644
index e60310d..0000000
--- a/core/src/test/java/brooklyn/util/task/system/SystemTasksTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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 brooklyn.util.task.system;
-
-import java.io.File;
-
-import org.apache.brooklyn.api.management.ManagementContext;
-import org.apache.brooklyn.core.management.internal.LocalManagementContext;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.basic.Entities;
-import brooklyn.util.os.Os;
-import brooklyn.util.task.ssh.SshTasks;
-
-/**
- * Some tests for {@link SystemTasks}. See {@link SshTasks}.
- */
-public class SystemTasksTest {
-
- ManagementContext mgmt;
- File tempDir;
-
- boolean failureExpected;
-
- @BeforeMethod(alwaysRun=true)
- public void setup() throws Exception {
- mgmt = new LocalManagementContext();
-
- clearExpectedFailure();
- tempDir = Os.newTempDir(getClass());
- }
-
- @AfterMethod(alwaysRun=true)
- public void tearDown() throws Exception {
- if (mgmt != null) Entities.destroyAll(mgmt);
- mgmt = null;
- tempDir = Os.deleteRecursively(tempDir).asNullOrThrowing();
- checkExpectedFailure();
- }
-
- protected void checkExpectedFailure() {
- if (failureExpected) {
- clearExpectedFailure();
- Assert.fail("Test should have thrown an exception but it did not.");
- }
- }
-
- protected void clearExpectedFailure() {
- failureExpected = false;
- }
-
- protected void setExpectingFailure() {
- failureExpected = true;
- }
-
-
- protected <T> ProcessTaskWrapper<T> submit(final ProcessTaskFactory<T> tf) {
- ProcessTaskWrapper<T> t = tf.newTask();
- mgmt.getExecutionManager().submit(t);
- return t;
- }
-
- @Test(groups="Integration")
- public void testExecEchoHello() {
- ProcessTaskWrapper<Integer> t = submit(SystemTasks.exec("sleep 1 ; echo hello world"));
- Assert.assertFalse(t.isDone());
- Assert.assertEquals(t.get(), (Integer)0);
- Assert.assertEquals(t.getTask().getUnchecked(), (Integer)0);
- Assert.assertEquals(t.getStdout().trim(), "hello world");
- }
-
- // FIXME Behaviour of Bash shell changes from 3.x to 4.x so test is disabled
- @Test(groups="Integration", enabled=false)
- public void testSubshellExitScriptDoesNotExit() {
- checkSubshellExitDoesNotExit(taskSubshellExit().runAsScript());
- }
-
- @Test(groups="Integration")
- public void testSubshellExitCommandDoesNotExit() {
- checkSubshellExitDoesNotExit(taskSubshellExit().runAsCommand());
- }
-
- public ProcessTaskFactory<Integer> taskSubshellExit() {
- return SystemTasks.exec("echo hello", "( exit 1 )", "echo bye code $?");
- }
-
- public void checkSubshellExitDoesNotExit(ProcessTaskFactory<Integer> task) {
- ProcessTaskWrapper<Integer> t = submit(task);
- t.block();
- Assert.assertEquals(t.get(), (Integer)0);
- Assert.assertTrue(t.getStdout().contains("bye code 1"), "stdout is: "+t.getStdout());
- }
-
- @Test(groups="Integration")
- public void testGroupExitScriptDoesNotExit() {
- checkGroupExitDoesExit(taskGroupExit().runAsScript());
- }
-
- @Test(groups="Integration")
- public void testGroupExitCommandDoesNotExit() {
- checkGroupExitDoesExit(taskGroupExit().runAsCommand());
- }
-
- public ProcessTaskFactory<Integer> taskGroupExit() {
- return SystemTasks.exec("echo hello", "{ exit 1 ; }", "echo bye code $?");
- }
-
- public void checkGroupExitDoesExit(ProcessTaskFactory<Integer> task) {
- ProcessTaskWrapper<Integer> t = submit(task);
- t.block();
- Assert.assertEquals(t.get(), (Integer)1);
- Assert.assertFalse(t.getStdout().contains("bye"), "stdout is: "+t.getStdout());
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/text/DataUriSchemeParserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/text/DataUriSchemeParserTest.java b/core/src/test/java/brooklyn/util/text/DataUriSchemeParserTest.java
deleted file mode 100644
index ff2dc9b..0000000
--- a/core/src/test/java/brooklyn/util/text/DataUriSchemeParserTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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 brooklyn.util.text;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-
-import org.bouncycastle.util.encoders.Base64;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class DataUriSchemeParserTest {
-
- @Test
- public void testSimple() {
- Assert.assertEquals(new DataUriSchemeParser("data:,hello").parse().getDataAsString(), "hello");
- Assert.assertEquals(DataUriSchemeParser.toString("data:,hello"), "hello");
- }
-
- @Test
- public void testMimeType() throws UnsupportedEncodingException {
- DataUriSchemeParser p = new DataUriSchemeParser("data:application/json,"+URLEncoder.encode("{ }", "US-ASCII")).parse();
- Assert.assertEquals(p.getMimeType(), "application/json");
- Assert.assertEquals(p.getData(), "{ }".getBytes());
- }
-
- @Test
- public void testBase64() {
- Assert.assertEquals(DataUriSchemeParser.toString(
- "data:;base64,"+new String(Base64.encode("hello".getBytes()))),
- "hello");
- }
-
- // TODO test pictures, etc
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/text/TemplateProcessorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/text/TemplateProcessorTest.java b/core/src/test/java/brooklyn/util/text/TemplateProcessorTest.java
deleted file mode 100644
index bd8ef87..0000000
--- a/core/src/test/java/brooklyn/util/text/TemplateProcessorTest.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * 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 brooklyn.util.text;
-
-import static org.testng.Assert.assertEquals;
-
-import org.apache.brooklyn.api.entity.proxying.EntitySpec;
-import org.apache.brooklyn.core.management.internal.ManagementContextInternal;
-import org.apache.brooklyn.test.entity.TestApplication;
-import org.apache.brooklyn.test.entity.TestEntity;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.BrooklynAppUnitTestSupport;
-import brooklyn.event.basic.DependentConfiguration;
-import brooklyn.test.FixedLocaleTest;
-
-import com.google.common.collect.ImmutableMap;
-
-public class TemplateProcessorTest extends BrooklynAppUnitTestSupport {
- private FixedLocaleTest localeFix = new FixedLocaleTest();
-
- @BeforeMethod(alwaysRun=true)
- public void setUp() throws Exception {
- super.setUp();
- localeFix.setUp();
- }
-
- @AfterMethod(alwaysRun=true)
- public void tearDown() throws Exception {
- super.tearDown();
- localeFix.tearDown();
- }
-
- @Test
- public void testAdditionalArgs() {
- String templateContents = "${mykey}";
- String result = TemplateProcessor.processTemplateContents(templateContents, app, ImmutableMap.of("mykey", "myval"));
- assertEquals(result, "myval");
- }
-
- @Test
- public void testEntityConfig() {
- TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
- .configure(TestEntity.CONF_NAME, "myval"));
- String templateContents = "${config['"+TestEntity.CONF_NAME.getName()+"']}";
- String result = TemplateProcessor.processTemplateContents(templateContents, entity, ImmutableMap.<String,Object>of());
- assertEquals(result, "myval");
- }
-
- @Test
- public void testEntityConfigNumber() {
- TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
- .configure(TestEntity.CONF_OBJECT, 123456));
- String templateContents = "${config['"+TestEntity.CONF_OBJECT.getName()+"']}";
- String result = TemplateProcessor.processTemplateContents(templateContents, entity, ImmutableMap.<String,Object>of());
- assertEquals(result, "123,456");
- }
-
- @Test
- public void testEntityConfigNumberUnadorned() {
- // ?c is needed to avoid commas (i always forget this!)
- TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
- .configure(TestEntity.CONF_OBJECT, 123456));
- String templateContents = "${config['"+TestEntity.CONF_OBJECT.getName()+"']?c}";
- String result = TemplateProcessor.processTemplateContents(templateContents, entity, ImmutableMap.<String,Object>of());
- assertEquals(result, "123456");
- }
-
- @Test
- public void testGetSysProp() {
- System.setProperty("testGetSysProp", "myval");
-
- String templateContents = "${javaSysProps['testGetSysProp']}";
- String result = TemplateProcessor.processTemplateContents(templateContents, app, ImmutableMap.<String,Object>of());
- assertEquals(result, "myval");
- }
-
- @Test
- public void testEntityGetterMethod() {
- String templateContents = "${entity.id}";
- String result = TemplateProcessor.processTemplateContents(templateContents, app, ImmutableMap.<String,Object>of());
- assertEquals(result, app.getId());
- }
-
- @Test
- public void testManagementContextConfig() {
- mgmt.getBrooklynProperties().put("globalmykey", "myval");
- String templateContents = "${mgmt.globalmykey}";
- String result = TemplateProcessor.processTemplateContents(templateContents, app, ImmutableMap.<String,Object>of());
- assertEquals(result, "myval");
- }
-
- @Test
- public void testManagementContextDefaultValue() {
- String templateContents = "${(missing)!\"defval\"}";
- Object result = TemplateProcessor.processTemplateContents(templateContents, app, ImmutableMap.<String,Object>of());
- assertEquals(result, "defval");
- }
-
- @Test
- public void testManagementContextDefaultValueInDotMissingValue() {
- String templateContents = "${(mgmt.missing.more_missing)!\"defval\"}";
- Object result = TemplateProcessor.processTemplateContents(templateContents, app, ImmutableMap.<String,Object>of());
- assertEquals(result, "defval");
- }
-
- @Test
- public void testManagementContextConfigWithDot() {
- mgmt.getBrooklynProperties().put("global.mykey", "myval");
- String templateContents = "${mgmt['global.mykey']}";
- String result = TemplateProcessor.processTemplateContents(templateContents, app, ImmutableMap.<String,Object>of());
- assertEquals(result, "myval");
- }
-
- @Test
- public void testManagementContextErrors() {
- try {
- // NB: dot has special meaning so this should fail; must be accessed using bracket notation as above
- mgmt.getBrooklynProperties().put("global.mykey", "myval");
- String templateContents = "${mgmt.global.mykey}";
- TemplateProcessor.processTemplateContents(templateContents, app, ImmutableMap.<String,Object>of());
- Assert.fail("Should not have found value with intermediate dot");
- } catch (Exception e) {
- Assert.assertTrue(e.toString().contains("global"), "Should have mentioned missing key 'global' in error");
- }
- }
-
- @Test
- public void testApplyTemplatedConfigWithAttributeWhenReady() {
- app.setAttribute(TestApplication.MY_ATTRIBUTE, "myval");
-
- TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
- .configure(TestEntity.CONF_NAME, DependentConfiguration.attributeWhenReady(app, TestApplication.MY_ATTRIBUTE)));
-
- String templateContents = "${config['"+TestEntity.CONF_NAME.getName()+"']}";
- String result = TemplateProcessor.processTemplateContents(templateContents, entity, ImmutableMap.<String,Object>of());
- assertEquals(result, "myval");
- }
-
- @Test
- public void testDotSeparatedKey() {
- String templateContents = "${a.b}";
- String result = TemplateProcessor.processTemplateContents(templateContents, (ManagementContextInternal)null,
- ImmutableMap.<String,Object>of("a.b", "myval"));
- assertEquals(result, "myval");
- }
-
- @Test
- public void testDotSeparatedKeyCollisionFailure() {
- String templateContents = "${aaa.bbb}";
- try {
- TemplateProcessor.processTemplateContents(templateContents, (ManagementContextInternal)null,
- ImmutableMap.<String,Object>of("aaa.bbb", "myval", "aaa", "blocker"));
- Assert.fail("Should not have found value with intermediate dot where prefix is overridden");
- } catch (Exception e) {
- Assert.assertTrue(e.toString().contains("aaa"), "Should have mentioned missing key 'aaa' in error");
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/xstream/CompilerCompatibilityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/xstream/CompilerCompatibilityTest.java b/core/src/test/java/brooklyn/util/xstream/CompilerCompatibilityTest.java
deleted file mode 100644
index 5a1f844..0000000
--- a/core/src/test/java/brooklyn/util/xstream/CompilerCompatibilityTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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 brooklyn.util.xstream;
-
-import static org.testng.Assert.assertTrue;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-
-import org.testng.annotations.Test;
-
-import brooklyn.util.xstream.CompilerCompatibilityTest.EnclosingClass.DynamicClass;
-import brooklyn.util.xstream.CompilerCompatibilityTest.EnclosingClass.DynamicExtendingClass;
-import brooklyn.util.xstream.CompilerCompatibilityTest.EnclosingClass.EnclosingDynamicClass;
-import brooklyn.util.xstream.CompilerCompatibilityTest.EnclosingClass.EnclosingDynamicClass.NestedDynamicClass;
-
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.mapper.MapperWrapper;
-
-// To get the generated synthetic fields use the command:
-/*
- find core/target/test-classes -name CompilerCompatibilityTest\$EnclosingClass\$* | \
- sed s@core/target/test-classes/@@ | sed 's@.class$@@' | sed s@/@.@g | \
- xargs javap -classpath core/target/test-classes/ | grep -B1 this
-*/
-@SuppressWarnings("unused")
-public class CompilerCompatibilityTest {
- private EnclosingClass enclosingClass = new EnclosingClass();
- private DynamicClass dynamicClass = enclosingClass.new DynamicClass();
- private DynamicExtendingClass dynamicExtendingClass = enclosingClass.new DynamicExtendingClass();
- private EnclosingDynamicClass enclosingDynamicClass = enclosingClass.new EnclosingDynamicClass();
- private NestedDynamicClass nestedDynamicClass = enclosingDynamicClass.new NestedDynamicClass();
-// NOT SUPPORTED
-// private DynamicExtendingClassWithDifferentScope dynamicExtendingClassWithDifferentScope =
-// enclosingClass.new DynamicExtendingClassWithDifferentScope(enclosingDynamicClass);
-
- public static class EnclosingClass {
- public class DynamicClass {
- //Oracle/OpenJDK/IBM generates
- //final EnclosingClass this$0;
-
- //eclipse-[groovy-]compiler generates
- //final EnclosingClass this$1;
- }
-
- public class DynamicExtendingClass extends DynamicClass {
- //The field here masks the parent field
-
- //Oracle/OpenJDK/IBM generates
- //final EnclosingClass this$0;
-
- //eclipse-[groovy-]compiler generates
- //final EnclosingClass this$1;
- }
-
- public class EnclosingDynamicClass {
- //Oracle/OpenJDK/IBM generates
- //final EnclosingClass this$0;
-
- //eclipse-[groovy-]compiler generates
- //final EnclosingClass this$1;
-
- public class NestedDynamicClass {
- //Oracle/OpenJDK/IBM generates
- //final EnclosingClass this$1;
-
- //eclipse-[groovy-]compiler generates
- //final EnclosingClass this$2;
- }
- }
-
-// WARNING: Combination NOT SUPPORTED. Not enough information in XML to deserialize reliably,
-// having in mind that different compilers could be used for parent/child classes.
-// If we really need to, we can extend the heuristic to check for field types or assume that
-// only one compiler was used for the whole class hierarchy covering some more cases.
-//
-// The problem is that we have two fields with different names, without relation between the
-// indexes in each one. Changing compilers (or combination of compilers) could change the
-// indexes independently in each field. This makes it impossible to infer which field in the xml
-// maps to which field in the object.
-// When having identical field names with parent classes XStream will put a defined-in attribute
-// which makes it possible to deserialize, but it can't be forced to put it in each element.
-//
- public class DynamicExtendingClassWithDifferentScope extends NestedDynamicClass {
- //Oracle/OpenJDK/IBM generates
- //final EnclosingClass this$0;
-
- //eclipse-[groovy-]compiler generates
- //final EnclosingClass this$1;
-
- //constructor required to compile
- public DynamicExtendingClassWithDifferentScope(EnclosingDynamicClass superEnclosingScope) {
- superEnclosingScope.super();
- }
- }
- }
-
- @Test
- public void testXStreamDeserialize() throws Exception {
- deserialize("/brooklyn/entity/rebind/compiler_compatibility_eclipse.xml");
- deserialize("/brooklyn/entity/rebind/compiler_compatibility_oracle.xml");
- }
-
- private void deserialize(String inputUrl) throws Exception {
- XStream xstream = new XStream() {
- @Override
- protected MapperWrapper wrapMapper(MapperWrapper next) {
- return new CompilerIndependentOuterClassFieldMapper(super.wrapMapper(next));
- }
- };
-
- InputStream in = this.getClass().getResourceAsStream(inputUrl);
- try {
- Object obj = xstream.fromXML(in);
- assertNonNullOuterFields(obj);
- } finally {
- in.close();
- }
- }
-
- private void assertNonNullOuterFields(Object obj) throws Exception {
- Field[] testInstances = obj.getClass().getDeclaredFields();
- for (Field instanceField : testInstances) {
- Object instance = instanceField.get(obj);
- Class<?> type = instance.getClass();
- do {
- for (Field field : type.getDeclaredFields()) {
- if (field.getName().startsWith("this$")) {
- Object value = field.get(instance);
- assertTrue(value != null, field + " should not be null");
- }
- }
- type = type.getSuperclass();
- } while (type != null);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/xstream/ConverterTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/xstream/ConverterTestFixture.java b/core/src/test/java/brooklyn/util/xstream/ConverterTestFixture.java
deleted file mode 100644
index bf566ba..0000000
--- a/core/src/test/java/brooklyn/util/xstream/ConverterTestFixture.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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 brooklyn.util.xstream;
-
-import org.testng.Assert;
-
-import com.thoughtworks.xstream.XStream;
-
-public class ConverterTestFixture {
-
- protected Object assertX(Object obj, String fmt) {
- XStream xstream = new XStream();
- registerConverters(xstream);
- String s1 = xstream.toXML(obj);
- Assert.assertEquals(s1, fmt);
- Object out = xstream.fromXML(s1);
- Assert.assertEquals(out, obj);
- return out;
- }
-
- protected void registerConverters(XStream xstream) {
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/xstream/EnumCaseForgivingConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/xstream/EnumCaseForgivingConverterTest.java b/core/src/test/java/brooklyn/util/xstream/EnumCaseForgivingConverterTest.java
deleted file mode 100644
index f22f91b..0000000
--- a/core/src/test/java/brooklyn/util/xstream/EnumCaseForgivingConverterTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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 brooklyn.util.xstream;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.fail;
-
-import org.testng.annotations.Test;
-
-public class EnumCaseForgivingConverterTest {
-
- public enum MyEnum {
- FOO,
- BaR;
- }
-
- @Test
- public void testFindsCaseInsensitive() throws Exception {
- assertEquals(EnumCaseForgivingConverter.resolve(MyEnum.class, "FOO"), MyEnum.FOO);
- assertEquals(EnumCaseForgivingConverter.resolve(MyEnum.class, "foo"), MyEnum.FOO);
- assertEquals(EnumCaseForgivingConverter.resolve(MyEnum.class, "Foo"), MyEnum.FOO);
- assertEquals(EnumCaseForgivingConverter.resolve(MyEnum.class, "BAR"), MyEnum.BaR);
- assertEquals(EnumCaseForgivingConverter.resolve(MyEnum.class, "bar"), MyEnum.BaR);
- assertEquals(EnumCaseForgivingConverter.resolve(MyEnum.class, "Bar"), MyEnum.BaR);
- }
-
- @Test
- public void testFailsIfNoMatch() throws Exception {
- try {
- assertEquals(EnumCaseForgivingConverter.resolve(MyEnum.class, "DoesNotExist"), MyEnum.BaR);
- fail();
- } catch (IllegalArgumentException e) {
- if (!e.toString().matches(".*No enum.*MyEnum.DOESNOTEXIST")) throw e;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/xstream/ImmutableListConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/xstream/ImmutableListConverterTest.java b/core/src/test/java/brooklyn/util/xstream/ImmutableListConverterTest.java
deleted file mode 100644
index f8d8855..0000000
--- a/core/src/test/java/brooklyn/util/xstream/ImmutableListConverterTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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 brooklyn.util.xstream;
-
-import java.net.UnknownHostException;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import com.google.common.collect.ImmutableList;
-import com.thoughtworks.xstream.XStream;
-
-@Test
-public class ImmutableListConverterTest extends ConverterTestFixture {
-
- protected void registerConverters(XStream xstream) {
- super.registerConverters(xstream);
- xstream.aliasType("ImmutableList", ImmutableList.class);
- xstream.registerConverter(new ImmutableListConverter(xstream.getMapper()));
- }
-
- @Test
- public void testImmutableEmptyList() throws UnknownHostException {
- assertX(ImmutableList.of(), "<ImmutableList/>");
- }
-
- @Test
- public void testImmutableSingletonDoubleList() throws UnknownHostException {
- assertX(ImmutableList.of(1.2d), "<ImmutableList>\n <double>1.2</double>\n</ImmutableList>");
- }
-
- @Test
- public void testImmutableTwoValStringList() throws UnknownHostException {
- assertX(ImmutableList.of("a","b"), "<ImmutableList>\n <string>a</string>\n <string>b</string>\n</ImmutableList>");
- }
-
- @Test
- public void testImmutableEmptyListStaysImmutable() throws UnknownHostException {
- Object x = assertX(ImmutableList.of(), "<ImmutableList/>");
- Assert.assertTrue(x instanceof ImmutableList);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/xstream/InetAddressConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/xstream/InetAddressConverterTest.java b/core/src/test/java/brooklyn/util/xstream/InetAddressConverterTest.java
deleted file mode 100644
index 237c670..0000000
--- a/core/src/test/java/brooklyn/util/xstream/InetAddressConverterTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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 brooklyn.util.xstream;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-import org.testng.annotations.Test;
-
-import com.thoughtworks.xstream.XStream;
-
-@Test
-public class InetAddressConverterTest extends ConverterTestFixture {
-
- protected void registerConverters(XStream xstream) {
- super.registerConverters(xstream);
- xstream.registerConverter(new Inet4AddressConverter());
- }
-
- public void testFoo1234() throws UnknownHostException {
- assertX(InetAddress.getByAddress("foo", new byte[] { 1, 2, 3, 4 }),
- "<java.net.Inet4Address>foo/1.2.3.4</java.net.Inet4Address>");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/xstream/StringKeyMapConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/xstream/StringKeyMapConverterTest.java b/core/src/test/java/brooklyn/util/xstream/StringKeyMapConverterTest.java
deleted file mode 100644
index 7d30bc2..0000000
--- a/core/src/test/java/brooklyn/util/xstream/StringKeyMapConverterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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 brooklyn.util.xstream;
-
-import java.net.UnknownHostException;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.testng.annotations.Test;
-
-import brooklyn.util.collections.MutableMap;
-
-import com.google.common.collect.Maps;
-import com.thoughtworks.xstream.XStream;
-
-@SuppressWarnings({ "rawtypes", "unchecked" })
-@Test
-public class StringKeyMapConverterTest extends ConverterTestFixture {
-
- protected void registerConverters(XStream xstream) {
- super.registerConverters(xstream);
- xstream.alias("map", Map.class, LinkedHashMap.class);
- xstream.alias("MutableMap", MutableMap.class);
- xstream.registerConverter(new StringKeyMapConverter(xstream.getMapper()), /* priority */ 10);
- }
-
- @Test
- public void testSimple() throws UnknownHostException {
- Map m = Maps.newLinkedHashMap();
- m.put("a", "v");
- assertX(m, "<map>\n <a>v</a>\n</map>");
- }
-
- @Test
- public void testDouble() throws UnknownHostException {
- Map m = Maps.newLinkedHashMap();
- m.put("a", "v");
- m.put("x", 1.0d);
- assertX(m, "<map>\n <a>v</a>\n <x type=\"double\">1.0</x>\n</map>");
- }
-
- @Test
- public void testEmpty() throws UnknownHostException {
- Map m = Maps.newLinkedHashMap();
- assertX(m, "<map/>");
- }
-
- @Test
- public void testBigSpacedKeyInMutableMap() throws UnknownHostException {
- Map m = MutableMap.of("a b", "x");
- assertX(m, "<MutableMap>\n <entry key=\"a b\">x</entry>\n</MutableMap>");
- }
-
- @Test
- public void testWithNumericKey() throws UnknownHostException {
- Map m = Maps.newLinkedHashMap();
- m.put("123", "v");
- m.put("a", "v2");
- assertX(m, "<map>\n <entry key=\"123\">v</entry>\n <a>v2</a>\n</map>");
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/brooklyn/util/xstream/XmlUtilTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/xstream/XmlUtilTest.java b/core/src/test/java/brooklyn/util/xstream/XmlUtilTest.java
deleted file mode 100644
index a81e299..0000000
--- a/core/src/test/java/brooklyn/util/xstream/XmlUtilTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 brooklyn.util.xstream;
-
-import static org.testng.Assert.assertEquals;
-
-import org.testng.annotations.Test;
-
-
-public class XmlUtilTest {
-
- @Test
- public void testXpath() throws Exception {
- String xml = "<a><b>myb</b></a>";
- assertEquals(XmlUtil.xpath(xml, "/a/b[text()]"), "myb");
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java
index 90e039d..3229aac 100644
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java
@@ -39,12 +39,12 @@ import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
import org.apache.brooklyn.core.catalog.internal.CatalogXmlSerializer;
import org.apache.brooklyn.core.catalog.internal.CatalogClasspathDo.CatalogScanningModes;
import org.apache.brooklyn.core.management.internal.LocalManagementContext;
+import org.apache.brooklyn.core.util.BrooklynMavenArtifacts;
import org.apache.brooklyn.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.test.entity.TestApplication;
import org.apache.brooklyn.test.entity.TestEntity;
import brooklyn.entity.basic.Entities;
-import brooklyn.util.BrooklynMavenArtifacts;
import brooklyn.util.maven.MavenRetriever;
import com.google.common.collect.ImmutableList;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogLoadTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogLoadTest.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogLoadTest.java
index eea4933..fb28780 100644
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogLoadTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogLoadTest.java
@@ -28,8 +28,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
import org.apache.brooklyn.core.catalog.internal.CatalogDto;
import org.apache.brooklyn.core.catalog.internal.CatalogItemDtoAbstract;
import org.apache.brooklyn.core.catalog.internal.CatalogXmlSerializer;
-
-import brooklyn.util.ResourceUtils;
+import org.apache.brooklyn.core.util.ResourceUtils;
import com.google.common.base.Joiner;
import com.google.common.collect.Iterables;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java
index 2d5abad..0ccb709 100644
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java
@@ -34,11 +34,11 @@ import org.apache.brooklyn.core.catalog.CatalogPredicates;
import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
import org.apache.brooklyn.core.catalog.internal.MyCatalogItems.MySillyAppTemplate;
import org.apache.brooklyn.core.management.internal.LocalManagementContext;
+import org.apache.brooklyn.core.util.ResourceUtils;
import brooklyn.config.BrooklynProperties;
import brooklyn.config.BrooklynServerConfig;
import brooklyn.entity.basic.Entities;
-import brooklyn.util.ResourceUtils;
import brooklyn.util.net.Urls;
import brooklyn.util.text.Strings;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/management/entitlement/AcmeEntitlementManagerTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/management/entitlement/AcmeEntitlementManagerTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/management/entitlement/AcmeEntitlementManagerTestFixture.java
index 5689da2..24b1a1d 100644
--- a/core/src/test/java/org/apache/brooklyn/core/management/entitlement/AcmeEntitlementManagerTestFixture.java
+++ b/core/src/test/java/org/apache/brooklyn/core/management/entitlement/AcmeEntitlementManagerTestFixture.java
@@ -30,6 +30,7 @@ import org.apache.brooklyn.core.management.entitlement.NotEntitledException;
import org.apache.brooklyn.core.management.entitlement.WebEntitlementContext;
import org.apache.brooklyn.core.management.entitlement.Entitlements.EntityAndItem;
import org.apache.brooklyn.core.management.entitlement.Entitlements.StringAndArgument;
+import org.apache.brooklyn.core.util.config.ConfigBag;
import org.apache.brooklyn.test.entity.LocalManagementContextForTests;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
@@ -42,7 +43,6 @@ import brooklyn.config.BrooklynProperties;
import brooklyn.entity.basic.ApplicationBuilder;
import brooklyn.entity.basic.BasicApplication;
import brooklyn.entity.basic.Entities;
-import brooklyn.util.config.ConfigBag;
import brooklyn.util.exceptions.Exceptions;
public abstract class AcmeEntitlementManagerTestFixture {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/management/entitlement/EntityEntitlementTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/management/entitlement/EntityEntitlementTest.java b/core/src/test/java/org/apache/brooklyn/core/management/entitlement/EntityEntitlementTest.java
index bb25740..7181c99 100644
--- a/core/src/test/java/org/apache/brooklyn/core/management/entitlement/EntityEntitlementTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/management/entitlement/EntityEntitlementTest.java
@@ -27,6 +27,7 @@ import org.apache.brooklyn.core.management.entitlement.NotEntitledException;
import org.apache.brooklyn.core.management.entitlement.Entitlements.EntityAndItem;
import org.apache.brooklyn.core.management.entitlement.Entitlements.StringAndArgument;
import org.apache.brooklyn.core.management.internal.LocalManagementContext;
+import org.apache.brooklyn.core.util.config.ConfigBag;
import org.apache.brooklyn.test.entity.LocalManagementContextForTests;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,6 @@ import brooklyn.config.BrooklynProperties;
import brooklyn.entity.basic.ApplicationBuilder;
import brooklyn.entity.basic.BasicApplication;
import brooklyn.entity.basic.Entities;
-import brooklyn.util.config.ConfigBag;
import brooklyn.util.exceptions.Exceptions;
public class EntityEntitlementTest {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/management/internal/EntityExecutionManagerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/management/internal/EntityExecutionManagerTest.java b/core/src/test/java/org/apache/brooklyn/core/management/internal/EntityExecutionManagerTest.java
index 7f35bba..721057d 100644
--- a/core/src/test/java/org/apache/brooklyn/core/management/internal/EntityExecutionManagerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/management/internal/EntityExecutionManagerTest.java
@@ -37,6 +37,10 @@ import org.apache.brooklyn.api.management.Task;
import org.apache.brooklyn.core.management.internal.BrooklynGarbageCollector;
import org.apache.brooklyn.core.management.internal.LocalManagementContext;
import org.apache.brooklyn.core.management.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.util.task.BasicExecutionManager;
+import org.apache.brooklyn.core.util.task.ExecutionListener;
+import org.apache.brooklyn.core.util.task.TaskBuilder;
+import org.apache.brooklyn.core.util.task.Tasks;
import org.apache.brooklyn.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.test.entity.TestApplication;
import org.apache.brooklyn.test.entity.TestEntity;
@@ -58,10 +62,6 @@ import brooklyn.test.Asserts;
import brooklyn.util.collections.MutableMap;
import brooklyn.util.javalang.JavaClassNames;
import brooklyn.util.repeat.Repeater;
-import brooklyn.util.task.BasicExecutionManager;
-import brooklyn.util.task.ExecutionListener;
-import brooklyn.util.task.TaskBuilder;
-import brooklyn.util.task.Tasks;
import brooklyn.util.time.Duration;
import brooklyn.util.time.Time;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiStandaloneTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiStandaloneTest.java b/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiStandaloneTest.java
index 7f1cc48..7180b1b 100644
--- a/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiStandaloneTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiStandaloneTest.java
@@ -27,6 +27,9 @@ import java.util.List;
import java.util.jar.JarInputStream;
import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.core.util.ResourceUtils;
+import org.apache.brooklyn.core.util.osgi.Osgis;
+import org.apache.brooklyn.core.util.osgi.Osgis.ManifestHelper;
import org.apache.brooklyn.test.TestResourceUnavailableException;
import brooklyn.util.exceptions.Exceptions;
@@ -43,14 +46,11 @@ import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import brooklyn.util.ResourceUtils;
import brooklyn.util.collections.MutableSet;
import brooklyn.util.maven.MavenArtifact;
import brooklyn.util.maven.MavenRetriever;
import brooklyn.util.net.Urls;
import brooklyn.util.os.Os;
-import brooklyn.util.osgi.Osgis;
-import brooklyn.util.osgi.Osgis.ManifestHelper;
import brooklyn.util.stream.Streams;
/**
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiVersionMoreEntityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiVersionMoreEntityTest.java b/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiVersionMoreEntityTest.java
index 7220e47..edc73d6 100644
--- a/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiVersionMoreEntityTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/management/osgi/OsgiVersionMoreEntityTest.java
@@ -45,6 +45,7 @@ import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils;
import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
import org.apache.brooklyn.core.management.internal.LocalManagementContext;
import org.apache.brooklyn.core.management.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.util.osgi.Osgis;
import brooklyn.entity.basic.Entities;
import brooklyn.entity.effector.Effectors;
@@ -57,7 +58,6 @@ import org.apache.brooklyn.test.entity.TestApplication;
import brooklyn.util.guava.Maybe;
import brooklyn.util.os.Os;
-import brooklyn.util.osgi.Osgis;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/util/BrooklynMavenArtifactsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/util/BrooklynMavenArtifactsTest.java b/core/src/test/java/org/apache/brooklyn/core/util/BrooklynMavenArtifactsTest.java
new file mode 100644
index 0000000..a86d1e0
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/util/BrooklynMavenArtifactsTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.util;
+
+import org.apache.brooklyn.core.util.BrooklynMavenArtifacts;
+import org.apache.brooklyn.core.util.ResourceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import brooklyn.test.Asserts;
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.maven.MavenArtifact;
+import brooklyn.util.maven.MavenRetriever;
+import brooklyn.util.stream.Streams;
+import brooklyn.util.text.Strings;
+import brooklyn.util.time.Duration;
+import brooklyn.util.time.Time;
+
+@Test
+public class BrooklynMavenArtifactsTest {
+
+ private static final Logger log = LoggerFactory.getLogger(BrooklynMavenArtifactsTest.class);
+
+ @Test(groups="Integration")
+ public void testUtilsCommon() {
+ ResourceUtils.create(this).checkUrlExists(BrooklynMavenArtifacts.localUrlForJar("brooklyn-utils-common"));
+ }
+
+ @Test(groups="Integration")
+ public void testExampleWar() {
+ String url = BrooklynMavenArtifacts.localUrl("example", "brooklyn-example-hello-world-sql-webapp", "war");
+ ResourceUtils.create(this).checkUrlExists(url);
+ log.info("found example war at: "+url);
+ }
+
+ @Test(groups="Integration")
+ // runs without internet but doesn't assert what it should, and can take a long time, so integration
+ public void testBadExampleWar() {
+ String url = BrooklynMavenArtifacts.localUrl("example", "brooklyn-example-GOODBYE-world-sql-webapp", "war");
+ Assert.assertFalse(ResourceUtils.create(this).doesUrlExist(url), "should not exist: "+url);
+ }
+
+ public void testHostedIsHttp() {
+ String common = BrooklynMavenArtifacts.hostedUrlForJar("brooklyn-utils-common");
+ log.info("online should be at: "+common);
+ Assert.assertTrue(common.startsWith("http"));
+ }
+
+ @Test(groups="Integration")
+ public void testHistoricHosted() {
+ // NB: this should be a version known to be up at sonatype or maven central, NOT necessarily the current version!
+ String snapshot = MavenRetriever.hostedUrl(MavenArtifact.fromCoordinate("org.apache.brooklyn:brooklyn-utils-common:jar:0.7.0-SNAPSHOT"));
+ log.info("Sample snapshot URL is: "+snapshot);
+ checkValidArchive(snapshot);
+ ResourceUtils.create(this).checkUrlExists(snapshot);
+
+ // NB: this should be a version known to be up at sonatype or maven central, NOT necessarily the current version!
+ String release = MavenRetriever.hostedUrl(MavenArtifact.fromCoordinate("io.brooklyn:brooklyn-utils-common:jar:0.6.0"));
+ log.info("Sample release URL is: "+release);
+ checkValidArchive(release);
+ }
+
+ private void checkValidArchive(final String url) {
+ // Note have seen response code 500 from repository.apache.org, for
+ // https://repository.apache.org/service/local/artifact/maven/redirect?r=snapshots&v=0.7.0-SNAPSHOT&g=org.apache.brooklyn&a=brooklyn-utils-common&e=jar
+ // Therefore willing to retry, rather than failing immediately.
+ Asserts.succeedsEventually(new Runnable() {
+ @Override public void run() {
+ try {
+ byte[] bytes = Streams.readFully(ResourceUtils.create(this).getResourceFromUrl(url));
+ // confirm this follow redirects!
+ Assert.assertTrue(bytes.length > 100*1000, "download of "+url+" is suspect ("+Strings.makeSizeString(bytes.length)+")");
+ // (could also check it is a zip etc)
+ } catch (Exception e) {
+ throw Exceptions.propagate(e);
+ }
+ }});
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/util/ResourceUtilsHttpTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/util/ResourceUtilsHttpTest.java b/core/src/test/java/org/apache/brooklyn/core/util/ResourceUtilsHttpTest.java
new file mode 100644
index 0000000..6ea434d
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/util/ResourceUtilsHttpTest.java
@@ -0,0 +1,197 @@
+/*
+ * 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.util;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.brooklyn.core.util.ResourceUtils;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.localserver.RequestBasicAuth;
+import org.apache.http.localserver.ResponseBasicUnauthorized;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpRequestHandler;
+import org.apache.http.protocol.ResponseServer;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import brooklyn.test.TestHttpRequestHandler;
+import brooklyn.test.TestHttpServer;
+import brooklyn.util.stream.Streams;
+import brooklyn.util.text.Strings;
+
+public class ResourceUtilsHttpTest {
+ private ResourceUtils utils;
+ private TestHttpServer server;
+ private String baseUrl;
+
+ @BeforeClass(alwaysRun=true)
+ public void setUp() throws Exception {
+ utils = ResourceUtils.create(this, "mycontext");
+ server = new TestHttpServer()
+ .interceptor(new ResponseServer())
+ .interceptor(new ResponseBasicUnauthorized())
+ .interceptor(new RequestBasicAuth())
+ .handler("/simple", new TestHttpRequestHandler().response("OK"))
+ .handler("/empty", new TestHttpRequestHandler().code(HttpStatus.SC_NO_CONTENT))
+ .handler("/missing", new TestHttpRequestHandler().code(HttpStatus.SC_NOT_FOUND).response("Missing"))
+ .handler("/redirect", new TestHttpRequestHandler().code(HttpStatus.SC_MOVED_TEMPORARILY).response("Redirect").header("Location", "/simple"))
+ .handler("/cycle", new TestHttpRequestHandler().code(HttpStatus.SC_MOVED_TEMPORARILY).response("Redirect").header("Location", "/cycle"))
+ .handler("/secure", new TestHttpRequestHandler().code(HttpStatus.SC_MOVED_TEMPORARILY).response("Redirect").header("Location", "https://0.0.0.0/"))
+ .handler("/auth", new AuthHandler("test", "test", "OK"))
+ .handler("/auth_escape", new AuthHandler("test@me:/", "test", "OK"))
+ .handler("/auth_escape2", new AuthHandler("test@me:test", "", "OK"))
+ .handler("/no_credentials", new CheckNoCredentials())
+ .start();
+ baseUrl = server.getUrl();
+ }
+
+ @AfterClass(alwaysRun=true)
+ public void tearDown() throws Exception {
+ server.stop();
+ }
+
+ @Test
+ public void testGet() throws Exception {
+ InputStream stream = utils.getResourceFromUrl(baseUrl + "/simple");
+ assertEquals(Streams.readFullyString(stream), "OK");
+ }
+
+ @Test
+ public void testGetEmpty() throws Exception {
+ InputStream stream = utils.getResourceFromUrl(baseUrl + "/empty");
+ assertEquals(Streams.readFullyString(stream), "");
+ }
+
+ @Test
+ public void testGetProtected() throws Exception {
+ String url = baseUrl.replace("http://", "http://test:test@") + "/auth";
+ InputStream stream = utils.getResourceFromUrl(url);
+ assertEquals(Streams.readFullyString(stream), "OK");
+ }
+
+ @Test
+ public void testGetProtectedEscape() throws Exception {
+ String url = baseUrl.replace("http://", "http://test%40me%3A%2F:test@") + "/auth_escape";
+ InputStream stream = utils.getResourceFromUrl(url);
+ assertEquals(Streams.readFullyString(stream), "OK");
+ }
+
+ @Test
+ public void testGetProtectedEscape2() throws Exception {
+ String url = baseUrl.replace("http://", "http://test%40me%3Atest@") + "/auth_escape2";
+ InputStream stream = utils.getResourceFromUrl(url);
+ assertEquals(Streams.readFullyString(stream), "OK");
+ }
+
+ @Test(expectedExceptions = RuntimeException.class)
+ public void testProtectedFailsWithoutCredentials() throws Exception {
+ utils.getResourceFromUrl(baseUrl + "/auth");
+ }
+
+ @Test
+ public void testInvalidCredentialsNotPassed() throws Exception {
+ String url = baseUrl + "/no_credentials?no:auth@needed";
+ InputStream stream = utils.getResourceFromUrl(url);
+ assertEquals(Streams.readFullyString(stream), "OK");
+ }
+
+ @Test
+ public void testRedirect() throws Exception {
+ InputStream stream = utils.getResourceFromUrl(baseUrl + "/redirect");
+ assertEquals(Streams.readFullyString(stream), "OK");
+ }
+
+ @Test(expectedExceptions = RuntimeException.class)
+ public void testCycleRedirect() throws Exception {
+ InputStream stream = utils.getResourceFromUrl(baseUrl + "/cycle");
+ assertEquals(Streams.readFullyString(stream), "OK");
+ }
+
+ @Test(expectedExceptions = RuntimeException.class)
+ public void testGetMissing() throws Exception {
+ utils.getResourceFromUrl(baseUrl + "/missing");
+ }
+
+ @Test(expectedExceptions = RuntimeException.class)
+ public void testFollowsProtoChange() throws Exception {
+ utils.getResourceFromUrl(baseUrl + "/secure");
+ }
+
+ // See https://github.com/brooklyncentral/brooklyn/issues/1338
+ @Test(groups={"Integration"})
+ public void testResourceFromUrlFollowsRedirect() throws Exception {
+ String contents = new ResourceUtils(this).getResourceAsString("http://bit.ly/brooklyn-visitors-creation-script");
+ assertFalse(contents.contains("bit.ly"), "contents="+contents);
+ }
+
+ private static class AuthHandler implements HttpRequestHandler {
+ private String username;
+ private String password;
+ private String responseBody;
+
+ public AuthHandler(String username, String password, String response) {
+ this.username = username;
+ this.password = password;
+ this.responseBody = response;
+ }
+
+ @Override
+ public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
+ String creds = (String) context.getAttribute("creds");
+ if (creds == null || !creds.equals(getExpectedCredentials())) {
+ response.setStatusCode(HttpStatus.SC_UNAUTHORIZED);
+ } else {
+ response.setEntity(new StringEntity(responseBody));
+ }
+ }
+
+ private String getExpectedCredentials() {
+ if (Strings.isEmpty(password)) {
+ return username;
+ } else {
+ return username + ":" + password;
+ }
+ }
+
+ }
+
+ private static class CheckNoCredentials implements HttpRequestHandler {
+
+ @Override
+ public void handle(HttpRequest request, HttpResponse response,
+ HttpContext context) throws HttpException, IOException {
+ String creds = (String) context.getAttribute("creds");
+ if (creds == null) {
+ response.setEntity(new StringEntity("OK"));
+ } else {
+ response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
+ }
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/util/ResourceUtilsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/util/ResourceUtilsTest.java b/core/src/test/java/org/apache/brooklyn/core/util/ResourceUtilsTest.java
new file mode 100644
index 0000000..10cf455
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/util/ResourceUtilsTest.java
@@ -0,0 +1,190 @@
+/*
+ * 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.util;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Properties;
+
+import org.apache.brooklyn.core.util.ResourceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import brooklyn.util.net.Urls;
+import brooklyn.util.os.Os;
+import brooklyn.util.stream.Streams;
+import brooklyn.util.text.Identifiers;
+
+import com.google.common.base.Charsets;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.io.Files;
+
+public class ResourceUtilsTest {
+
+ private static final Logger log = LoggerFactory.getLogger(ResourceUtilsTest.class);
+
+ private String tempFileContents = "abc";
+ private ResourceUtils utils;
+ private File tempFile;
+
+ @BeforeClass(alwaysRun=true)
+ public void setUp() throws Exception {
+ utils = ResourceUtils.create(this, "mycontext");
+ tempFile = Os.writeToTempFile(new ByteArrayInputStream(tempFileContents.getBytes()), "resourceutils-test", ".txt");
+ }
+
+ @AfterClass(alwaysRun=true)
+ public void tearDown() throws Exception {
+ if (tempFile != null) tempFile.delete();
+ }
+
+ @Test
+ public void testWriteStreamToTempFile() throws Exception {
+ File tempFileLocal = Os.writeToTempFile(new ByteArrayInputStream("mycontents".getBytes()), "resourceutils-test", ".txt");
+ try {
+ List<String> lines = Files.readLines(tempFileLocal, Charsets.UTF_8);
+ assertEquals(lines, ImmutableList.of("mycontents"));
+ } finally {
+ tempFileLocal.delete();
+ }
+ }
+
+ @Test
+ public void testPropertiesStreamToTempFile() throws Exception {
+ Properties props = new Properties();
+ props.setProperty("mykey", "myval");
+ File tempFileLocal = Os.writePropertiesToTempFile(props, "resourceutils-test", ".txt");
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(tempFileLocal);
+ Properties props2 = new Properties();
+ props2.load(fis);
+ assertEquals(props2.getProperty("mykey"), "myval");
+ } finally {
+ Streams.closeQuietly(fis);
+ tempFileLocal.delete();
+ }
+ }
+
+ @Test
+ public void testGetResourceViaClasspathWithPrefix() throws Exception {
+ InputStream stream = utils.getResourceFromUrl("classpath://brooklyn/config/sample.properties");
+ assertNotNull(stream);
+ }
+
+ @Test
+ public void testGetResourceViaClasspathWithoutPrefix() throws Exception {
+ InputStream stream = utils.getResourceFromUrl("/brooklyn/config/sample.properties");
+ assertNotNull(stream);
+ }
+
+ @Test
+ public void testGetResourceViaFileWithPrefix() throws Exception {
+ // The correct format for file URLs is file:///<absolute path>.
+ // On UNIX file:///tmp.
+ // On Windows both file:/C:/temp and file:///C:/temp are supported by Java,
+ // while Windows itself supports the latter only.
+ // Note that file://C:/temp is *wrong*, because C: is interpreted as the host
+ InputStream stream = utils.getResourceFromUrl(tempFile.toURI().toURL().toString());
+ assertEquals(Streams.readFullyString(stream), tempFileContents);
+ }
+
+ @Test
+ public void testGetResourceViaFileWithoutPrefix() throws Exception {
+ InputStream stream = utils.getResourceFromUrl(tempFile.getAbsolutePath());
+ assertEquals(Streams.readFullyString(stream), tempFileContents);
+ }
+
+ @Test
+ public void testClassLoaderDir() throws Exception {
+ String d = utils.getClassLoaderDir();
+ log.info("Found resource "+this+" in: "+d);
+ assertTrue(new File(d, "brooklyn/util/").exists());
+ }
+
+ @Test
+ public void testClassLoaderDirFromJar() throws Exception {
+ String d = utils.getClassLoaderDir("java/lang/Object.class");
+ log.info("Found Object in: "+d);
+ assertTrue(d.toLowerCase().endsWith(".jar"));
+ }
+
+ @Test
+ public void testClassLoaderDirFromJarWithSlash() throws Exception {
+ String d = utils.getClassLoaderDir("/java/lang/Object.class");
+ log.info("Found Object in: "+d);
+ assertTrue(d.toLowerCase().endsWith(".jar"));
+ }
+
+ @Test(expectedExceptions={NoSuchElementException.class})
+ public void testClassLoaderDirNotFound() throws Exception {
+ String d = utils.getClassLoaderDir("/somewhere/not/found/XXX.xxx");
+ // above should fail
+ log.warn("Uh oh found imaginary resource in: "+d);
+ }
+
+ @Test(groups="Integration")
+ public void testGetResourceViaSftp() throws Exception {
+ InputStream stream = utils.getResourceFromUrl("sftp://localhost:"+tempFile.getAbsolutePath());
+ assertEquals(Streams.readFullyString(stream), tempFileContents);
+ }
+
+ @Test(groups="Integration")
+ public void testGetResourceViaSftpWithUsername() throws Exception {
+ String user = System.getProperty("user.name");
+ InputStream stream = utils.getResourceFromUrl("sftp://"+user+"@localhost:"+tempFile.getAbsolutePath());
+ assertEquals(Streams.readFullyString(stream), tempFileContents);
+ }
+
+ @Test
+ public void testDataUrl() throws Exception {
+ assertEquals(utils.getResourceAsString("data:,hello"), "hello");
+ assertEquals(utils.getResourceAsString("data:,hello%20world"), "hello world");
+ // above is correct. below are not valid ... but we accept them anyway
+ assertEquals(utils.getResourceAsString("data:hello"), "hello");
+ assertEquals(utils.getResourceAsString("data://hello"), "hello");
+ assertEquals(utils.getResourceAsString("data:hello world"), "hello world");
+ assertEquals(utils.getResourceAsString(Urls.asDataUrlBase64("hello world")), "hello world");
+
+ String longString = Identifiers.makeRandomId(256);
+ for (int a=32; a<128; a++) longString += (char)a;
+ assertEquals(utils.getResourceAsString(Urls.asDataUrlBase64(longString)), longString);
+ }
+
+ @Test
+ public void testGetResources() {
+ Iterable<URL> manifests = ResourceUtils.create().getResources("META-INF/MANIFEST.MF");
+ assertFalse(Iterables.isEmpty(manifests));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/util/config/ConfigBagTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/util/config/ConfigBagTest.java b/core/src/test/java/org/apache/brooklyn/core/util/config/ConfigBagTest.java
new file mode 100644
index 0000000..f4db6c2
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/util/config/ConfigBagTest.java
@@ -0,0 +1,193 @@
+/*
+ * 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.util.config;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.brooklyn.core.util.config.ConfigBag;
+import org.apache.brooklyn.core.util.config.ConfigBagTest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.basic.ConfigKeys;
+import brooklyn.util.collections.MutableList;
+import brooklyn.util.collections.MutableMap;
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.time.Duration;
+
+public class ConfigBagTest {
+
+ @SuppressWarnings("unused")
+ private static final Logger log = LoggerFactory.getLogger(ConfigBagTest.class);
+
+ private static final ConfigKey<String> K1 = ConfigKeys.newStringConfigKey("k1");
+ private static final ConfigKey<String> K2 = ConfigKeys.newStringConfigKey("k2");
+ private static final ConfigKey<String> K3 = ConfigKeys.newStringConfigKey("k3");
+
+ @Test
+ public void testPutAndGet() {
+ ConfigBag bag = ConfigBag.newInstance();
+ bag.put(K1, "v1");
+ assertEquals(bag.get(K1), "v1");
+ }
+
+ @Test
+ public void testPutStringAndGet() {
+ ConfigBag bag = ConfigBag.newInstance();
+ bag.putAsStringKey(K1.getName(), "v1");
+ assertEquals(bag.get(K1), "v1");
+ }
+
+ @Test
+ public void testUnused() {
+ ConfigBag bag = ConfigBag.newInstance();
+ bag.put(K1, "v1");
+ bag.put(K2, "v2a");
+ assertEquals(bag.get(K1), "v1");
+ assertEquals(bag.getUnusedConfig().size(), 1);
+ assertEquals(bag.peek(K2), "v2a");
+ assertEquals(bag.getUnusedConfig().size(), 1);
+ assertEquals(bag.get(K2), "v2a");
+ Assert.assertTrue(bag.getUnusedConfig().isEmpty());
+ }
+
+ @Test
+ public void testOrder() {
+ ConfigBag bag = ConfigBag.newInstance();
+ bag.put(K1, "v1");
+ bag.put(K2, "v2");
+ bag.put(K3, "v3");
+ Assert.assertEquals(MutableList.copyOf(bag.getAllConfig().keySet()), MutableList.of(K1.getName(), K2.getName(), K3.getName()));
+ Assert.assertEquals(MutableList.copyOf(bag.getAllConfig().values()), MutableList.of("v1", "v2", "v3"));
+ }
+
+ @Test
+ public void testCopyOverwriteAndGet() {
+ ConfigBag bag1 = ConfigBag.newInstance();
+ bag1.put(K1, "v1");
+ bag1.put(K2, "v2a");
+ bag1.put(K3, "v3");
+ assertEquals(bag1.get(K1), "v1");
+
+ ConfigBag bag2 = ConfigBag.newInstanceCopying(bag1).putAll(MutableMap.of(K2, "v2b"));
+ assertEquals(bag1.getUnusedConfig().size(), 2);
+ assertEquals(bag2.getUnusedConfig().size(), 2);
+
+ assertEquals(bag2.get(K1), "v1");
+ assertEquals(bag1.get(K2), "v2a");
+ assertEquals(bag1.getUnusedConfig().size(), 1);
+ assertEquals(bag2.getUnusedConfig().size(), 2);
+
+ assertEquals(bag2.get(K2), "v2b");
+ assertEquals(bag2.getUnusedConfig().size(), 1);
+
+ assertEquals(bag2.get(K3), "v3");
+ assertEquals(bag2.getUnusedConfig().size(), 0);
+ assertEquals(bag1.getUnusedConfig().size(), 1);
+ }
+
+ @Test
+ public void testCopyExtendingAndGet() {
+ ConfigBag bag1 = ConfigBag.newInstance();
+ bag1.put(K1, "v1");
+ bag1.put(K2, "v2a");
+ bag1.put(K3, "v3");
+ assertEquals(bag1.get(K1), "v1");
+
+ ConfigBag bag2 = ConfigBag.newInstanceExtending(bag1, null).putAll(MutableMap.of(K2, "v2b"));
+ assertEquals(bag1.getUnusedConfig().size(), 2);
+ assertEquals(bag2.getUnusedConfig().size(), 2, "unused are: "+bag2.getUnusedConfig());
+
+ assertEquals(bag2.get(K1), "v1");
+ assertEquals(bag1.get(K2), "v2a");
+ assertEquals(bag1.getUnusedConfig().size(), 1);
+ assertEquals(bag2.getUnusedConfig().size(), 2);
+
+ assertEquals(bag2.get(K2), "v2b");
+ assertEquals(bag2.getUnusedConfig().size(), 1);
+
+ assertEquals(bag2.get(K3), "v3");
+ assertEquals(bag2.getUnusedConfig().size(), 0);
+ // when extended, the difference is that parent is also marked
+ assertEquals(bag1.getUnusedConfig().size(), 0);
+ }
+
+ @Test
+ public void testConcurrent() throws InterruptedException {
+ ConfigBag bag = ConfigBag.newInstance();
+ bag.put(K1, "v1");
+ bag.put(K2, "v2");
+ bag.put(K3, "v3");
+ runConcurrentTest(bag, 10, Duration.millis(50));
+ }
+
+ @Test(groups="Integration")
+ public void testConcurrentBig() throws InterruptedException {
+ ConfigBag bag = ConfigBag.newInstance();
+ bag.put(K1, "v1");
+ bag.put(K2, "v2");
+ bag.put(K3, "v3");
+ runConcurrentTest(bag, 20, Duration.seconds(5));
+ }
+
+ private void runConcurrentTest(final ConfigBag bag, int numThreads, Duration time) throws InterruptedException {
+ List<Thread> threads = MutableList.of();
+ final Map<Thread,Exception> exceptions = new ConcurrentHashMap<Thread,Exception>();
+ final AtomicInteger successes = new AtomicInteger();
+ for (int i=0; i<numThreads; i++) {
+ Thread t = new Thread() {
+ @Override
+ public void run() {
+ try {
+ while (!interrupted()) {
+ if (Math.random()<0.9)
+ bag.put(ConfigKeys.newStringConfigKey("k"+((int)(10*Math.random()))), "v"+((int)(10*Math.random())));
+ if (Math.random()<0.8)
+ bag.get(ConfigKeys.newStringConfigKey("k"+((int)(10*Math.random()))));
+ if (Math.random()<0.2)
+ bag.copy(bag);
+ if (Math.random()<0.6)
+ bag.remove(ConfigKeys.newStringConfigKey("k"+((int)(10*Math.random()))));
+ successes.incrementAndGet();
+ }
+ } catch (Exception e) {
+ exceptions.put(Thread.currentThread(), e);
+ Exceptions.propagateIfFatal(e);
+ }
+ }
+ };
+ t.setName("ConfigBagTest-concurrent-thread-"+i);
+ threads.add(t);
+ }
+ for (Thread t: threads) t.start();
+ time.countdownTimer().waitForExpiry();
+ for (Thread t: threads) t.interrupt();
+ for (Thread t: threads) t.join();
+ Assert.assertTrue(exceptions.isEmpty(), "Got "+exceptions.size()+"/"+numThreads+" exceptions ("+successes.get()+" successful): "+exceptions);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a4c0e5fd/core/src/test/java/org/apache/brooklyn/core/util/crypto/SecureKeysAndSignerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/util/crypto/SecureKeysAndSignerTest.java b/core/src/test/java/org/apache/brooklyn/core/util/crypto/SecureKeysAndSignerTest.java
new file mode 100644
index 0000000..d681b0f
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/util/crypto/SecureKeysAndSignerTest.java
@@ -0,0 +1,169 @@
+/*
+ * 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.util.crypto;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.charset.Charset;
+import java.security.KeyPair;
+import java.security.PublicKey;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+import org.apache.brooklyn.core.util.ResourceUtils;
+import org.apache.brooklyn.core.util.crypto.FluentKeySigner;
+import org.apache.brooklyn.core.util.crypto.SecureKeys;
+import org.apache.brooklyn.core.util.crypto.SecureKeys.PassphraseProblem;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import brooklyn.util.crypto.AuthorizedKeysParser;
+import brooklyn.util.os.Os;
+
+import com.google.common.io.Files;
+
+public class SecureKeysAndSignerTest {
+
+ // a bit slow, so marked as integration (but possibly due to leftover rebind-cleanup, benign failures writing to /tmp/xx)
+ @Test(groups="Integration")
+ public void testGenerateSignedKeys() throws Exception {
+ FluentKeySigner signer = new FluentKeySigner("the-root").
+ validForYears(2).
+ selfsign();
+ X509Certificate signerCert = signer.getAuthorityCertificate();
+
+ KeyPair aKey = SecureKeys.newKeyPair();
+ X509Certificate aCert = signer.newCertificateFor("A", aKey);
+
+ KeyPair bKey = SecureKeys.newKeyPair();
+ X509Certificate bCert = signer.newCertificateFor("B", bKey);
+
+ FluentKeySigner selfSigner1 = new FluentKeySigner("self1").selfsign();
+ X509Certificate selfCert1 = selfSigner1.getAuthorityCertificate();
+
+ SecureKeys.getTrustManager(aCert).checkClientTrusted(new X509Certificate[] { aCert }, "RSA");
+ SecureKeys.getTrustManager(signerCert).checkClientTrusted(new X509Certificate[] { signerCert }, "RSA");
+
+ try {
+ SecureKeys.getTrustManager(aCert).checkClientTrusted(new X509Certificate[] { bCert }, "RSA");
+ Assert.fail("Trust manager for A should not accept B");
+ } catch (CertificateException e) { /* expected */ }
+
+// SecureKeys.getTrustManager(signerCert).checkClientTrusted(new X509Certificate[] { aCert }, "RSA");
+ // NB, the above failes; we have to convert to a canonical implementation, handled by the following
+
+ Assert.assertTrue(SecureKeys.isCertificateAuthorizedBy(signerCert, signerCert));
+ Assert.assertTrue(SecureKeys.isCertificateAuthorizedBy(aCert, signerCert));
+ Assert.assertTrue(SecureKeys.isCertificateAuthorizedBy(bCert, signerCert));
+ Assert.assertFalse(SecureKeys.isCertificateAuthorizedBy(signerCert, aCert));
+ Assert.assertFalse(SecureKeys.isCertificateAuthorizedBy(bCert, aCert));
+
+ Assert.assertTrue(SecureKeys.isCertificateAuthorizedBy(selfCert1, selfCert1));
+ Assert.assertFalse(SecureKeys.isCertificateAuthorizedBy(selfCert1, signerCert));
+ }
+
+ @Test
+ public void testInjectCertificateAuthority() throws Exception {
+ KeyPair caKey = SecureKeys.newKeyPair();
+ X509Certificate caCert = new FluentKeySigner("the-root", caKey).selfsign().getAuthorityCertificate();
+
+ FluentKeySigner signer = new FluentKeySigner(caCert, caKey);
+ Assert.assertEquals("the-root", signer.getCommonName());
+
+ KeyPair aKey = SecureKeys.newKeyPair();
+ X509Certificate aCert = signer.newCertificateFor("A", aKey);
+
+ Assert.assertTrue(SecureKeys.isCertificateAuthorizedBy(aCert, caCert));
+ }
+
+ @Test
+ public void testReadRsaKey() throws Exception {
+ KeyPair key = SecureKeys.readPem(ResourceUtils.create(this).getResourceFromUrl("classpath://brooklyn/util/crypto/sample_rsa.pem"), null);
+ checkNonTrivial(key);
+ }
+
+ @Test(expectedExceptions=IllegalStateException.class)
+ public void testReadRsaPublicKeyAsPemFails() throws Exception {
+ // should fail; see next test
+ SecureKeys.readPem(ResourceUtils.create(this).getResourceFromUrl("classpath://brooklyn/util/crypto/sample_rsa.pem.pub"), null);
+ }
+
+ @Test
+ public void testReadRsaPublicKeyAsAuthKeysWorks() throws Exception {
+ PublicKey key = AuthorizedKeysParser.decodePublicKey(
+ ResourceUtils.create(this).getResourceAsString("classpath://brooklyn/util/crypto/sample_rsa.pem.pub"));
+ KeyPair fromPem = SecureKeys.readPem(ResourceUtils.create(this).getResourceFromUrl("classpath://brooklyn/util/crypto/sample_rsa.pem"), null);
+ Assert.assertEquals(key, fromPem.getPublic());
+ }
+
+ @Test
+ public void testEncodeDecodeRsaPublicKey() throws Exception {
+ String data = ResourceUtils.create(this).getResourceAsString("classpath://brooklyn/util/crypto/sample_rsa.pem.pub");
+ PublicKey key = AuthorizedKeysParser.decodePublicKey(data);
+ String data2 = AuthorizedKeysParser.encodePublicKey(key);
+ Assert.assertTrue(data.contains(data2), "Expected to find '"+data2+"' in '"+data+"'");
+ PublicKey key2 = AuthorizedKeysParser.decodePublicKey(data2);
+ Assert.assertEquals(key2, key);
+ }
+
+ @Test
+ public void testEncodeDecodeDsaPublicKey() throws Exception {
+ String data = ResourceUtils.create(this).getResourceAsString("classpath://brooklyn/util/crypto/sample_dsa.pem.pub");
+ PublicKey key = AuthorizedKeysParser.decodePublicKey(data);
+ String data2 = AuthorizedKeysParser.encodePublicKey(key);
+ Assert.assertTrue(data.contains(data2), "Expected to find '"+data2+"' in '"+data+"'");
+ PublicKey key2 = AuthorizedKeysParser.decodePublicKey(data2);
+ Assert.assertEquals(key2, key);
+ }
+
+ @Test
+ public void testReadDsaKey() throws Exception {
+ KeyPair key = SecureKeys.readPem(ResourceUtils.create(this).getResourceFromUrl("classpath://brooklyn/util/crypto/sample_dsa.pem"), null);
+ checkNonTrivial(key);
+ }
+
+ @Test(expectedExceptions=Exception.class)
+ public void testCantReadRsaPassphraseKeyWithoutPassphrase() throws Exception {
+ KeyPair key = SecureKeys.readPem(ResourceUtils.create(this).getResourceFromUrl("classpath://brooklyn/util/crypto/sample_rsa_passphrase.pem"), null);
+ checkNonTrivial(key);
+ }
+
+ @Test(expectedExceptions=PassphraseProblem.class)
+ public void testReadRsaPassphraseWithoutKeyFails() throws Exception {
+ SecureKeys.readPem(ResourceUtils.create(this).getResourceFromUrl("classpath://brooklyn/util/crypto/sample_rsa_passphrase.pem"), null);
+ }
+
+ @Test
+ public void testReadRsaPassphraseKeyAndWriteWithoutPassphrase() throws Exception {
+ KeyPair key = SecureKeys.readPem(ResourceUtils.create(this).getResourceFromUrl("classpath://brooklyn/util/crypto/sample_rsa_passphrase.pem"), "passphrase");
+ checkNonTrivial(key);
+ File f = Os.newTempFile(getClass(), "brooklyn-sample_rsa_passphrase_without_passphrase.pem");
+ Files.write(SecureKeys.stringPem(key), f, Charset.defaultCharset());
+ KeyPair key2 = SecureKeys.readPem(new FileInputStream(f), null);
+ checkNonTrivial(key2);
+ Assert.assertEquals(key2.getPrivate().getEncoded(), key.getPrivate().getEncoded());
+ Assert.assertEquals(key2.getPublic().getEncoded(), key.getPublic().getEncoded());
+ }
+
+ private void checkNonTrivial(KeyPair key) {
+ Assert.assertNotEquals(key.getPrivate().getEncoded().length, 0);
+ Assert.assertNotEquals(key.getPublic().getEncoded().length, 0);
+ }
+
+}