You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2016/11/16 22:33:08 UTC
[4/7] brooklyn-server git commit: Clean up
BrooklynJacksonSerializerIntegrationTest and mark test as Broken
Clean up BrooklynJacksonSerializerIntegrationTest and mark test as Broken
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/819f7252
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/819f7252
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/819f7252
Branch: refs/heads/master
Commit: 819f7252ffbb394036da169fe48aac8205ae7fc5
Parents: 113f53b
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Mon Nov 14 13:54:29 2016 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Mon Nov 14 13:54:29 2016 +0200
----------------------------------------------------------------------
...rooklynJacksonSerializerIntegrationTest.java | 223 ++++++++++---------
1 file changed, 120 insertions(+), 103 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/819f7252/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerIntegrationTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerIntegrationTest.java
index 1cf79e8..2bb3203 100644
--- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerIntegrationTest.java
+++ b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerIntegrationTest.java
@@ -27,11 +27,14 @@ import javax.ws.rs.core.MediaType;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.core.test.entity.TestEntity;
import org.apache.brooklyn.rest.BrooklynRestApiLauncher;
import org.apache.brooklyn.rest.util.json.BrooklynJacksonSerializerTest.SelfRefNonSerializableClass;
+import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.http.HttpTool;
import org.apache.http.client.HttpClient;
import org.apache.http.client.utils.URIBuilder;
@@ -40,15 +43,49 @@ import org.eclipse.jetty.server.Server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.gson.Gson;
-public class BrooklynJacksonSerializerIntegrationTest {
+public class BrooklynJacksonSerializerIntegrationTest extends BrooklynAppUnitTestSupport {
private static final Logger log = LoggerFactory.getLogger(BrooklynJacksonSerializerIntegrationTest.class);
+ private Server server;
+ private HttpClient client;
+ URI entityUrl;
+ URI configUri;
+
+ @BeforeMethod(alwaysRun = true)
+ public void setUp() throws Exception {
+ super.setUp();
+ server = BrooklynRestApiLauncher.launcher().managementContext(mgmt).start();
+ client = HttpTool.httpClientBuilder().build();
+
+ String serverAddress = "http://localhost:"+((NetworkConnector)server.getConnectors()[0]).getLocalPort();
+ String appUrl = serverAddress + "/v1/applications/" + app.getId();
+ entityUrl = URI.create(appUrl + "/entities/" + app.getId());
+ configUri = new URIBuilder(entityUrl + "/config/" + TestEntity.CONF_OBJECT.getName())
+ .addParameter("raw", "true")
+ .build();
+
+ }
+
+ @AfterMethod(alwaysRun = true)
+ @Override
+ public void tearDown() throws Exception {
+ try {
+ if (server != null) server.stop();
+ } catch (Exception e) {
+ Exceptions.propagateIfFatal(e);
+ log.warn("failed to stop server: "+e);
+ }
+ super.tearDown();
+ }
+
// Ensure TEXT_PLAIN just returns toString for ManagementContext instance.
// Strangely, testWithLauncherSerializingListsContainingEntitiesAndOtherComplexStuff ended up in the
// EntityConfigResource.getPlain code, throwing a ClassCastException.
@@ -57,117 +94,97 @@ public class BrooklynJacksonSerializerIntegrationTest {
// testWithLauncherSerializingListsContainingEntitiesAndOtherComplexStuff was calling it.
@Test(groups="Integration") //because of time
public void testWithAcceptsPlainText() throws Exception {
- ManagementContext mgmt = LocalManagementContextForTests.newInstance();
- Server server = null;
- try {
- server = BrooklynRestApiLauncher.launcher().managementContext(mgmt).start();
- HttpClient client = HttpTool.httpClientBuilder().build();
-
- TestApplication app = TestApplication.Factory.newManagedInstanceForTests(mgmt);
-
- String serverAddress = "http://localhost:"+((NetworkConnector)server.getConnectors()[0]).getLocalPort();
- String appUrl = serverAddress + "/v1/applications/" + app.getId();
- String entityUrl = appUrl + "/entities/" + app.getId();
- URI configUri = new URIBuilder(entityUrl + "/config/" + TestEntity.CONF_OBJECT.getName())
- .addParameter("raw", "true")
- .build();
-
- // assert config here is just mgmt.toString()
- app.config().set(TestEntity.CONF_OBJECT, mgmt);
- String content = get(client, configUri, ImmutableMap.of("Accept", MediaType.TEXT_PLAIN));
- log.info("CONFIG MGMT is:\n"+content);
- Assert.assertEquals(content, mgmt.toString(), "content="+content);
-
- } finally {
- try {
- if (server != null) server.stop();
- } catch (Exception e) {
- log.warn("failed to stop server: "+e);
- }
- Entities.destroyAll(mgmt);
- }
+ // assert config here is just mgmt.toString()
+ setConfig(mgmt);
+ String content = getConfigValueAsText();
+ log.info("CONFIG MGMT is:\n"+content);
+ Assert.assertEquals(content, mgmt.toString(), "content="+content);
}
-
+
@Test(groups="Integration") //because of time
- public void testWithLauncherSerializingListsContainingEntitiesAndOtherComplexStuff() throws Exception {
- ManagementContext mgmt = LocalManagementContextForTests.newInstance();
- Server server = null;
- try {
- server = BrooklynRestApiLauncher.launcher().managementContext(mgmt).start();
- HttpClient client = HttpTool.httpClientBuilder().build();
-
- TestApplication app = TestApplication.Factory.newManagedInstanceForTests(mgmt);
-
- String serverAddress = "http://localhost:"+((NetworkConnector)server.getConnectors()[0]).getLocalPort();
- String appUrl = serverAddress + "/v1/applications/" + app.getId();
- String entityUrl = appUrl + "/entities/" + app.getId();
- URI configUri = new URIBuilder(entityUrl + "/config/" + TestEntity.CONF_OBJECT.getName())
- .addParameter("raw", "true")
- .build();
-
- // assert config here is just mgmt
- app.config().set(TestEntity.CONF_OBJECT, mgmt);
- String content = get(client, configUri, ImmutableMap.of("Accept", MediaType.APPLICATION_JSON));
- log.info("CONFIG MGMT is:\n"+content);
- @SuppressWarnings("rawtypes")
- Map values = new Gson().fromJson(content, Map.class);
- Assert.assertEquals(values, ImmutableMap.of("type", LocalManagementContextForTests.class.getCanonicalName()), "values="+values);
-
- // assert normal API returns the same, containing links
- content = get(client, entityUrl, ImmutableMap.of("Accept", MediaType.APPLICATION_JSON));
- log.info("ENTITY is: \n"+content);
- values = new Gson().fromJson(content, Map.class);
- Assert.assertTrue(values.size()>=3, "Map is too small: "+values);
- Assert.assertTrue(values.size()<=6, "Map is too big: "+values);
- Assert.assertEquals(values.get("type"), TestApplication.class.getCanonicalName(), "values="+values);
- Assert.assertNotNull(values.get("links"), "Map should have contained links: values="+values);
-
- // but config etc returns our nicely json serialized
- app.config().set(TestEntity.CONF_OBJECT, app);
- content = get(client, configUri, ImmutableMap.of("Accept", MediaType.APPLICATION_JSON));
- log.info("CONFIG ENTITY is:\n"+content);
- values = new Gson().fromJson(content, Map.class);
- Assert.assertEquals(values, ImmutableMap.of("type", Entity.class.getCanonicalName(), "id", app.getId()), "values="+values);
-
- // and self-ref gives error + toString
- SelfRefNonSerializableClass angry = new SelfRefNonSerializableClass();
- app.config().set(TestEntity.CONF_OBJECT, angry);
- content = get(client, configUri, ImmutableMap.of("Accept", MediaType.APPLICATION_JSON));
- log.info("CONFIG ANGRY is:\n"+content);
- assertErrorObjectMatchingToString(content, angry);
-
- // as does Server
- app.config().set(TestEntity.CONF_OBJECT, server);
- content = get(client, configUri, ImmutableMap.of("Accept", MediaType.APPLICATION_JSON));
- // NOTE, if using the default visibility / object mapper, the getters of the object are invoked
- // resulting in an object which is huge, 7+MB -- and it wreaks havoc w eclipse console regex parsing!
- // (but with our custom VisibilityChecker server just gives us the nicer error!)
- log.info("CONFIG SERVER is:\n"+content);
- assertErrorObjectMatchingToString(content, server);
- Assert.assertTrue(content.contains(NotSerializableException.class.getCanonicalName()), "server should have contained things which are not serializable");
- Assert.assertTrue(content.length() < 1024, "content should not have been very long; instead was: "+content.length());
-
- } finally {
- try {
- if (server != null) server.stop();
- } catch (Exception e) {
- log.warn("failed to stop server: "+e);
- }
- Entities.destroyAll(mgmt);
- }
+ public void testWithMgmt() throws Exception {
+ setConfig(mgmt);
+ Map<?, ?> values = getConfigValueAsJson();
+ Assert.assertEquals(values, ImmutableMap.of("type", LocalManagementContextForTests.class.getCanonicalName()), "values="+values);
+
+ // assert normal API returns the same, containing links
+ values = getRestValueAsJson(entityUrl);
+ Assert.assertTrue(values.size()>=3, "Map is too small: "+values);
+ Assert.assertTrue(values.size()<=6, "Map is too big: "+values);
+ Assert.assertEquals(values.get("type"), TestApplication.class.getCanonicalName(), "values="+values);
+ Assert.assertNotNull(values.get("links"), "Map should have contained links: values="+values);
+
+ }
+
+ @Test(groups="Integration") //because of time
+ public void testWithApp() throws Exception {
+ // but config etc returns our nicely json serialized
+ setConfig(app);
+ Map<?, ?> values = getConfigValueAsJson();
+ Assert.assertEquals(values, ImmutableMap.of("type", Entity.class.getCanonicalName(), "id", app.getId()), "values="+values);
}
- private void assertErrorObjectMatchingToString(String content, Object expected) {
- Object value = new Gson().fromJson(content, Object.class);
- Assert.assertTrue(value instanceof Map, "Expected map, got: "+value);
- Assert.assertEquals(((Map<?,?>)value).get("toString"), expected.toString());
+ @Test(groups="Integration") //because of time
+ public void testWithCyclic() throws Exception {
+ // and self-ref gives error + toString
+ SelfRefNonSerializableClass angry = new SelfRefNonSerializableClass();
+ setConfig(angry);
+ Map<?, ?> values = getConfigValueAsJson();
+ assertErrorObjectMatchingToString(values, angry);
+
}
- private String get(HttpClient client, String uri, Map<String, String> headers) {
- return get(client, URI.create(uri), headers);
+ // Broken. Serialization is failing because of "group" -> "threads" -> "group" cycle inside server (through the thread pool).
+ // It's doing best effort though - still serializing what it was able to before giving up. This results in a huge string
+ // which fails the assertions.
+ @Test(groups={"Integration", "Broken"}) //because of time
+ public void testWithServer() throws Exception {
+ // as does Server
+ setConfig(server);
+ Map<?, ?> values = getConfigValueAsJson();
+ // NOTE, if using the default visibility / object mapper, the getters of the object are invoked
+ // resulting in an object which is huge, 7+MB -- and it wreaks havoc w eclipse console regex parsing!
+ // (but with our custom VisibilityChecker server just gives us the nicer error!)
+ String content = getRestValue(configUri, MediaType.APPLICATION_JSON);
+ log.info("CONFIG is:\n"+content);
+ values = new Gson().fromJson(content, Map.class);
+ assertErrorObjectMatchingToString(values, server);
+ Assert.assertTrue(content.contains(NotSerializableException.class.getCanonicalName()), "server should have contained things which are not serializable");
+ Assert.assertTrue(content.length() < 1024, "content should not have been very long; instead was: "+content.length());
+ }
+
+ private void assertErrorObjectMatchingToString(Map<?, ?> content, Object expected) {
+ Assert.assertEquals(content.get("toString"), expected.toString());
}
private String get(HttpClient client, URI uri, Map<String, String> headers) {
return HttpTool.httpGet(client, uri, headers).getContentAsString();
}
+
+ protected String getConfigValueAsText() {
+ return getRestValueAsText(configUri);
+ }
+
+ protected String getRestValueAsText(URI url) {
+ return getRestValue(url, MediaType.TEXT_PLAIN);
+ }
+
+ protected Map<?, ?> getConfigValueAsJson() {
+ return getRestValueAsJson(configUri);
+ }
+
+ protected Map<?, ?> getRestValueAsJson(URI url) {
+ String content = getRestValue(url, MediaType.APPLICATION_JSON);
+ log.info("CONFIG is:\n"+content);
+ return new Gson().fromJson(content, Map.class);
+ }
+
+ protected String getRestValue(URI url, String contentType) {
+ return get(client, url, ImmutableMap.of("Accept", contentType));
+ }
+
+ protected void setConfig(Object value) {
+ app.config().set(TestEntity.CONF_OBJECT, value);
+ }
+
}