You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2015/11/10 18:03:40 UTC

[1/2] incubator-brooklyn git commit: expand assertions and http assertions for string containment, updating rest tests

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 6a8e89f4d -> 015b5cdf5


expand assertions and http assertions for string containment, updating rest tests


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/036ba79a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/036ba79a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/036ba79a

Branch: refs/heads/master
Commit: 036ba79ae3c63c5fa078f73cc1b77cbb854e7631
Parents: 74f7295
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Nov 10 14:09:38 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Nov 10 14:30:29 2015 +0000

----------------------------------------------------------------------
 .../ApplicationResourceIntegrationTest.java     |  15 +--
 .../rest/client/BrooklynApiRestClientTest.java  |  37 +++---
 .../rest/resources/LocationResource.java        |   7 +-
 .../rest/BrooklynRestApiLauncherTest.java       |  15 ++-
 .../rest/resources/ApplicationResourceTest.java |  10 +-
 .../rest/resources/EntityResourceTest.java      |   8 +-
 .../rest/resources/SensorResourceTest.java      |   4 +-
 .../rest/resources/ServerShutdownTest.java      |   4 +-
 .../org/apache/brooklyn/test/HttpTestUtils.java |   7 +-
 .../java/org/apache/brooklyn/test/Asserts.java  | 133 +++++++++++++++++++
 .../apache/brooklyn/util/http/HttpAsserts.java  |  46 +++++--
 .../org/apache/brooklyn/test/AssertsTest.java   |  74 +++++++++++
 12 files changed, 293 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/ApplicationResourceIntegrationTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/ApplicationResourceIntegrationTest.java b/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/ApplicationResourceIntegrationTest.java
index 3679975..4db359b 100644
--- a/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/ApplicationResourceIntegrationTest.java
+++ b/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/ApplicationResourceIntegrationTest.java
@@ -22,18 +22,10 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.net.URL;
 import java.util.Collection;
 
 import javax.ws.rs.core.Response;
 
-import org.eclipse.jetty.server.Server;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.entity.StartableApplication;
@@ -49,6 +41,13 @@ import org.apache.brooklyn.rest.domain.EntitySummary;
 import org.apache.brooklyn.rest.domain.SensorSummary;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.time.Duration;
+import org.eclipse.jetty.server.Server;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableMap;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java b/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java
index 993673c..fa738d8 100644
--- a/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java
+++ b/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java
@@ -18,20 +18,11 @@
  */
 package org.apache.brooklyn.rest.client;
 
-import java.net.URL;
 import java.util.List;
 import java.util.Map;
 
 import javax.ws.rs.core.Response;
 
-import org.apache.brooklyn.test.HttpTestUtils;
-import org.eclipse.jetty.server.Server;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.entity.Entities;
@@ -44,7 +35,15 @@ import org.apache.brooklyn.rest.BrooklynRestApiLauncherTest;
 import org.apache.brooklyn.rest.domain.ApplicationSummary;
 import org.apache.brooklyn.rest.domain.CatalogLocationSummary;
 import org.apache.brooklyn.rest.security.provider.TestSecurityProvider;
+import org.apache.brooklyn.test.Asserts;
+import org.apache.brooklyn.util.http.HttpAsserts;
 import org.eclipse.jetty.server.NetworkConnector;
