http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java deleted file mode 100644 index 1c091da..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java +++ /dev/null @@ -1,189 +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 org.apache.brooklyn.rest.resources; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nullable; -import javax.ws.rs.core.MediaType; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.entity.EntityInternal; -import org.apache.brooklyn.core.test.entity.TestEntity; -import org.apache.brooklyn.entity.stock.BasicApplication; -import org.apache.brooklyn.rest.domain.ApplicationSpec; -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.util.collections.MutableList; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.http.HttpAsserts; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.sun.jersey.api.client.ClientResponse; - -@Test(singleThreaded = true) -public class EntityResourceTest extends BrooklynRestResourceTest { - - private static final Logger log = LoggerFactory.getLogger(EntityResourceTest.class); - - private final ApplicationSpec simpleSpec = ApplicationSpec.builder() - .name("simple-app") - .entities(ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))) - .locations(ImmutableSet.of("localhost")) - .build(); - - private EntityInternal entity; - - private static final String entityEndpoint = "/v1/applications/simple-app/entities/simple-ent"; - - @BeforeClass(alwaysRun = true) - @Override - public void setUp() throws Exception { - super.setUp(); - - // Deploy application - ClientResponse deploy = clientDeploy(simpleSpec); - waitForApplicationToBeRunning(deploy.getLocation()); - - // Add tag - entity = (EntityInternal) Iterables.find(getManagementContext().getEntityManager().getEntities(), new Predicate<Entity>() { - @Override - public boolean apply(@Nullable Entity input) { - return "RestMockSimpleEntity".equals(input.getEntityType().getSimpleName()); - } - }); - } - - @Test - public void testTagsSanity() throws Exception { - entity.tags().addTag("foo"); - - ClientResponse response = client().resource(entityEndpoint + "/tags") - .accept(MediaType.APPLICATION_JSON_TYPE) - .get(ClientResponse.class); - String data = response.getEntity(String.class); - - try { - List<Object> tags = new ObjectMapper().readValue(data, new TypeReference<List<Object>>() {}); - Assert.assertTrue(tags.contains("foo")); - Assert.assertFalse(tags.contains("bar")); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - throw new IllegalStateException("Error with deserialization of tags list: "+e+"\n"+data, e); - } - } - - @Test - public void testRename() throws Exception { - try { - ClientResponse response = client().resource(entityEndpoint + "/name") - .queryParam("name", "New Name") - .post(ClientResponse.class); - - HttpAsserts.assertHealthyStatusCode(response.getStatus()); - Assert.assertTrue(entity.getDisplayName().equals("New Name")); - } finally { - // restore it for other tests! - entity.setDisplayName("simple-ent"); - } - } - - @Test - public void testAddChild() throws Exception { - try { - // to test in GUI: - // services: [ { type: org.apache.brooklyn.entity.stock.BasicEntity }] - ClientResponse response = client().resource(entityEndpoint + "/children?timeout=10s") - .entity("services: [ { type: "+TestEntity.class.getName()+" }]", "application/yaml") - .post(ClientResponse.class); - - HttpAsserts.assertHealthyStatusCode(response.getStatus()); - Assert.assertEquals(entity.getChildren().size(), 1); - Entity child = Iterables.getOnlyElement(entity.getChildren()); - Assert.assertTrue(Entities.isManaged(child)); - - TaskSummary task = response.getEntity(TaskSummary.class); - Assert.assertEquals(task.getResult(), MutableList.of(child.getId())); - - } finally { - // restore it for other tests - Collection<Entity> children = entity.getChildren(); - if (!children.isEmpty()) Entities.unmanage(Iterables.getOnlyElement(children)); - } - } - - @Test - public void testTagsDoNotSerializeTooMuch() throws Exception { - entity.tags().addTag("foo"); - entity.tags().addTag(entity.getParent()); - - ClientResponse response = client().resource(entityEndpoint + "/tags") - .accept(MediaType.APPLICATION_JSON) - .get(ClientResponse.class); - String raw = response.getEntity(String.class); - log.info("TAGS raw: "+raw); - HttpAsserts.assertHealthyStatusCode(response.getStatus()); - - Assert.assertTrue(raw.contains(entity.getParent().getId()), "unexpected app tag, does not include ID: "+raw); - - Assert.assertTrue(raw.length() < 1000, "unexpected app tag, includes too much mgmt info (len "+raw.length()+"): "+raw); - - Assert.assertFalse(raw.contains(entity.getManagementContext().getManagementNodeId()), "unexpected app tag, includes too much mgmt info: "+raw); - Assert.assertFalse(raw.contains("managementContext"), "unexpected app tag, includes too much mgmt info: "+raw); - Assert.assertFalse(raw.contains("localhost"), "unexpected app tag, includes too much mgmt info: "+raw); - Assert.assertFalse(raw.contains("catalog"), "unexpected app tag, includes too much mgmt info: "+raw); - - @SuppressWarnings("unchecked") - List<Object> tags = mapper().readValue(raw, List.class); - log.info("TAGS are: "+tags); - - Assert.assertEquals(tags.size(), 2, "tags are: "+tags); - - Assert.assertTrue(tags.contains("foo")); - Assert.assertFalse(tags.contains("bar")); - - MutableList<Object> appTags = MutableList.copyOf(tags); - appTags.remove("foo"); - Object appTag = Iterables.getOnlyElement( appTags ); - - // it's a map at this point, because there was no way to make it something stronger than Object - Assert.assertTrue(appTag instanceof Map, "Should have deserialized an entity: "+appTag); - // let's re-serialize it as an entity - appTag = mapper().readValue(mapper().writeValueAsString(appTag), Entity.class); - - Assert.assertTrue(appTag instanceof Entity, "Should have deserialized an entity: "+appTag); - Assert.assertEquals( ((Entity)appTag).getId(), entity.getApplicationId(), "Wrong ID: "+appTag); - Assert.assertTrue(appTag instanceof BasicApplication, "Should have deserialized BasicApplication: "+appTag); - } - -}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java deleted file mode 100644 index 0979875..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java +++ /dev/null @@ -1,98 +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 org.apache.brooklyn.rest.resources; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; - -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response.Status; - -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import org.apache.brooklyn.rest.domain.ApiError; -import org.apache.brooklyn.rest.domain.ApplicationSpec; -import org.apache.brooklyn.rest.domain.EntitySpec; -import org.apache.brooklyn.rest.domain.PolicySummary; -import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest; -import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity; -import org.apache.brooklyn.rest.testing.mocks.RestMockSimplePolicy; - -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.sun.jersey.api.client.ClientResponse; - -public class ErrorResponseTest extends BrooklynRestResourceTest { - - private final ApplicationSpec simpleSpec = ApplicationSpec.builder().name("simple-app").entities( - ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))).locations( - ImmutableSet.of("localhost")).build(); - private String policyId; - - @BeforeClass(alwaysRun = true) - @Override - public void setUp() throws Exception { - super.setUp(); - - ClientResponse aResponse = clientDeploy(simpleSpec); - waitForApplicationToBeRunning(aResponse.getLocation()); - - String policiesEndpoint = "/v1/applications/simple-app/entities/simple-ent/policies"; - - ClientResponse pResponse = client().resource(policiesEndpoint) - .queryParam("type", RestMockSimplePolicy.class.getCanonicalName()) - .type(MediaType.APPLICATION_JSON_TYPE) - .post(ClientResponse.class, Maps.newHashMap()); - PolicySummary response = pResponse.getEntity(PolicySummary.class); - assertNotNull(response.getId()); - policyId = response.getId(); - } - - @Test - public void testResponseToBadRequest() { - String resource = "/v1/applications/simple-app/entities/simple-ent/policies/"+policyId+"/config/" - + RestMockSimplePolicy.INTEGER_CONFIG.getName() + "/set"; - - ClientResponse response = client().resource(resource) - .queryParam("value", "notanumber") - .post(ClientResponse.class); - - assertEquals(response.getStatus(), Status.BAD_REQUEST.getStatusCode()); - assertEquals(response.getHeaders().getFirst("Content-Type"), MediaType.APPLICATION_JSON); - - ApiError error = response.getEntity(ApiError.class); - assertTrue(error.getMessage().toLowerCase().contains("cannot coerce")); - } - - @Test - public void testResponseToWrongMethod() { - String resource = "/v1/applications/simple-app/entities/simple-ent/policies/"+policyId+"/config/" - + RestMockSimplePolicy.INTEGER_CONFIG.getName() + "/set"; - - // Should be POST, not GET - ClientResponse response = client().resource(resource) - .queryParam("value", "4") - .get(ClientResponse.class); - - assertEquals(response.getStatus(), 405); - // Can we assert anything about the content type? - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java deleted file mode 100644 index d8897af..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java +++ /dev/null @@ -1,189 +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 org.apache.brooklyn.rest.resources; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; - -import java.net.URI; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nullable; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.annotations.Test; - -import com.google.api.client.repackaged.com.google.common.base.Joiner; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.GenericType; - -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.core.location.SimulatedLocation; -import org.apache.brooklyn.location.jclouds.JcloudsLocation; -import org.apache.brooklyn.rest.domain.CatalogLocationSummary; -import org.apache.brooklyn.rest.domain.LocationSummary; -import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest; -import org.apache.brooklyn.test.Asserts; - -@Test(singleThreaded = true) -public class LocationResourceTest extends BrooklynRestResourceTest { - - private static final Logger log = LoggerFactory.getLogger(LocationResourceTest.class); - private String legacyLocationName = "my-jungle-legacy"; - private String legacyLocationVersion = "0.0.0.SNAPSHOT"; - - private String locationName = "my-jungle"; - private String locationVersion = "0.1.2"; - - @Test - @Deprecated - public void testAddLegacyLocationDefinition() { - Map<String, String> expectedConfig = ImmutableMap.of( - "identity", "bob", - "credential", "CR3dential"); - ClientResponse response = client().resource("/v1/locations") - .type(MediaType.APPLICATION_JSON_TYPE) - .post(ClientResponse.class, new org.apache.brooklyn.rest.domain.LocationSpec(legacyLocationName, "aws-ec2:us-east-1", expectedConfig)); - - URI addedLegacyLocationUri = response.getLocation(); - log.info("added legacy, at: " + addedLegacyLocationUri); - LocationSummary location = client().resource(response.getLocation()).get(LocationSummary.class); - log.info(" contents: " + location); - assertEquals(location.getSpec(), "brooklyn.catalog:"+legacyLocationName+":"+legacyLocationVersion); - assertTrue(addedLegacyLocationUri.toString().startsWith("/v1/locations/")); - - JcloudsLocation l = (JcloudsLocation) getManagementContext().getLocationRegistry().resolve(legacyLocationName); - Assert.assertEquals(l.getProvider(), "aws-ec2"); - Assert.assertEquals(l.getRegion(), "us-east-1"); - Assert.assertEquals(l.getIdentity(), "bob"); - Assert.assertEquals(l.getCredential(), "CR3dential"); - } - - @SuppressWarnings("deprecation") - @Test - public void testAddNewLocationDefinition() { - String yaml = Joiner.on("\n").join(ImmutableList.of( - "brooklyn.catalog:", - " symbolicName: "+locationName, - " version: " + locationVersion, - "", - "brooklyn.locations:", - "- type: "+"aws-ec2:us-east-1", - " brooklyn.config:", - " identity: bob", - " credential: CR3dential")); - - - ClientResponse response = client().resource("/v1/catalog") - .post(ClientResponse.class, yaml); - - assertEquals(response.getStatus(), Response.Status.CREATED.getStatusCode()); - - - URI addedCatalogItemUri = response.getLocation(); - log.info("added, at: " + addedCatalogItemUri); - - // Ensure location definition exists - CatalogLocationSummary locationItem = client().resource("/v1/catalog/locations/"+locationName + "/" + locationVersion) - .get(CatalogLocationSummary.class); - log.info(" item: " + locationItem); - LocationSummary locationSummary = client().resource(URI.create("/v1/locations/"+locationName+"/")).get(LocationSummary.class); - log.info(" summary: " + locationSummary); - Assert.assertEquals(locationSummary.getSpec(), "brooklyn.catalog:"+locationName+":"+locationVersion); - - // Ensure location is usable - can instantiate, and has right config - JcloudsLocation l = (JcloudsLocation) getManagementContext().getLocationRegistry().resolve(locationName); - Assert.assertEquals(l.getProvider(), "aws-ec2"); - Assert.assertEquals(l.getRegion(), "us-east-1"); - Assert.assertEquals(l.getIdentity(), "bob"); - Assert.assertEquals(l.getCredential(), "CR3dential"); - } - - @SuppressWarnings("deprecation") - @Test(dependsOnMethods = { "testAddNewLocationDefinition" }) - public void testListAllLocationDefinitions() { - Set<LocationSummary> locations = client().resource("/v1/locations") - .get(new GenericType<Set<LocationSummary>>() {}); - Iterable<LocationSummary> matching = Iterables.filter(locations, new Predicate<LocationSummary>() { - @Override - public boolean apply(@Nullable LocationSummary l) { - return locationName.equals(l.getName()); - } - }); - LocationSummary location = Iterables.getOnlyElement(matching); - - URI expectedLocationUri = URI.create("/v1/locations/"+locationName); - Assert.assertEquals(location.getSpec(), "brooklyn.catalog:"+locationName+":"+locationVersion); - Assert.assertEquals(location.getLinks().get("self"), expectedLocationUri); - } - - @SuppressWarnings("deprecation") - @Test(dependsOnMethods = { "testListAllLocationDefinitions" }) - public void testGetSpecificLocation() { - URI expectedLocationUri = URI.create("/v1/locations/"+locationName); - LocationSummary location = client().resource(expectedLocationUri).get(LocationSummary.class); - assertEquals(location.getSpec(), "brooklyn.catalog:"+locationName+":"+locationVersion); - } - - @SuppressWarnings("deprecation") - @Test - public void testGetLocationConfig() { - SimulatedLocation parentLoc = (SimulatedLocation) getManagementContext().getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class) - .configure("myParentKey", "myParentVal")); - SimulatedLocation loc = (SimulatedLocation) getManagementContext().getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class) - .parent(parentLoc) - .configure("mykey", "myval") - .configure("password", "mypassword")); - - // "full" means including-inherited, filtered to exclude secrets - URI uriFull = URI.create("/v1/locations/"+loc.getId()+"?full=true"); - LocationSummary summaryFull = client().resource(uriFull).get(LocationSummary.class); - assertEquals(summaryFull.getConfig(), ImmutableMap.of("mykey", "myval", "myParentKey", "myParentVal"), "conf="+summaryFull.getConfig()); - - // Default is local-only, filtered to exclude secrets - URI uriDefault = URI.create("/v1/locations/"+loc.getId()); - LocationSummary summaryDefault = client().resource(uriDefault).get(LocationSummary.class); - assertEquals(summaryDefault.getConfig(), ImmutableMap.of("mykey", "myval"), "conf="+summaryDefault.getConfig()); - } - - @Test(dependsOnMethods = { "testAddLegacyLocationDefinition" }) - @Deprecated - public void testDeleteLocation() { - final int size = getLocationRegistry().getDefinedLocations().size(); - URI expectedLocationUri = URI.create("/v1/locations/"+legacyLocationName); - - ClientResponse response = client().resource(expectedLocationUri).delete(ClientResponse.class); - assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode()); - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertEquals(getLocationRegistry().getDefinedLocations().size(), size - 1); - } - }); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/PolicyResourceTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/PolicyResourceTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/PolicyResourceTest.java deleted file mode 100644 index 22dc86d..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/PolicyResourceTest.java +++ /dev/null @@ -1,145 +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 org.apache.brooklyn.rest.resources; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.fail; - -import java.util.Map; -import java.util.Set; - -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import org.apache.brooklyn.rest.domain.ApplicationSpec; -import org.apache.brooklyn.rest.domain.EntitySpec; -import org.apache.brooklyn.rest.domain.PolicyConfigSummary; -import org.apache.brooklyn.rest.domain.PolicySummary; -import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest; -import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity; -import org.apache.brooklyn.rest.testing.mocks.RestMockSimplePolicy; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.GenericType; - -@Test(singleThreaded = true) -public class PolicyResourceTest extends BrooklynRestResourceTest { - - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(PolicyResourceTest.class); - - private static final String ENDPOINT = "/v1/applications/simple-app/entities/simple-ent/policies/"; - - private final ApplicationSpec simpleSpec = ApplicationSpec.builder().name("simple-app").entities( - ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))).locations( - ImmutableSet.of("localhost")).build(); - - private String policyId; - - @BeforeClass(alwaysRun = true) - @Override - public void setUp() throws Exception { - super.setUp(); - - ClientResponse aResponse = clientDeploy(simpleSpec); - waitForApplicationToBeRunning(aResponse.getLocation()); - - ClientResponse pResponse = client().resource(ENDPOINT) - .queryParam("type", RestMockSimplePolicy.class.getCanonicalName()) - .type(MediaType.APPLICATION_JSON_TYPE) - .post(ClientResponse.class, Maps.newHashMap()); - - PolicySummary response = pResponse.getEntity(PolicySummary.class); - assertNotNull(response.getId()); - policyId = response.getId(); - - } - - @Test - public void testListConfig() throws Exception { - Set<PolicyConfigSummary> config = client().resource(ENDPOINT + policyId + "/config") - .get(new GenericType<Set<PolicyConfigSummary>>() {}); - - Set<String> configNames = Sets.newLinkedHashSet(); - for (PolicyConfigSummary conf : config) { - configNames.add(conf.getName()); - } - - assertEquals(configNames, ImmutableSet.of( - RestMockSimplePolicy.SAMPLE_CONFIG.getName(), - RestMockSimplePolicy.INTEGER_CONFIG.getName())); - } - - @Test - public void testGetNonExistantConfigReturns404() throws Exception { - String invalidConfigName = "doesnotexist"; - try { - PolicyConfigSummary summary = client().resource(ENDPOINT + policyId + "/config/" + invalidConfigName) - .get(PolicyConfigSummary.class); - fail("Should have thrown 404, but got "+summary); - } catch (Exception e) { - if (!e.toString().contains("404")) throw e; - } - } - - @Test - public void testGetDefaultValue() throws Exception { - String configName = RestMockSimplePolicy.SAMPLE_CONFIG.getName(); - String expectedVal = RestMockSimplePolicy.SAMPLE_CONFIG.getDefaultValue(); - - String configVal = client().resource(ENDPOINT + policyId + "/config/" + configName) - .get(String.class); - assertEquals(configVal, expectedVal); - } - - @Test(dependsOnMethods = "testGetDefaultValue") - public void testReconfigureConfig() throws Exception { - String configName = RestMockSimplePolicy.SAMPLE_CONFIG.getName(); - - ClientResponse response = client().resource(ENDPOINT + policyId + "/config/" + configName + "/set") - .queryParam("value", "newval") - .post(ClientResponse.class); - - assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); - } - - @Test(dependsOnMethods = "testReconfigureConfig") - public void testGetConfigValue() throws Exception { - String configName = RestMockSimplePolicy.SAMPLE_CONFIG.getName(); - String expectedVal = "newval"; - - Map<String, Object> allState = client().resource(ENDPOINT + policyId + "/config/current-state") - .get(new GenericType<Map<String, Object>>() {}); - assertEquals(allState, ImmutableMap.of(configName, expectedVal)); - - String configVal = client().resource(ENDPOINT + policyId + "/config/" + configName) - .get(String.class); - assertEquals(configVal, expectedVal); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java deleted file mode 100644 index 08b9aa4..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java +++ /dev/null @@ -1,54 +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 org.apache.brooklyn.rest.resources; - -import java.util.Collections; - -import org.apache.brooklyn.api.entity.Application; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.rest.domain.ScriptExecutionSummary; -import org.apache.brooklyn.rest.testing.mocks.RestMockApp; -import org.testng.Assert; -import org.testng.annotations.Test; - -public class ScriptResourceTest { - - @Test - public void testGroovy() { - ManagementContext mgmt = LocalManagementContextForTests.newInstance(); - Application app = mgmt.getEntityManager().createEntity( EntitySpec.create(Application.class, RestMockApp.class) ); - try { - - Entities.start(app, Collections.<Location>emptyList()); - - ScriptResource s = new ScriptResource(); - s.setManagementContext(mgmt); - - ScriptExecutionSummary result = s.groovy(null, "def apps = []; mgmt.applications.each { println 'app:'+it; apps << it.id }; apps"); - Assert.assertEquals(Collections.singletonList(app.getId()).toString(), result.getResult()); - Assert.assertTrue(result.getStdout().contains("app:RestMockApp")); - - } finally { Entities.destroyAll(mgmt); } - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java deleted file mode 100644 index f90b677..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java +++ /dev/null @@ -1,82 +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 org.apache.brooklyn.rest.resources; - -import java.net.URI; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.entity.EntityInternal; -import org.apache.brooklyn.core.entity.EntityPredicates; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.entity.stock.BasicApplication; -import org.apache.brooklyn.rest.BrooklynRestApiLauncher; -import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture; -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.http.HttpTool; -import org.apache.brooklyn.util.http.HttpToolResponse; -import org.apache.brooklyn.util.net.Urls; -import org.apache.http.client.HttpClient; -import org.eclipse.jetty.server.Server; -import org.testng.Assert; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; - -public class SensorResourceIntegrationTest extends BrooklynRestApiLauncherTestFixture { - - private Server server; - private ManagementContext mgmt; - private BasicApplication app; - - @BeforeClass(alwaysRun = true) - protected void setUp() { - mgmt = LocalManagementContextForTests.newInstance(); - server = useServerForTest(BrooklynRestApiLauncher.launcher() - .managementContext(mgmt) - .withoutJsgui() - .start()); - app = mgmt.getEntityManager().createEntity(EntitySpec.create(BasicApplication.class).displayName("simple-app") - .child(EntitySpec.create(Entity.class, RestMockSimpleEntity.class).displayName("simple-ent"))); - mgmt.getEntityManager().manage(app); - app.start(MutableList.of(mgmt.getLocationRegistry().resolve("localhost"))); - } - - // marked integration because of time - @Test(groups = "Integration") - public void testSensorBytes() throws Exception { - EntityInternal entity = (EntityInternal) Iterables.find(mgmt.getEntityManager().getEntities(), EntityPredicates.displayNameEqualTo("simple-ent")); - SensorResourceTest.addAmphibianSensor(entity); - - String baseUri = getBaseUri(server); - URI url = URI.create(Urls.mergePaths(baseUri, SensorResourceTest.SENSORS_ENDPOINT, SensorResourceTest.SENSOR_NAME)); - - // Uses explicit "application/json" because failed on jenkins as though "text/plain" was the default on Ubuntu jenkins! - HttpClient client = HttpTool.httpClientBuilder().uri(baseUri).build(); - HttpToolResponse response = HttpTool.httpGet(client, url, ImmutableMap.<String, String>of("Accept", "application/json")); - HttpTestUtils.assertHealthyStatusCode(response.getResponseCode()); - Assert.assertEquals(response.getContentAsString(), "\"12345 frogs\""); - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java deleted file mode 100644 index 4d2f781..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java +++ /dev/null @@ -1,271 +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 org.apache.brooklyn.rest.resources; - -import static org.testng.Assert.assertEquals; - -import java.util.Map; - -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.apache.brooklyn.api.sensor.AttributeSensor; -import org.apache.brooklyn.core.config.render.RendererHints; -import org.apache.brooklyn.core.entity.EntityInternal; -import org.apache.brooklyn.core.entity.EntityPredicates; -import org.apache.brooklyn.core.sensor.Sensors; -import org.apache.brooklyn.rest.api.SensorApi; -import org.apache.brooklyn.rest.domain.ApplicationSpec; -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.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; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import com.google.common.base.Functions; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.GenericType; -import com.sun.jersey.api.client.WebResource; -import com.sun.jersey.api.client.WebResource.Builder; - -/** - * Test the {@link SensorApi} implementation. - * <p> - * Check that {@link SensorResource} correctly renders {@link AttributeSensor} - * values, including {@link RendererHints.DisplayValue} hints. - */ -@Test(singleThreaded = true) -public class SensorResourceTest extends BrooklynRestResourceTest { - - final static ApplicationSpec SIMPLE_SPEC = ApplicationSpec.builder() - .name("simple-app") - .entities(ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))) - .locations(ImmutableSet.of("localhost")) - .build(); - - static final String SENSORS_ENDPOINT = "/v1/applications/simple-app/entities/simple-ent/sensors"; - static final String SENSOR_NAME = "amphibian.count"; - static final AttributeSensor<Integer> SENSOR = Sensors.newIntegerSensor(SENSOR_NAME); - - EntityInternal entity; - - /** - * Sets up the application and entity. - * <p> - * Adds a sensor and sets its value to {@code 12345}. Configures a display value - * hint that appends {@code frogs} to the value of the sensor. - */ - @BeforeClass(alwaysRun = true) - @Override - public void setUp() throws Exception { - super.setUp(); - - // Deploy application - ClientResponse deploy = clientDeploy(SIMPLE_SPEC); - waitForApplicationToBeRunning(deploy.getLocation()); - - entity = (EntityInternal) Iterables.find(getManagementContext().getEntityManager().getEntities(), EntityPredicates.displayNameEqualTo("simple-ent")); - addAmphibianSensor(entity); - } - - static void addAmphibianSensor(EntityInternal entity) { - // Add new sensor - entity.getMutableEntityType().addSensor(SENSOR); - entity.sensors().set(SENSOR, 12345); - - // Register display value hint - RendererHints.register(SENSOR, RendererHints.displayValue(Functions.compose(StringFunctions.append(" frogs"), Functions.toStringFunction()))); - } - - @AfterClass(alwaysRun = true) - @Override - public void tearDown() throws Exception { - TestRendererHints.clearRegistry(); - super.tearDown(); - } - - /** Check default is to use display value hint. */ - @Test - public void testBatchSensorRead() throws Exception { - ClientResponse response = client().resource(SENSORS_ENDPOINT + "/current-state") - .accept(MediaType.APPLICATION_JSON) - .get(ClientResponse.class); - Map<String, ?> currentState = response.getEntity(new GenericType<Map<String,?>>(Map.class) {}); - - for (String sensor : currentState.keySet()) { - if (sensor.equals(SENSOR_NAME)) { - assertEquals(currentState.get(sensor), "12345 frogs"); - } - } - } - - /** Check setting {@code raw} to {@code true} ignores display value hint. */ - @Test(dependsOnMethods = "testBatchSensorRead") - public void testBatchSensorReadRaw() throws Exception { - ClientResponse response = client().resource(SENSORS_ENDPOINT + "/current-state") - .queryParam("raw", "true") - .accept(MediaType.APPLICATION_JSON) - .get(ClientResponse.class); - Map<String, ?> currentState = response.getEntity(new GenericType<Map<String,?>>(Map.class) {}); - - for (String sensor : currentState.keySet()) { - if (sensor.equals(SENSOR_NAME)) { - assertEquals(currentState.get(sensor), Integer.valueOf(12345)); - } - } - } - - protected ClientResponse doSensorTest(Boolean raw, MediaType acceptsType, Object expectedValue) { - return doSensorTestUntyped( - raw==null ? null : (""+raw).toLowerCase(), - acceptsType==null ? null : new String[] { acceptsType.getType() }, - expectedValue); - } - protected ClientResponse doSensorTestUntyped(String raw, String[] acceptsTypes, Object expectedValue) { - WebResource req = client().resource(SENSORS_ENDPOINT + "/" + SENSOR_NAME); - if (raw!=null) req = req.queryParam("raw", raw); - ClientResponse response; - if (acceptsTypes!=null) { - Builder rb = req.accept(acceptsTypes); - response = rb.get(ClientResponse.class); - } else { - response = req.get(ClientResponse.class); - } - if (expectedValue!=null) { - HttpAsserts.assertHealthyStatusCode(response.getStatus()); - Object value = response.getEntity(expectedValue.getClass()); - assertEquals(value, expectedValue); - } - return response; - } - - /** - * Check we can get a sensor, explicitly requesting json; gives a string picking up the rendering hint. - * - * If no "Accepts" header is given, then we don't control whether json or plain text comes back. - * It is dependent on the method order, which is compiler-specific. - */ - @Test - public void testGetJson() throws Exception { - doSensorTest(null, MediaType.APPLICATION_JSON_TYPE, "\"12345 frogs\""); - } - - @Test - public void testGetJsonBytes() throws Exception { - ClientResponse response = doSensorTest(null, MediaType.APPLICATION_JSON_TYPE, null); - byte[] bytes = Streams.readFully(response.getEntityInputStream()); - // assert we have one set of surrounding quotes - assertEquals(bytes.length, 13); - } - - /** Check that plain returns a string without quotes, with the rendering hint */ - @Test - public void testGetPlain() throws Exception { - doSensorTest(null, MediaType.TEXT_PLAIN_TYPE, "12345 frogs"); - } - - /** - * Check that when we set {@code raw = true}, the result ignores the display value hint. - * - * If no "Accepts" header is given, then we don't control whether json or plain text comes back. - * It is dependent on the method order, which is compiler-specific. - */ - @Test - public void testGetRawJson() throws Exception { - doSensorTest(true, MediaType.APPLICATION_JSON_TYPE, 12345); - } - - /** As {@link #testGetRaw()} but with plain set, returns the number */ - @Test - public void testGetPlainRaw() throws Exception { - // have to pass a string because that's how PLAIN is deserialized - doSensorTest(true, MediaType.TEXT_PLAIN_TYPE, "12345"); - } - - /** Check explicitly setting {@code raw} to {@code false} is as before */ - @Test - public void testGetPlainRawFalse() throws Exception { - doSensorTest(false, MediaType.TEXT_PLAIN_TYPE, "12345 frogs"); - } - - /** Check empty vaue for {@code raw} will revert to using default. */ - @Test - public void testGetPlainRawEmpty() throws Exception { - doSensorTestUntyped("", new String[] { MediaType.TEXT_PLAIN }, "12345 frogs"); - } - - /** Check unparseable vaue for {@code raw} will revert to using default. */ - @Test - public void testGetPlainRawError() throws Exception { - doSensorTestUntyped("biscuits", new String[] { MediaType.TEXT_PLAIN }, "12345 frogs"); - } - - /** Check we can set a value */ - @Test - public void testSet() throws Exception { - try { - ClientResponse response = client().resource(SENSORS_ENDPOINT + "/" + SENSOR_NAME) - .type(MediaType.APPLICATION_JSON_TYPE) - .post(ClientResponse.class, 67890); - assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode()); - - assertEquals(entity.getAttribute(SENSOR), (Integer)67890); - - String value = client().resource(SENSORS_ENDPOINT + "/" + SENSOR_NAME).accept(MediaType.TEXT_PLAIN_TYPE).get(String.class); - assertEquals(value, "67890 frogs"); - - } finally { addAmphibianSensor(entity); } - } - - @Test - public void testSetFromMap() throws Exception { - try { - ClientResponse response = client().resource(SENSORS_ENDPOINT) - .type(MediaType.APPLICATION_JSON_TYPE) - .post(ClientResponse.class, MutableMap.of(SENSOR_NAME, 67890)); - assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode()); - - assertEquals(entity.getAttribute(SENSOR), (Integer)67890); - - } finally { addAmphibianSensor(entity); } - } - - /** Check we can delete a value */ - @Test - public void testDelete() throws Exception { - try { - ClientResponse response = client().resource(SENSORS_ENDPOINT + "/" + SENSOR_NAME) - .delete(ClientResponse.class); - assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode()); - - String value = client().resource(SENSORS_ENDPOINT + "/" + SENSOR_NAME).accept(MediaType.TEXT_PLAIN_TYPE).get(String.class); - assertEquals(value, ""); - - } finally { addAmphibianSensor(entity); } - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceIntegrationTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceIntegrationTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceIntegrationTest.java index ce3fd37..74fbe3c 100644 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceIntegrationTest.java +++ b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceIntegrationTest.java @@ -32,7 +32,7 @@ import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.rest.BrooklynRestApiLauncher; import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture; import org.apache.brooklyn.rest.security.provider.TestSecurityProvider; -import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.util.http.HttpAsserts; import org.apache.brooklyn.util.http.HttpTool; import org.apache.brooklyn.util.http.HttpToolResponse; import org.apache.http.HttpStatus; @@ -71,7 +71,7 @@ public class ServerResourceIntegrationTest extends BrooklynRestApiLauncherTestFi String baseUri = getBaseUri(server); HttpToolResponse response; - final URI uri = URI.create(getBaseUri() + "/v1/server/properties/reload"); + final URI uri = URI.create(getBaseUri() + "/server/properties/reload"); final Map<String, String> args = Collections.emptyMap(); // Unauthorised when no credentials, and when default credentials. @@ -85,12 +85,12 @@ public class ServerResourceIntegrationTest extends BrooklynRestApiLauncherTestFi // Accepts TestSecurityProvider credentials, and we reload. response = HttpTool.httpPost(httpClientBuilder().uri(baseUri).credentials(TestSecurityProvider.CREDENTIAL).build(), uri, args, args); - HttpTestUtils.assertHealthyStatusCode(response.getResponseCode()); + HttpAsserts.assertHealthyStatusCode(response.getResponseCode()); // Has no gone back to credentials from brooklynProperties; TestSecurityProvider credentials no longer work response = HttpTool.httpPost(httpClientBuilder().uri(baseUri).credentials(defaultCredential).build(), uri, args, args); - HttpTestUtils.assertHealthyStatusCode(response.getResponseCode()); + HttpAsserts.assertHealthyStatusCode(response.getResponseCode()); response = HttpTool.httpPost(httpClientBuilder().uri(baseUri).credentials(TestSecurityProvider.CREDENTIAL).build(), uri, args, args); @@ -116,9 +116,9 @@ public class ServerResourceIntegrationTest extends BrooklynRestApiLauncherTestFi .credentials(TestSecurityProvider.CREDENTIAL) .build(); - HttpToolResponse response = HttpTool.httpGet(client, URI.create(getBaseUri(server) + "/v1/server/user"), + HttpToolResponse response = HttpTool.httpGet(client, URI.create(getBaseUri(server) + "/server/user"), ImmutableMap.<String, String>of()); - HttpTestUtils.assertHealthyStatusCode(response.getResponseCode()); + HttpAsserts.assertHealthyStatusCode(response.getResponseCode()); return response.getContentAsString(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceTest.java deleted file mode 100644 index f84cb80..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerResourceTest.java +++ /dev/null @@ -1,168 +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 org.apache.brooklyn.rest.resources; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.brooklyn.api.entity.ImplementedBy; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.BrooklynVersion; -import org.apache.brooklyn.core.internal.BrooklynProperties; -import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; -import org.apache.brooklyn.entity.software.base.EmptySoftwareProcess; -import org.apache.brooklyn.entity.software.base.EmptySoftwareProcessDriver; -import org.apache.brooklyn.entity.software.base.EmptySoftwareProcessImpl; -import org.apache.brooklyn.rest.domain.HighAvailabilitySummary; -import org.apache.brooklyn.rest.domain.VersionSummary; -import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest; -import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableSet; -import com.sun.jersey.api.client.UniformInterfaceException; - -@Test(singleThreaded = true) -public class ServerResourceTest extends BrooklynRestResourceTest { - - private static final Logger log = LoggerFactory.getLogger(ServerResourceTest.class); - - @Test - public void testGetVersion() throws Exception { - VersionSummary version = client().resource("/v1/server/version").get(VersionSummary.class); - assertEquals(version.getVersion(), BrooklynVersion.get()); - } - - @Test - public void testGetStatus() throws Exception { - String status = client().resource("/v1/server/status").get(String.class); - assertEquals(status, "MASTER"); - } - - @Test - public void testGetHighAvailability() throws Exception { - // Note by default management context from super is started without HA enabled. - // Therefore can only assert a minimal amount of stuff. - HighAvailabilitySummary summary = client().resource("/v1/server/highAvailability").get(HighAvailabilitySummary.class); - log.info("HA summary is: "+summary); - - String ownNodeId = getManagementContext().getManagementNodeId(); - assertEquals(summary.getOwnId(), ownNodeId); - assertEquals(summary.getMasterId(), ownNodeId); - assertEquals(summary.getNodes().keySet(), ImmutableSet.of(ownNodeId)); - assertEquals(summary.getNodes().get(ownNodeId).getNodeId(), ownNodeId); - assertEquals(summary.getNodes().get(ownNodeId).getStatus(), "MASTER"); - assertNotNull(summary.getNodes().get(ownNodeId).getLocalTimestamp()); - // remote will also be non-null if there is no remote backend (local is re-used) - assertNotNull(summary.getNodes().get(ownNodeId).getRemoteTimestamp()); - assertEquals(summary.getNodes().get(ownNodeId).getLocalTimestamp(), summary.getNodes().get(ownNodeId).getRemoteTimestamp()); - } - - @SuppressWarnings("serial") - @Test - public void testReloadsBrooklynProperties() throws Exception { - final AtomicInteger reloadCount = new AtomicInteger(); - getManagementContext().addPropertiesReloadListener(new ManagementContext.PropertiesReloadListener() { - @Override public void reloaded() { - reloadCount.incrementAndGet(); - }}); - client().resource("/v1/server/properties/reload").post(); - assertEquals(reloadCount.get(), 1); - } - - @Test - void testGetConfig() throws Exception { - ((ManagementContextInternal)getManagementContext()).getBrooklynProperties().put("foo.bar.baz", "quux"); - try { - assertEquals(client().resource("/v1/server/config/foo.bar.baz").get(String.class), "quux"); - } finally { - ((ManagementContextInternal)getManagementContext()).getBrooklynProperties().remove("foo.bar.baz"); - } - } - - @Test - void testGetMissingConfigThrowsException() throws Exception { - final String key = "foo.bar.baz"; - BrooklynProperties properties = ((ManagementContextInternal)getManagementContext()).getBrooklynProperties(); - Object existingValue = null; - boolean keyAlreadyPresent = false; - String response = null; - if (properties.containsKey(key)) { - existingValue = properties.remove(key); - keyAlreadyPresent = true; - } - try { - response = client().resource("/v1/server/config/" + key).get(String.class); - Asserts.fail("Expected call to /v1/server/config/" + key + " to fail with status 404, instead server returned " + response); - } catch (UniformInterfaceException e) { - assertEquals(e.getResponse().getStatus(), 204); - } finally { - if (keyAlreadyPresent) { - properties.put(key, existingValue); - } - } - } - - // Alternatively could reuse a blocking location, see org.apache.brooklyn.entity.software.base.SoftwareProcessEntityTest.ReleaseLatchLocation - @ImplementedBy(StopLatchEntityImpl.class) - public interface StopLatchEntity extends EmptySoftwareProcess { - public void unblock(); - public boolean isBlocked(); - } - - public static class StopLatchEntityImpl extends EmptySoftwareProcessImpl implements StopLatchEntity { - private CountDownLatch lock = new CountDownLatch(1); - private volatile boolean isBlocked; - - @Override - public void unblock() { - lock.countDown(); - } - - @Override - protected void postStop() { - super.preStop(); - try { - isBlocked = true; - lock.await(); - isBlocked = false; - } catch (InterruptedException e) { - throw Exceptions.propagate(e); - } - } - - @Override - public Class<?> getDriverInterface() { - return EmptySoftwareProcessDriver.class; - } - - @Override - public boolean isBlocked() { - return isBlocked; - } - - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java deleted file mode 100644 index dbe9afd..0000000 --- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ServerShutdownTest.java +++ /dev/null @@ -1,185 +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 org.apache.brooklyn.rest.resources; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; - -import java.util.concurrent.atomic.AtomicReference; - -import javax.ws.rs.core.MultivaluedMap; - -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; -import org.apache.brooklyn.core.entity.trait.Startable; -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.util.exceptions.Exceptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.AfterClass; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.sun.jersey.core.util.MultivaluedMapImpl; - -public class ServerShutdownTest extends BrooklynRestResourceTest { - private static final Logger log = LoggerFactory.getLogger(ServerResourceTest.class); - - // Need to initialise the ManagementContext before each test as it is destroyed. - @Override - @BeforeClass(alwaysRun = true) - public void setUp() throws Exception { - } - - @Override - @AfterClass(alwaysRun = true) - public void tearDown() throws Exception { - } - - @Override - @BeforeMethod(alwaysRun = true) - public void setUpMethod() { - setUpJersey(); - super.setUpMethod(); - } - - @AfterMethod(alwaysRun = true) - public void tearDownMethod() { - tearDownJersey(); - destroyManagementContext(); - } - - @Test - public void testShutdown() throws Exception { - assertTrue(getManagementContext().isRunning()); - assertFalse(shutdownListener.isRequested()); - - MultivaluedMap<String, String> formData = new MultivaluedMapImpl(); - formData.add("requestTimeout", "0"); - formData.add("delayForHttpReturn", "0"); - client().resource("/v1/server/shutdown").entity(formData).post(); - - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(shutdownListener.isRequested()); - } - }); - Asserts.succeedsEventually(new Runnable() { - @Override public void run() { - assertFalse(getManagementContext().isRunning()); - }}); - } - - @Test - public void testStopAppThenShutdownAndStopAppsWaitsForFirstStop() throws InterruptedException { - ReflectiveEntityDriverFactory f = ((BasicEntityDriverManager)getManagementContext().getEntityDriverManager()).getReflectiveDriverFactory(); - f.addClassFullNameMapping("org.apache.brooklyn.entity.software.base.EmptySoftwareProcessDriver", "org.apache.brooklyn.rest.resources.ServerResourceTest$EmptySoftwareProcessTestDriver"); - - // Second stop on SoftwareProcess could return early, while the first stop is still in progress - // This causes the app to shutdown prematurely, leaking machines. - EntityManager emgr = getManagementContext().getEntityManager(); - EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class); - TestApplication app = emgr.createEntity(appSpec); - emgr.manage(app); - EntitySpec<StopLatchEntity> latchEntitySpec = EntitySpec.create(StopLatchEntity.class); - final StopLatchEntity entity = app.createAndManageChild(latchEntitySpec); - app.start(ImmutableSet.of(app.newLocalhostProvisioningLocation())); - EntityAsserts.assertAttributeEquals(entity, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); - - try { - final Task<Void> firstStop = app.invoke(Startable.STOP, ImmutableMap.<String, Object>of()); - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(entity.isBlocked()); - } - }); - - final AtomicReference<Exception> shutdownError = new AtomicReference<>(); - // Can't use ExecutionContext as it will be stopped on shutdown - Thread shutdownThread = new Thread() { - @Override - public void run() { - try { - MultivaluedMap<String, String> formData = new MultivaluedMapImpl(); - formData.add("stopAppsFirst", "true"); - formData.add("shutdownTimeout", "0"); - formData.add("requestTimeout", "0"); - formData.add("delayForHttpReturn", "0"); - client().resource("/v1/server/shutdown").entity(formData).post(); - } catch (Exception e) { - log.error("Shutdown request error", e); - shutdownError.set(e); - throw Exceptions.propagate(e); - } - } - }; - shutdownThread.start(); - - //shutdown must wait until the first stop completes (or time out) - Asserts.succeedsContinually(new Runnable() { - @Override - public void run() { - assertFalse(firstStop.isDone()); - assertEquals(getManagementContext().getApplications().size(), 1); - assertFalse(shutdownListener.isRequested()); - } - }); - - // NOTE test is not fully deterministic. Depending on thread scheduling this will - // execute before or after ServerResource.shutdown does the app stop loop. This - // means that the shutdown code might not see the app at all. In any case though - // the test must succeed. - entity.unblock(); - - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(firstStop.isDone()); - assertTrue(shutdownListener.isRequested()); - assertFalse(getManagementContext().isRunning()); - } - }); - - shutdownThread.join(); - assertNull(shutdownError.get(), "Shutdown request error, logged above"); - } finally { - // Be sure we always unblock entity stop even in the case of an exception. - // In the success path the entity is already unblocked above. - entity.unblock(); - } - } - -}