package cf.spring.servicebroker; import org.apache.http.HttpResponse; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.RequestBuilder; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.util.StreamUtils; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.UUID; import static org.testng.Assert.assertEquals; /** * @author Mike Heath */ public class ConflictTest extends AbstractServiceBrokerTest { public static final String BROKER_ID = "a-broker-that-always-has-conflicts"; private static final String PLAN_ID = "bad-plan"; private static final String EXPECTED_CONFLICT_BODY = "{}"; @Configuration @EnableAutoConfiguration @EnableServiceBroker(username = USERNAME, password = PASSWORD) @ServiceBroker( @Service(id = BROKER_ID, name="test-broker", description = "This is for testing", plans = { @ServicePlan(id = PLAN_ID, name = "test-plan", description = "Some test plan for testing.") })) static class ServiceBrokerConfiguration { @Provision public ProvisionResponse provision(ProvisionRequest request) { throw new ConflictException(); } @Bind public BindResponse bind(BindRequest bind) { throw new ConflictException(); } } private ConfigurableApplicationContext context; private CloseableHttpClient client; @BeforeClass public void init() { final SpringApplication application = new SpringApplication(ServiceBrokerConfiguration.class); context = application.run(); client = buildAuthenticatingClient(); } @AfterClass public void cleanup() throws Exception { context.close(); client.close(); } @Test public void provisionConflict() throws Exception { final ServiceBrokerHandler.ProvisionBody provisionBody = new ServiceBrokerHandler.ProvisionBody(BROKER_ID, PLAN_ID, UUID.randomUUID(), UUID.randomUUID(), Collections.emptyMap()); final HttpUriRequest provisionRequest = RequestBuilder.put() .setUri("http://localhost:8080/v2/service_instances/" + UUID.randomUUID()) .setEntity(new StringEntity(mapper.writeValueAsString(provisionBody), ContentType.APPLICATION_JSON)) .build(); try (final CloseableHttpResponse provisionResponse = client.execute(provisionRequest)) { assertEquals(provisionResponse.getStatusLine().getStatusCode(), 409); final String body = readBody(provisionResponse); assertEquals(body, EXPECTED_CONFLICT_BODY); } } @Test public void bindConflict() throws Exception { final UUID applicationGuid = UUID.randomUUID(); final ServiceBrokerHandler.BindBody bindBody = new ServiceBrokerHandler.BindBody(BROKER_ID, PLAN_ID, applicationGuid, new ServiceBrokerHandler.BindResource(applicationGuid.toString(), null), Collections.emptyMap()); final HttpUriRequest provisionRequest = RequestBuilder.put() .setUri("http://localhost:8080/v2/service_instances/" + UUID.randomUUID() + "/service_bindings/" + UUID.randomUUID()) .setEntity(new StringEntity(mapper.writeValueAsString(bindBody), ContentType.APPLICATION_JSON)) .build(); try (final CloseableHttpResponse bindResponse = client.execute(provisionRequest)) { assertEquals(bindResponse.getStatusLine().getStatusCode(), 409); final String body = readBody(bindResponse); assertEquals(body, EXPECTED_CONFLICT_BODY); } } public String readBody(HttpResponse response) throws IOException { return StreamUtils.copyToString(response.getEntity().getContent(), StandardCharsets.UTF_8); } }