+import org.eclipse.jetty.server.Server;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
 
 @Test
 public class BrooklynApiRestClientTest {
@@ -107,29 +106,29 @@ public class BrooklynApiRestClientTest {
     public void testApplicationApiCreate() throws Exception {
         Response r1 = api.getApplicationApi().createFromYaml("name: test-1234\n"
             + "services: [ { type: "+TestEntity.class.getName()+" } ]");
-        HttpTestUtils.assertHealthyStatusCode(r1.getStatus());
+        HttpAsserts.assertHealthyStatusCode(r1.getStatus());
         log.info("creation result: "+r1.getEntity());
         List<ApplicationSummary> apps = api.getApplicationApi().list(null);
         log.info("apps with test: "+apps);
-        Assert.assertTrue(apps.toString().contains("test-1234"), "should have had test-1234 as an app; instead: "+apps);
+        Asserts.assertStringContains(apps.toString(), "test-1234");
     }
     
     public void testApplicationApiHandledError() throws Exception {
         Response r1 = api.getApplicationApi().createFromYaml("name: test");
-        Assert.assertTrue(r1.getStatus()/100 != 2, "needed an unhealthy status, not "+r1.getStatus());
-        Object entity = r1.getEntity();
-        Assert.assertTrue(entity.toString().indexOf("Unrecognized application blueprint format: no services defined")>=0,
-            "Missing expected text in response: "+entity.toString());
+        HttpAsserts.assertNotHealthyStatusCode(r1.getStatus());
+        // new-style messages first, old-style messages after (during switch to TypePlanTransformer)
+        Asserts.assertStringContainsAtLeastOne(r1.getEntity().toString().toLowerCase(), 
+            "invalid plan", "no services");
+        Asserts.assertStringContainsAtLeastOne(r1.getEntity().toString().toLowerCase(), 
+            "format could not be recognized", "Unrecognized application blueprint format");
     }
 
     public void testApplicationApiThrownError() throws Exception {
         try {
             ApplicationSummary summary = api.getApplicationApi().get("test-5678");
-            Assert.fail("Should have thrown, not given: "+summary);
+            Asserts.shouldHaveFailedPreviously("got "+summary);
         } catch (Exception e) {
-            e.printStackTrace();
-            Assert.assertTrue(e.toString().toLowerCase().contains("not found"),
-                "Missing expected text in response: "+e.toString());
+            Asserts.expectedFailureContainsIgnoreCase(e, "404", "not found");
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
index 9f865b3..5922ebd 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
@@ -27,15 +27,10 @@ import java.util.Set;
 
 import javax.ws.rs.core.Response;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationDefinition;
 import org.apache.brooklyn.api.typereg.RegisteredType;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.location.LocationConfigKeys;
-import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
 import org.apache.brooklyn.rest.api.LocationApi;
 import org.apache.brooklyn.rest.domain.LocationSpec;
 import org.apache.brooklyn.rest.domain.LocationSummary;
@@ -48,6 +43,8 @@ import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.text.NaturalOrderComparator;
 import org.apache.brooklyn.util.text.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java
index 50c7cb4..03f808d 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java
@@ -24,14 +24,15 @@ import static org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.WEB_XML
 
 import java.util.concurrent.Callable;
 
+import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider;
+import org.apache.brooklyn.rest.util.BrooklynRestResourceUtilsTest.SampleNoOpApplication;
 import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.test.HttpTestUtils;
+import org.apache.brooklyn.util.http.HttpAsserts;
+import org.apache.brooklyn.util.http.HttpTool;
 import org.apache.http.HttpStatus;
+import org.eclipse.jetty.server.NetworkConnector;
 import org.eclipse.jetty.server.Server;
 import org.testng.annotations.Test;
-import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider;
-import org.apache.brooklyn.rest.util.BrooklynRestResourceUtilsTest.SampleNoOpApplication;
-import org.eclipse.jetty.server.NetworkConnector;
 
 public class BrooklynRestApiLauncherTest extends BrooklynRestApiLauncherTestFixture {
 
@@ -61,7 +62,7 @@ public class BrooklynRestApiLauncherTest extends BrooklynRestApiLauncherTestFixt
         int code = Asserts.succeedsEventually(new Callable<Integer>() {
             @Override
             public Integer call() throws Exception {
-                int code = HttpTestUtils.getHttpStatusCode(rootUrl+"/v1/catalog/applications");
+                int code = HttpTool.getHttpStatusCode(rootUrl+"/v1/catalog/applications");
                 if (code == HttpStatus.SC_FORBIDDEN) {
                     throw new RuntimeException("Retry request");
                 } else {
@@ -69,8 +70,8 @@ public class BrooklynRestApiLauncherTest extends BrooklynRestApiLauncherTestFixt
                 }
             }
         });
-        HttpTestUtils.assertHealthyStatusCode(code);
-        HttpTestUtils.assertContentContainsText(rootUrl+"/v1/catalog/applications", SampleNoOpApplication.class.getSimpleName());
+        HttpAsserts.assertHealthyStatusCode(code);
+        HttpAsserts.assertContentContainsText(rootUrl+"/v1/catalog/applications", SampleNoOpApplication.class.getSimpleName());
     }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
index 020fe19..738770d 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
@@ -67,9 +67,9 @@ import org.apache.brooklyn.rest.testing.mocks.RestMockApp;
 import org.apache.brooklyn.rest.testing.mocks.RestMockAppBuilder;
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.test.HttpTestUtils;
 import org.apache.brooklyn.util.collections.CollectionFunctionals;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.http.HttpAsserts;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.http.HttpHeaders;
 import org.apache.http.entity.ContentType;
@@ -158,7 +158,7 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
     public void testDeployApplication() throws Exception {
         ClientResponse response = clientDeploy(simpleSpec);
 
-        HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+        HttpAsserts.assertHealthyStatusCode(response.getStatus());
         assertEquals(getManagementContext().getApplications().size(), 1);
         assertRegexMatches(response.getLocation().getPath(), "/v1/applications/.*");
         // Object taskO = response.getEntity(Object.class);
@@ -619,7 +619,7 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
             ClientResponse response = client().resource("/v1/applications")
                     .entity(yaml, "application/x-yaml")
                     .post(ClientResponse.class);
-            assertTrue(response.getStatus()/100 == 2, "response is "+response);
+            HttpAsserts.assertHealthyStatusCode(response.getStatus());
             waitForPageFoundResponse("/v1/applications/my-app", ApplicationSummary.class);
     
             // Deprecate
@@ -630,7 +630,7 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
             ClientResponse response2 = client().resource("/v1/applications")
                     .entity(yaml2, "application/x-yaml")
                     .post(ClientResponse.class);
-            assertTrue(response2.getStatus()/100 == 2, "response is "+response2);
+            HttpAsserts.assertHealthyStatusCode(response2.getStatus());
             waitForPageFoundResponse("/v1/applications/my-app2", ApplicationSummary.class);
     
             // Disable
@@ -641,7 +641,7 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
             ClientResponse response3 = client().resource("/v1/applications")
                     .entity(yaml3, "application/x-yaml")
                     .post(ClientResponse.class);
-            assertTrue(response3.getStatus()/100 == 4, "response is "+response3);
+            HttpAsserts.assertClientErrorStatusCode(response3.getStatus());
             assertTrue(response3.getEntity(String.class).contains("cannot be matched"));
             waitForPageNotFoundResponse("/v1/applications/my-app3", ApplicationSummary.class);
             

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
index 10d391a..d6857fb 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
@@ -35,9 +35,9 @@ import org.apache.brooklyn.rest.domain.EntitySpec;
 import org.apache.brooklyn.rest.domain.TaskSummary;
 import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
-import org.apache.brooklyn.test.HttpTestUtils;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.http.HttpAsserts;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.type.TypeReference;
 import org.slf4j.Logger;
@@ -110,7 +110,7 @@ public class EntityResourceTest extends BrooklynRestResourceTest {
                 .queryParam("name", "New Name")
                 .post(ClientResponse.class);
 
-            HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+            HttpAsserts.assertHealthyStatusCode(response.getStatus());
             Assert.assertTrue(entity.getDisplayName().equals("New Name"));
         } finally {
             // restore it for other tests!
@@ -127,7 +127,7 @@ public class EntityResourceTest extends BrooklynRestResourceTest {
                 .entity("services: [ { type: "+TestEntity.class.getName()+" }]", "application/yaml")
                 .post(ClientResponse.class);
 
-            HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+            HttpAsserts.assertHealthyStatusCode(response.getStatus());
             Assert.assertEquals(entity.getChildren().size(), 1);
             Entity child = Iterables.getOnlyElement(entity.getChildren());
             Assert.assertTrue(Entities.isManaged(child));
@@ -152,7 +152,7 @@ public class EntityResourceTest extends BrooklynRestResourceTest {
                 .get(ClientResponse.class);
         String raw = response.getEntity(String.class);
         log.info("TAGS raw: "+raw);
-        HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+        HttpAsserts.assertHealthyStatusCode(response.getStatus());
         
         Assert.assertTrue(raw.contains(entity.getParent().getId()), "unexpected app tag, does not include ID: "+raw);
         

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
index b3d49e5..4d2f781 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
@@ -36,8 +36,8 @@ import org.apache.brooklyn.rest.domain.EntitySpec;
 import org.apache.brooklyn.rest.test.config.render.TestRendererHints;
 import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
-import org.apache.brooklyn.test.HttpTestUtils;
 import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.http.HttpAsserts;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.StringFunctions;
 import org.testng.annotations.AfterClass;
@@ -156,7 +156,7 @@ public class SensorResourceTest extends BrooklynRestResourceTest {
             response = req.get(ClientResponse.class);
         }
         if (expectedValue!=null) {
-            HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+            HttpAsserts.assertHealthyStatusCode(response.getStatus());
             Object value = response.getEntity(expectedValue.getClass());
             assertEquals(value, expectedValue);
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java
index 6c8661f..dbe9afd 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java
@@ -31,6 +31,7 @@ import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.EntityManager;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.core.entity.Attributes;
+import org.apache.brooklyn.core.entity.EntityAsserts;
 import org.apache.brooklyn.core.entity.drivers.BasicEntityDriverManager;
 import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactory;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
@@ -39,7 +40,6 @@ import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.rest.resources.ServerResourceTest.StopLatchEntity;
 import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
 import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.test.EntityTestUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -116,7 +116,7 @@ public class ServerShutdownTest extends BrooklynRestResourceTest {
         EntitySpec<StopLatchEntity> latchEntitySpec = EntitySpec.create(StopLatchEntity.class);
         final StopLatchEntity entity = app.createAndManageChild(latchEntitySpec);
         app.start(ImmutableSet.of(app.newLocalhostProvisioningLocation()));
-        EntityTestUtils.assertAttributeEquals(entity, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING);
+        EntityAsserts.assertAttributeEquals(entity, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING);
 
         try {
             final Task<Void> firstStop = app.invoke(Startable.STOP, ImmutableMap.<String, Object>of());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/usage/test-support/src/main/java/org/apache/brooklyn/test/HttpTestUtils.java
----------------------------------------------------------------------
diff --git a/usage/test-support/src/main/java/org/apache/brooklyn/test/HttpTestUtils.java b/usage/test-support/src/main/java/org/apache/brooklyn/test/HttpTestUtils.java
index 91a1f0e..ef19665 100644
--- a/usage/test-support/src/main/java/org/apache/brooklyn/test/HttpTestUtils.java
+++ b/usage/test-support/src/main/java/org/apache/brooklyn/test/HttpTestUtils.java
@@ -42,6 +42,7 @@ import javax.net.ssl.SSLSession;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.crypto.SslTrustUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.http.HttpTool;
 import org.apache.brooklyn.util.http.TrustingSslSocketFactory;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.time.Time;
@@ -59,14 +60,12 @@ import com.google.common.util.concurrent.ListeningExecutorService;
  * 
  * @author aled
  *
- * @deprecated since 0.9.0. Prefer org.apache.brooklyn.util.http.HttpAsserts which has no TestNG dependencies.
+ * @deprecated since 0.9.0. Prefer {@link org.apache.brooklyn.util.http.HttpAsserts} which has no TestNG dependencies
+ * (or {@link HttpTool} for some utility methods).
  */
 @Deprecated
 public class HttpTestUtils {
 
-    // TODO Delete methods from TestUtils, to just have them here (or switch so TestUtils delegates here,
-    // and deprecate methods in TestUtils until deleted).
-
     private static final Logger LOG = LoggerFactory.getLogger(HttpTestUtils.class);
 
     static final ExecutorService executor = Executors.newCachedThreadPool();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/utils/common/src/main/java/org/apache/brooklyn/test/Asserts.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/test/Asserts.java b/utils/common/src/main/java/org/apache/brooklyn/test/Asserts.java
index 678a181..668362a 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/test/Asserts.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/test/Asserts.java
@@ -33,8 +33,11 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
 
+import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.javalang.JavaClassNames;
+import org.apache.brooklyn.util.text.StringPredicates;
 import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1034,6 +1037,135 @@ public class Asserts {
         fail("Failed "+condition+": "+object);
     }
 
+    public static void assertStringContains(String input, String phrase1ToContain, String ...optionalOtherPhrasesToContain) {
+        if (input==null) fail("Input is null.");
+        if (phrase1ToContain!=null) {
+            assertThat(input, StringPredicates.containsLiteral(phrase1ToContain));
+        }
+        for (String otherPhrase: optionalOtherPhrasesToContain) {
+            if (otherPhrase!=null) {
+                assertThat(input, StringPredicates.containsLiteral(otherPhrase));
+            }
+        }
+    }
+    
+    public static void assertStringContainsAtLeastOne(String input, String possiblePhrase1ToContain, String ...optionalOtherPossiblePhrasesToContain) {
+        if (input==null) fail("Input is null.");
+        List<String> missing = MutableList.of();
+        if (possiblePhrase1ToContain!=null) {
+            if (input.contains(possiblePhrase1ToContain)) return;
+            missing.add(possiblePhrase1ToContain);
+        }
+        for (String otherPhrase: optionalOtherPossiblePhrasesToContain) {
+            if (otherPhrase!=null) {
+                if (input.contains(otherPhrase)) return;
+                missing.add(otherPhrase);
+            }
+        }
+        fail("Input did not contain any of the expected phrases "+missing+": "+input);
+    }
+    
+    public static void assertStringContainsIgnoreCase(String input, String phrase1ToContain, String ...optionalOtherPhrasesToContain) {
+        if (input==null) fail("Input is null.");
+        if (phrase1ToContain!=null) {
+            assertThat(input, StringPredicates.containsLiteralIgnoreCase(phrase1ToContain));
+        }
+        for (String otherPhrase: optionalOtherPhrasesToContain) {
+            if (otherPhrase!=null) {
+                assertThat(input, StringPredicates.containsLiteralIgnoreCase(otherPhrase));
+            }
+        }
+    }
+    
+    public static void assertStringMatchesRegex(String input, String regex1ToMatch, String ...optionalOtherRegexesToMatch) {
+        if (input==null) fail("Input is null.");
+        if (regex1ToMatch!=null) {
+            assertThat(input, StringPredicates.matchesRegex(regex1ToMatch));
+        }
+        for (String otherRegex: optionalOtherRegexesToMatch) {
+            if (otherRegex!=null) {
+                assertThat(input, StringPredicates.matchesRegex(otherRegex));
+            }
+        }
+    }
+
+    /** Subclass of {@link AssertionError} which indicates that code which should have thrown did not, 
+     * so that callers can disambiguate expected errors from this one.
+     * See {@link #shouldHaveFailedPreviously()} */
+    public static class ShouldHaveFailedPreviouslyAssertionError extends AssertionError {
+        private static final long serialVersionUID = 4359541529633617518L;
+        public ShouldHaveFailedPreviouslyAssertionError() { this("Should have failed previously."); }
+        public ShouldHaveFailedPreviouslyAssertionError(String message) { super(message); }
+    }
+    
+    /** Throws a {@link ShouldHaveFailedPreviouslyAssertionError} exception, 
+     * to more easily distinguish this failure from other fails.
+     * In particular, use one of the <code>expectedFailure</code> methods
+     * in the surrounding <code>catch</code> block and this error will pass through it. */
+    public static void shouldHaveFailedPreviously() {
+        throw new ShouldHaveFailedPreviouslyAssertionError();
+    }
+    /** As {@link #shouldHaveFailedPreviously()} but allowing detail,
+     * for example a value which was received when it shouldn't have been. */
+    public static void shouldHaveFailedPreviously(String message) {
+        throw new ShouldHaveFailedPreviouslyAssertionError(message);
+    }
+
+    /** Tests that an exception is not {@link ShouldHaveFailedPreviouslyAssertionError}.
+     * See {@link #shouldHaveFailedPreviously()} */
+    public static void expectedFailure(Throwable e) {
+        if (e instanceof ShouldHaveFailedPreviouslyAssertionError) throw (Error)e;
+    }
+    
+    /** Tests that an exception is not {@link ShouldHaveFailedPreviouslyAssertionError}
+     * and is one of the given types. 
+     * 
+     * @return If the test is satisfied, this method returns normally. 
+     * The caller can decide whether anything more should be done with the exception.
+     * If the test fails, then either it is propagated, 
+     * if the {@link Throwable} is a fatal ({@link Exceptions#propagateIfFatal(Throwable)}) other than an {@link AssertionError}, 
+     * or more usually the test failure of this method is thrown, 
+     * with detail of the original {@link Throwable} logged. */
+    public static void expectedFailureOfType(Throwable e, Class<?> ...permittedSupertypes) {
+        if (e instanceof ShouldHaveFailedPreviouslyAssertionError) throw (Error)e;
+        for (Class<?> t: permittedSupertypes) {
+            if (t.isInstance(e)) return;
+        }
+        rethrowPreferredException(e, 
+            new AssertionError("Error "+JavaClassNames.simpleClassName(e)+" is not any of the expected types: " + Arrays.asList(permittedSupertypes)));
+    }
+    
+    /** Tests {@link #expectedFailure(Throwable)} and that the <code>toString</code>
+     * satisfies {@link #assertStringContains(String, String, String...)}.
+     * @return as per {@link #expectedFailureOfType(Throwable, Class...)} */
+    public static void expectedFailureContains(Throwable e, String phrase1ToContain, String ...optionalOtherPhrasesToContain) {
+        if (e instanceof ShouldHaveFailedPreviouslyAssertionError) throw (Error)e;
+        try {
+            assertStringContains(e.toString(), phrase1ToContain, optionalOtherPhrasesToContain);
+        } catch (AssertionError ee) {
+            rethrowPreferredException(e, ee);
+        }
+    }
+
+    /** As {@link #expectedFailureContains(Throwable, String, String...)} but case insensitive */
+    public static void expectedFailureContainsIgnoreCase(Throwable e, String phrase1ToContain, String ...optionalOtherPhrasesToContain) {
+        if (e instanceof ShouldHaveFailedPreviouslyAssertionError) throw (Error)e;
+        try {
+            assertStringContainsIgnoreCase(e.toString(), phrase1ToContain, optionalOtherPhrasesToContain);
+        } catch (AssertionError ee) {
+            rethrowPreferredException(e, ee);
+        }
+    }
+
+    /** Implements the return beahvior for {@link #expectedFailureOfType(Throwable, Class...)} and others. */
+    private static void rethrowPreferredException(Throwable earlierPreferredIfFatalElseLogged, Throwable laterPreferredOtherwise) throws AssertionError {
+        if (!(earlierPreferredIfFatalElseLogged instanceof AssertionError)) {
+            Exceptions.propagateIfFatal(earlierPreferredIfFatalElseLogged);
+        }
+        log.warn("Detail of unexpected error: "+earlierPreferredIfFatalElseLogged, earlierPreferredIfFatalElseLogged);
+        throw Exceptions.propagate(laterPreferredOtherwise);
+    }
+
     @SuppressWarnings("rawtypes")
     private static boolean groovyTruth(Object o) {
         // TODO Doesn't handle matchers (see http://docs.codehaus.org/display/GROOVY/Groovy+Truth)
@@ -1102,4 +1234,5 @@ public class Asserts {
         if (t instanceof Error) throw (Error)t;
         throw new RuntimeException(t);
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/utils/common/src/main/java/org/apache/brooklyn/util/http/HttpAsserts.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/http/HttpAsserts.java b/utils/common/src/main/java/org/apache/brooklyn/util/http/HttpAsserts.java
index 3a8c9ca..a7c195f 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/http/HttpAsserts.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/http/HttpAsserts.java
@@ -40,21 +40,46 @@ import com.google.common.util.concurrent.ListeningExecutorService;
  */
 public class HttpAsserts {
 
-    // TODO Delete methods from TestUtils, to just have them here (or switch so TestUtils delegates here,
-    // and deprecate methods in TestUtils until deleted).
-
     private static final Logger LOG = LoggerFactory.getLogger(HttpAsserts.class);
 
-    /**
-     * Assert that a 'successful' (2xx) status code has been provided.
-     *
-     * @param code The status code.
-     */
+    /** @return whether the given HTTP status code is a "success" class code (2xx) */
+    public static boolean isHealthyStatusCode(int code) {
+        return code>=200 && code<=299;
+    }
+    
+    /** Asserts that the given HTTP status code indicates "success", i.e. {@link #isHealthyStatusCode(int)} is true */
     public static void assertHealthyStatusCode(int code) {
-        if (code>=200 && code<=299) return;
-        Asserts.fail("Wrong status code: " + code);
+        if (isHealthyStatusCode(code)) return;
+        Asserts.fail("Expected success status code, got: " + code);
+    }
+
+    /** Asserts that the given HTTP status code does not indicate "success", i.e. {@link #isHealthyStatusCode(int)} returns false */
+    public static void assertNotHealthyStatusCode(int code) {
+        if (!isHealthyStatusCode(code)) return;
+        Asserts.fail("Expected non-success status code, got: " + code);
+    }
+
+    /** @return whether the given HTTP status code is a "client error" class code (4xx) */
+    public static boolean isClientErrorStatusCode(int code) {
+        return code>=400 && code<=499;
+    }
+    
+    /** Asserts that the given HTTP status code indicates "client error", i.e. {@link #isClientErrorStatusCode(int)} is true */
+    public static void assertClientErrorStatusCode(int code) {
+        if (isClientErrorStatusCode(code)) return;
+        Asserts.fail("Expected client error status code, got: " + code);        
+    }
+
+    /** @return whether the given HTTP status code is a "server error" class code (5xx) */
+    public static boolean isServerErrorStatusCode(int code) {
+        return code>=500 && code<=599;
     }
     
+    /** Asserts that the given HTTP status code indicates "server error", i.e. {@link #isServerErrorStatusCode(int)} is true */
+    public static void assertServerErrorStatusCode(int code) {
+        if (isServerErrorStatusCode(code)) return;
+        Asserts.fail("Expected server error status code, got: " + code);        
+    }
 
     /**
      * Asserts that gets back any "valid" response - i.e. not an exception. This could be an unauthorized,
@@ -312,6 +337,5 @@ public class HttpAsserts {
             }
         });
     }
-    
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/036ba79a/utils/common/src/test/java/org/apache/brooklyn/test/AssertsTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/org/apache/brooklyn/test/AssertsTest.java b/utils/common/src/test/java/org/apache/brooklyn/test/AssertsTest.java
index d72be76..d770c43 100644
--- a/utils/common/src/test/java/org/apache/brooklyn/test/AssertsTest.java
+++ b/utils/common/src/test/java/org/apache/brooklyn/test/AssertsTest.java
@@ -18,12 +18,14 @@
  */
 package org.apache.brooklyn.test;
 
+import java.util.NoSuchElementException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.brooklyn.test.Asserts;
+import org.apache.brooklyn.test.Asserts.ShouldHaveFailedPreviouslyAssertionError;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.time.Duration;
@@ -92,4 +94,76 @@ public class AssertsTest {
             if (ise == null || !ise.toString().contains("Simulating failure")) throw e;
         }
     }
+    
+    @Test
+    public void testAssertStrings() {
+        Asserts.assertStringContains("hello", "hello", "he");
+        try {
+            Asserts.assertStringContains("hello", "goodbye");
+            Asserts.shouldHaveFailedPreviously();
+        } catch (AssertionError e) { 
+            Asserts.expectedFailureContains(e, "hello", "goodbye"); 
+            Asserts.expectedFailureContainsIgnoreCase(e, "hello", "Goodbye"); 
+        }
+        
+        Asserts.assertStringContainsIgnoreCase("hello", "Hello");
+        try {
+            Asserts.assertStringContains("hello", "Hello");
+            Asserts.shouldHaveFailedPreviously();
+        } catch (AssertionError e) { Asserts.expectedFailureContains(e, "hello", "Hello"); }
+        
+        Asserts.assertStringContainsAtLeastOne("hello", "hello", "goodbye");
+        try {
+            Asserts.assertStringContainsAtLeastOne("hello", "Hello", "goodbye");
+            Asserts.shouldHaveFailedPreviously();
+        } catch (AssertionError e) { Asserts.expectedFailureContains(e, "hello", "Hello", "goodbye"); }
+        
+        Asserts.assertStringMatchesRegex("hello", "hello", "he.*", "he[ckl]+e*o");
+        try {
+            Asserts.assertStringMatchesRegex("hello", "hello", "he");
+            Asserts.shouldHaveFailedPreviously();
+        } catch (AssertionError e) { Asserts.expectedFailureContains(e, "hello", "matchesRegex(he)"); }
+    }
+
+    @Test
+    public void testExpectedFailures() {
+        Asserts.expectedFailureOfType(new IllegalStateException(), 
+            NoSuchElementException.class, IllegalStateException.class);
+        Asserts.expectedFailureOfType(new IllegalStateException(), 
+            NoSuchElementException.class, Object.class);
+        
+        try {
+            Asserts.expectedFailureOfType(new IllegalStateException(), 
+                NoSuchElementException.class, Error.class);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Throwable e) { Asserts.expectedFailure(e); }
+    }
+    
+    @Test
+    public void testShouldHaveFailed() {
+        int reached = 0;
+        try {
+            try {
+                // in normal tests the following indicates that an expected failure didn't happen
+                // (but here we are testing it)
+                Asserts.shouldHaveFailedPreviously();
+                reached--;
+            } catch (Throwable e) { 
+                // in normal tests the following indicates that a failure was NOT thrown by the above
+                // (but here the call *below* should rethrow)
+                reached++;
+                Asserts.expectedFailure(e); 
+                reached--;
+            }
+            reached--;
+            throw new AssertionError("It should have failed previously, with a "
+                + "ShouldHaveFailedPreviouslyAssertionError in the first block rethrown by the second");
+        } catch (ShouldHaveFailedPreviouslyAssertionError e) {
+            // expected
+            reached++;
+        }
+        reached++;
+        // check code flowed the way we expected
+        Asserts.assertEquals(reached, 3);
+    }
 }



[2/2] incubator-brooklyn git commit: This closes #1016

Posted by he...@apache.org.
This closes #1016


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/015b5cdf
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/015b5cdf
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/015b5cdf

Branch: refs/heads/master
Commit: 015b5cdf5597205989c72d541e9157d779bfbf9f
Parents: 6a8e89f 036ba79
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Nov 10 17:03:27 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Nov 10 17:03:27 2015 +0000

----------------------------------------------------------------------
 .../ApplicationResourceIntegrationTest.java     |  15 +--
 .../rest/client/BrooklynApiRestClientTest.java  |  37 +++---
 .../rest/resources/LocationResource.java        |   7 +-
 .../rest/BrooklynRestApiLauncherTest.java       |  15 ++-
 .../rest/resources/ApplicationResourceTest.java |  10 +-
 .../rest/resources/EntityResourceTest.java      |   8 +-
 .../rest/resources/SensorResourceTest.java      |   4 +-
 .../rest/resources/ServerShutdownTest.java      |   4 +-
 .../org/apache/brooklyn/test/HttpTestUtils.java |   7 +-
 .../java/org/apache/brooklyn/test/Asserts.java  | 133 +++++++++++++++++++
 .../apache/brooklyn/util/http/HttpAsserts.java  |  46 +++++--
 .../org/apache/brooklyn/test/AssertsTest.java   |  74 +++++++++++
 12 files changed, 293 insertions(+), 67 deletions(-)
----------------------------------------------------------------------