Repository: jclouds-labs-openstack Updated Branches: refs/heads/master ffff86703 -> 052e6cc80
Refactored CDN headers and test classes Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/commit/052e6cc8 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/052e6cc8 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/052e6cc8 Branch: refs/heads/master Commit: 052e6cc8095c11e44a4c52d11c6342654a7d13e9 Parents: ffff867 Author: Jeremy Daggett <[email protected]> Authored: Mon Mar 10 11:40:08 2014 -0700 Committer: Everett Toews <[email protected]> Committed: Thu Apr 3 16:46:35 2014 -0500 ---------------------------------------------------------------------- .../swift/v1/reference/SwiftHeaders.java | 9 +- .../v1/options/UpdateCDNContainerOptions.java | 86 +++--- .../v1/reference/CloudFilesHeaders.java | 9 +- .../v1/features/CloudFilesCDNApiLiveTest.java | 129 ++++++-- .../v1/features/CloudFilesCDNApiMockTest.java | 302 +++++++++++++------ .../options/UpdateCDNContainerOptionsTest.java | 111 +++++++ 6 files changed, 484 insertions(+), 162 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/052e6cc8/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/reference/SwiftHeaders.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/reference/SwiftHeaders.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/reference/SwiftHeaders.java index d8bcd5c..8fa2a81 100644 --- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/reference/SwiftHeaders.java +++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/reference/SwiftHeaders.java @@ -22,7 +22,7 @@ package org.jclouds.openstack.swift.v1.reference; * @author Jeremy Daggett */ public interface SwiftHeaders { - + // Common Metadata Prefixes String ACCOUNT_METADATA_PREFIX = "X-Account-Meta-"; String CONTAINER_METADATA_PREFIX = "X-Container-Meta-"; @@ -80,4 +80,11 @@ public interface SwiftHeaders { // Static Large Object String STATIC_LARGE_OBJECT = "X-Static-Large-Object"; + + // Static Web + String STATIC_WEB_INDEX = CONTAINER_METADATA_PREFIX + "Web-Index"; + String STATIC_WEB_DIRECTORY_TYPE = CONTAINER_METADATA_PREFIX + "Web-Directory-Type"; + String STATIC_WEB_ERROR = CONTAINER_METADATA_PREFIX + "Web-Error"; + String STATIC_WEB_LISTINGS = CONTAINER_METADATA_PREFIX + "Web-Listings"; + String STATIC_WEB_LISTINGS_CSS = CONTAINER_METADATA_PREFIX + "Web-Listings-CSS"; } http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/052e6cc8/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java ---------------------------------------------------------------------- diff --git a/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java b/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java index d044657..0fcb177 100644 --- a/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java +++ b/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java @@ -1,5 +1,4 @@ /* - * 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. @@ -19,6 +18,11 @@ package org.jclouds.rackspace.cloudfiles.v1.options; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_DIRECTORY_TYPE; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_ERROR; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_INDEX; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_LISTINGS; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_LISTINGS_CSS; import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_ENABLED; import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_LOG_RETENTION; import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_TTL; @@ -27,13 +31,11 @@ import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CD import org.jclouds.http.options.BaseHttpRequestOptions; +import com.google.common.net.MediaType; + /** - * Contains options supported in the REST API for updating CDN containers. + * Options supported for updating CDN containers. * - * <a href= - * "http://docs.rackspace.com/files/api/v1/cf-devguide/content/Update_CDN-Enabled_Container_Metadata-d1e2787.html"> - * Update CDN container</a>. - * * @author Jeremy Daggett */ public class UpdateCDNContainerOptions extends BaseHttpRequestOptions { @@ -59,19 +61,18 @@ public class UpdateCDNContainerOptions extends BaseHttpRequestOptions { /** * Enables or disables the CDN Container - * API to enable disable - is this necessary? */ public UpdateCDNContainerOptions enabled(boolean enabled) { headers.put(CDN_ENABLED, Boolean.toString(enabled)); return this; } - + /** - * Sets the index page for the Static Website. + * Sets the directory marker type for the Static Website. */ - public UpdateCDNContainerOptions staticWebsiteIndexPage(String indexPage) { - checkNotNull(indexPage, "index page cannot be null"); - headers.put("indexPage", indexPage); + public UpdateCDNContainerOptions staticWebsiteDirectoryType(MediaType directoryType) { + checkNotNull(directoryType, "directoryType cannot be null"); + headers.put(STATIC_WEB_DIRECTORY_TYPE, directoryType.toString()); return this; } @@ -80,7 +81,16 @@ public class UpdateCDNContainerOptions extends BaseHttpRequestOptions { */ public UpdateCDNContainerOptions staticWebsiteErrorPage(String errorPage) { checkNotNull(errorPage, "error page cannot be null"); - headers.put("errorPage", errorPage); + headers.put(STATIC_WEB_ERROR, errorPage); + return this; + } + + /** + * Sets the index page for the Static Website. + */ + public UpdateCDNContainerOptions staticWebsiteIndexPage(String indexPage) { + checkNotNull(indexPage, "index page cannot be null"); + headers.put(STATIC_WEB_INDEX, indexPage); return this; } @@ -88,35 +98,37 @@ public class UpdateCDNContainerOptions extends BaseHttpRequestOptions { * Enables or disables listings for the Static Website. */ public UpdateCDNContainerOptions staticWebsiteListings(boolean listings) { - headers.put("enableListings", Boolean.toString(listings)); + headers.put(STATIC_WEB_LISTINGS, Boolean.toString(listings)); return this; } - + /** - * Sets the CSS pages for the Static Website. + * Sets the listings CSS page for the Static Website. */ public UpdateCDNContainerOptions staticWebsiteListingsCSS(String listingsCSS) { checkNotNull(listingsCSS, "listingsCSS page cannot be null"); - headers.put("limit", listingsCSS); + headers.put(STATIC_WEB_LISTINGS_CSS, listingsCSS); return this; } public static class Builder { - /** @see UpdateCDNContainerOptions#ttl */ + /** + * @see UpdateCDNContainerOptions#ttl + */ public static UpdateCDNContainerOptions ttl(int ttl) { UpdateCDNContainerOptions options = new UpdateCDNContainerOptions(); return options.ttl(ttl); } - /** - * @see UpdateCDNContainerOptions#logRetention + /** + * @see UpdateCDNContainerOptions#logRetention */ public static UpdateCDNContainerOptions logRetention(boolean logRetention) { UpdateCDNContainerOptions options = new UpdateCDNContainerOptions(); return options.logRetention(logRetention); } - /** + /** * @see UpdateCDNContainerOptions#enabled */ public static UpdateCDNContainerOptions enabled(boolean enabled) { @@ -124,40 +136,44 @@ public class UpdateCDNContainerOptions extends BaseHttpRequestOptions { return options.enabled(enabled); } - /** - * @see UpdateCDNContainerOptions#staticWebsiteIndexPage + /** + * @see UpdateCDNContainerOptions#staticWebsiteDirectoryType */ - public static UpdateCDNContainerOptions staticWebsiteIndexPage(String indexPage) { + public static UpdateCDNContainerOptions staticWebsiteDirectoryType(MediaType directoryType) { UpdateCDNContainerOptions options = new UpdateCDNContainerOptions(); - return options.staticWebsiteIndexPage(indexPage); + return options.staticWebsiteDirectoryType(directoryType); } - /** - * @see UpdateCDNContainerOptions#staticWebsiteErrorPage + /** + * @see UpdateCDNContainerOptions#staticWebsiteErrorPage */ public static UpdateCDNContainerOptions staticWebsiteErrorPage(String errorPage) { UpdateCDNContainerOptions options = new UpdateCDNContainerOptions(); return options.staticWebsiteErrorPage(errorPage); } - /** - * @see UpdateCDNContainerOptions#staticWebsiteListings + /** + * @see UpdateCDNContainerOptions#staticWebsiteIndexPage + */ + public static UpdateCDNContainerOptions staticWebsiteIndexPage(String indexPage) { + UpdateCDNContainerOptions options = new UpdateCDNContainerOptions(); + return options.staticWebsiteIndexPage(indexPage); + } + + /** + * @see UpdateCDNContainerOptions#staticWebsiteListings */ public static UpdateCDNContainerOptions staticWebsiteListings(boolean enabled) { UpdateCDNContainerOptions options = new UpdateCDNContainerOptions(); return options.staticWebsiteListings(enabled); } - /** - * @see UpdateCDNContainerOptions#staticWebsiteListingsCSS + /** + * @see UpdateCDNContainerOptions#staticWebsiteListingsCSS */ public static UpdateCDNContainerOptions staticWebsiteListingsCSS(String cssPage) { UpdateCDNContainerOptions options = new UpdateCDNContainerOptions(); return options.staticWebsiteListingsCSS(cssPage); } } - - public static Builder builder() { - return new Builder(); - } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/052e6cc8/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java ---------------------------------------------------------------------- diff --git a/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java b/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java index 7247700..c6d2bc5 100644 --- a/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java +++ b/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java @@ -39,7 +39,7 @@ public interface CloudFilesHeaders extends SwiftHeaders { String CDN_SSL_URI = "X-Cdn-Ssl-Uri"; String CDN_STREAMING_URI = "X-Cdn-Streaming-Uri"; String CDN_IOS_URI = "X-Cdn-Ios-Uri"; - + // CDN TTL Limits int CDN_TTL_MIN = 900; int CDN_TTL_MAX = 31536000; @@ -48,11 +48,4 @@ public interface CloudFilesHeaders extends SwiftHeaders { // CDN Purge String CDN_PURGE_OBJECT_EMAIL = "X-Purge-Email"; String CDN_PURGE_OBJECT_FAILED = "X-Purge-Failed-Reason"; - - // CDN Static Web - String STATIC_WEB_INDEX = CONTAINER_METADATA_PREFIX + "Web-Index"; - String STATIC_WEB_DIRECTORY_TYPE = CONTAINER_METADATA_PREFIX + "Web-Directory-Type"; - String STATIC_WEB_ERROR = CONTAINER_METADATA_PREFIX + "Web-Error"; - String STATIC_WEB_LISTINGS = CONTAINER_METADATA_PREFIX + "Web-Listings"; - String STATIC_WEB_LISTINGS_CSS = CONTAINER_METADATA_PREFIX + "Web-Listings-CSS"; } http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/052e6cc8/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java ---------------------------------------------------------------------- diff --git a/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java b/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java index 15a9dd9..3e450fd 100644 --- a/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java +++ b/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java @@ -16,19 +16,32 @@ */ package org.jclouds.rackspace.cloudfiles.v1.features; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import java.util.List; +import org.jclouds.http.options.GetOptions; +import org.jclouds.io.Payload; +import org.jclouds.io.Payloads; +import org.jclouds.openstack.swift.v1.features.ObjectApi; import org.jclouds.openstack.swift.v1.options.CreateContainerOptions; import org.jclouds.openstack.swift.v1.options.ListContainerOptions; import org.jclouds.rackspace.cloudfiles.v1.domain.CDNContainer; import org.jclouds.rackspace.cloudfiles.v1.internal.BaseCloudFilesApiLiveTest; +import org.jclouds.rackspace.cloudfiles.v1.options.UpdateCDNContainerOptions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.io.ByteSource; + + /** * Tests the live behavior of the {@code CloudFilesCDNApi}. * @@ -43,21 +56,44 @@ public class CloudFilesCDNApiLiveTest extends BaseCloudFilesApiLiveTest { super(); } - public void testList() throws Exception { + public void testEnable() throws Exception { for (String regionId : regions) { - CDNApi cdnApi = api.cdnApiInRegion(regionId); + assertNotNull(api.cdnApiInRegion(regionId).enable(name)); + + CDNContainer container = api.cdnApiInRegion(regionId).get(name); + assertCDNContainerNotNull(container); + assertTrue(container.isEnabled()); + } + } + + public void testEnableWithTTL() throws Exception { + for (String regionId : regions) { + assertNotNull(api.cdnApiInRegion(regionId).enable(name, 777777)); + + CDNContainer container = api.cdnApiInRegion(regionId).get(name); + assertCDNContainerNotNull(container); + assertTrue(container.isEnabled()); + assertTrue(container.getTtl() == 777777); + } + } + + public void testDisable() throws Exception { + for (String regionId : regions) { + assertTrue(api.cdnApiInRegion(regionId).disable(name)); + + CDNContainer container = api.cdnApiInRegion(regionId).get(name); + assertFalse(container.isEnabled()); + } + } - List<CDNContainer> cdnResponse = cdnApi.list().toList(); + public void testList() throws Exception { + for (String regionId : regions) { + List<CDNContainer> cdnResponse = api.cdnApiInRegion(regionId).list().toList(); assertNotNull(cdnResponse); + for (CDNContainer cdnContainer : cdnResponse) { - assertNotNull(cdnContainer.getName()); + assertCDNContainerNotNull(cdnContainer); assertTrue(cdnContainer.isEnabled()); - assertNotNull(cdnContainer.isLogRetentionEnabled()); - assertNotNull(cdnContainer.getTtl()); - assertNotNull(cdnContainer.getUri()); - assertNotNull(cdnContainer.getSslUri()); - assertNotNull(cdnContainer.getStreamingUri()); - assertNotNull(cdnContainer.getIosUri()); } } } @@ -66,32 +102,83 @@ public class CloudFilesCDNApiLiveTest extends BaseCloudFilesApiLiveTest { String lexicographicallyBeforeName = name.substring(0, name.length() - 1); for (String regionId : regions) { ListContainerOptions options = ListContainerOptions.Builder.marker(lexicographicallyBeforeName); + CDNContainer cdnContainer = api.cdnApiInRegion(regionId).list(options).get(0); - - assertNotNull(cdnContainer.getName()); + assertCDNContainerNotNull(cdnContainer); assertTrue(cdnContainer.isEnabled()); - assertNotNull(cdnContainer.isLogRetentionEnabled()); - assertNotNull(cdnContainer.getTtl()); - assertNotNull(cdnContainer.getUri()); - assertNotNull(cdnContainer.getSslUri()); - assertNotNull(cdnContainer.getStreamingUri()); - assertNotNull(cdnContainer.getIosUri()); } } public void testGet() throws Exception { for (String regionId : regions) { - CDNContainer cdnContainer = api.cdnApiInRegion(regionId).get(name); - assertNotNull(cdnContainer); + CDNContainer container = api.cdnApiInRegion(regionId).get(name); + assertCDNContainerNotNull(container); + assertTrue(container.isEnabled()); + } + } + + public void testPurgeObject() throws Exception { + for (String regionId : regions) { + String objectName = "testPurge"; + Payload payload = Payloads.newByteSourcePayload(ByteSource.wrap(new byte[] {1,2,3})); + ObjectApi objectApi = api.objectApiInRegionForContainer(regionId, name); + + // create a new object + objectApi.replace(objectName, payload, ImmutableMap.<String, String>of()); + + CDNApi cdnApi = api.cdnApiInRegion(regionId); + assertTrue(cdnApi.purgeObject(name, "testPurge", ImmutableList.<String>of())); + + // delete the object + objectApi.delete(objectName); + assertNull(objectApi.get(objectName, GetOptions.NONE)); } } + public void testUpdate() throws Exception { + for (String regionId : regions) { + // enable with a ttl + assertNotNull(api.cdnApiInRegion(regionId).enable(name, 777777)); + + // now get the container + CDNContainer original = api.cdnApiInRegion(regionId).get(name); + assertTrue(original.isEnabled()); + assertCDNContainerNotNull(original); + + // update options + UpdateCDNContainerOptions opts = new UpdateCDNContainerOptions() + .ttl(1234567) + .logRetention(true) + .enabled(false); + // update the container + assertTrue(api.cdnApiInRegion(regionId).update(name, opts)); + + // now get the updated container + CDNContainer updated = api.cdnApiInRegion(regionId).get(name); + assertFalse(updated.isEnabled()); + assertCDNContainerNotNull(updated); + + assertNotEquals(original.getTtl(), updated.getTtl()); + assertTrue(updated.isLogRetentionEnabled()); + } + } + + private static final void assertCDNContainerNotNull(CDNContainer container) { + assertNotNull(container); + assertNotNull(container.getName()); + assertNotNull(container.getTtl()); + assertNotNull(container.getUri()); + assertNotNull(container.getIosUri()); + assertNotNull(container.getSslUri()); + assertNotNull(container.getStreamingUri()); + assertNotNull(container.isLogRetentionEnabled()); + } + @BeforeClass(groups = "live") public void setup() { super.setup(); for (String regionId : regions) { api.containerApiInRegion(regionId).createIfAbsent(name, CreateContainerOptions.NONE); - api.cdnApiInRegion(regionId).enable(name); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/052e6cc8/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java ---------------------------------------------------------------------- diff --git a/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java b/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java index 8e55c2e..18cd36c 100644 --- a/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java +++ b/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java @@ -16,11 +16,8 @@ */ package org.jclouds.rackspace.cloudfiles.v1.features; -import static com.google.common.base.Charsets.US_ASCII; import static javax.ws.rs.core.HttpHeaders.CONTENT_LENGTH; import static javax.ws.rs.core.HttpHeaders.CONTENT_TYPE; -import static javax.ws.rs.core.HttpHeaders.ETAG; -import static javax.ws.rs.core.HttpHeaders.LAST_MODIFIED; import static org.jclouds.rackspace.cloudfiles.v1.options.UpdateCDNContainerOptions.Builder.enabled; import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_ENABLED; import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_IOS_URI; @@ -38,14 +35,13 @@ import static org.testng.Assert.assertTrue; import java.net.URI; import java.util.List; -import org.jclouds.io.Payload; -import org.jclouds.io.Payloads; import org.jclouds.openstack.swift.v1.options.ListContainerOptions; import org.jclouds.openstack.v2_0.internal.BaseOpenStackMockTest; import org.jclouds.rackspace.cloudfiles.v1.CloudFilesApi; import org.jclouds.rackspace.cloudfiles.v1.domain.CDNContainer; import org.testng.annotations.Test; +import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.MockWebServer; @@ -81,6 +77,27 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp } } + public void testListIsEmpty() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404))); + + try { + CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); + CDNApi cdnApi = api.cdnApiInRegion("DFW"); + + List<CDNContainer> cdnContainers = cdnApi.list().toList(); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertRequest(server.takeRequest(), "GET", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/?format=json&enabled_only=true"); + + assertTrue(cdnContainers.isEmpty()); + } finally { + server.shutdown(); + } + } + public void testListWithOptions() throws Exception { MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); @@ -90,11 +107,11 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); ListContainerOptions options = ListContainerOptions.Builder.marker("cdn-container-3"); ImmutableList<CDNContainer> containers = api.cdnApiInRegion("DFW").list(options).toList(); - + for(CDNContainer container : containers) { - checkCDNContainer(container); + assertCDNContainerNotNull(container); } - + assertEquals(containers, mockContainers.subList(2, mockContainers.size())); assertEquals(server.getRequestCount(), 2); @@ -105,34 +122,60 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp } } - public void testEnableAndDisable() throws Exception { + public void testListWithOptionsIsEmpty() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404))); + + try { + CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); + ListContainerOptions options = ListContainerOptions.Builder.marker("cdn-container-3"); + FluentIterable<CDNContainer> containers = api.cdnApiInRegion("DFW").list(options); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertRequest(server.takeRequest(), "GET", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/?format=json&enabled_only=true&marker=cdn-container-3"); + + assertNotNull(containers); + assertTrue(containers.isEmpty()); + } finally { + server.shutdown(); + } + } + + public void testEnable() throws Exception { MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(201))); - server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(201))); - server.enqueue(addCommonHeaders(disabledResponse().setResponseCode(201))); - + try { CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); - CDNApi cdnApi = api.cdnApiInRegion("DFW"); - + // enable a CDN Container - URI enabledContainer = cdnApi.enable("container-1"); + URI enabledContainer = api.cdnApiInRegion("DFW").enable("container-1"); assertNotNull(enabledContainer); - - // ensure that it is disabled - assertTrue(cdnApi.disable("container-1")); - - // get the container from the CDN and ensure that it is disabled - CDNContainer disabledContainer = cdnApi.get("container-1"); - checkCDNContainer(disabledContainer); - assertFalse(disabledContainer.isEnabled()); - - assertEquals(server.getRequestCount(), 4); + + assertEquals(server.getRequestCount(), 2); assertAuthentication(server); assertRequest(server.takeRequest(), "PUT", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); + } finally { + server.shutdown(); + } + } + + public void testEnableFail() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(404))); + + try { + CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); + // enable a CDN Container + assertNull(api.cdnApiInRegion("DFW").enable("container-1")); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); assertRequest(server.takeRequest(), "PUT", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); - assertRequest(server.takeRequest(), "HEAD", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); } finally { server.shutdown(); } @@ -142,13 +185,12 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(201))); - + try { CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); - CDNApi cdnApi = api.cdnApiInRegion("DFW"); - + // enable a CDN Container with a TTL - URI enabledContainer = cdnApi.enable("container-1", 777777); + URI enabledContainer = api.cdnApiInRegion("DFW").enable("container-1", 777777); assertNotNull(enabledContainer); assertEquals(server.getRequestCount(), 2); @@ -159,6 +201,65 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp } } + public void testEnableWithTTLFail() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(404))); + + try { + CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); + + // enable a CDN Container with a TTL + URI enabledContainer = api.cdnApiInRegion("DFW").enable("container-1", 777777); + assertNull(enabledContainer); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertRequest(server.takeRequest(), "PUT", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); + } finally { + server.shutdown(); + } + } + + public void testDisable() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(201))); + + try { + CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); + + // disable a CDN Container + assertTrue(api.cdnApiInRegion("DFW").disable("container-1")); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertRequest(server.takeRequest(), "PUT", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); + } finally { + server.shutdown(); + } + } + + public void testDisableFail() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(404))); + + try { + CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); + + // disable a CDN Container + boolean disbledContainer = api.cdnApiInRegion("DFW").disable("container-1"); + assertFalse(disbledContainer); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertRequest(server.takeRequest(), "PUT", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); + } finally { + server.shutdown(); + } + } + public void testGet() throws Exception { MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); @@ -166,10 +267,9 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp try { CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); - CDNApi cdnApi = api.cdnApiInRegion("DFW"); - CDNContainer cdnContainer = cdnApi.get("container-1"); - checkCDNContainer(cdnContainer); + CDNContainer cdnContainer = api.cdnApiInRegion("DFW").get("container-1"); + assertCDNContainerNotNull(cdnContainer); assertEquals(mockCDNContainer, cdnContainer); assertEquals(server.getRequestCount(), 2); @@ -179,17 +279,16 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp server.shutdown(); } } - + public void testGetFail() throws Exception { MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404))); - + try { CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); - CDNApi cdnApi = api.cdnApiInRegion("DFW"); - CDNContainer cdnContainer = cdnApi.get("container-1"); + CDNContainer cdnContainer = api.cdnApiInRegion("DFW").get("container-1"); assertAuthentication(server); assertRequest(server.takeRequest(), "HEAD", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); @@ -203,14 +302,32 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(201))); - + try { CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); - CDNApi cdnApi = api.cdnApiInRegion("DFW"); - + // purge the object - assertTrue(cdnApi.purgeObject("myContainer", "myObject", emails)); - + assertTrue(api.cdnApiInRegion("DFW").purgeObject("myContainer", "myObject", emails)); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertRequest(server.takeRequest(), "DELETE", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/myContainer/myObject"); + } finally { + server.shutdown(); + } + } + + public void testPurgeObjectFail() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404))); + + try { + CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); + + // purge the object + assertFalse(api.cdnApiInRegion("DFW").purgeObject("myContainer", "myObject", emails)); + assertEquals(server.getRequestCount(), 2); assertAuthentication(server); assertRequest(server.takeRequest(), "DELETE", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/myContainer/myObject"); @@ -221,24 +338,23 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp public void testUpdate() throws Exception { MockWebServer server = mockOpenStackServer(); - server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")).setResponseCode(200))); //POST + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")).setResponseCode(200))); server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(200))); server.enqueue(addCommonHeaders(updatedResponse().setResponseCode(204))); server.enqueue(addCommonHeaders(updatedResponse().setResponseCode(200))); - + try { CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); - CDNApi cdnApi = api.cdnApiInRegion("DFW"); - - CDNContainer cdnContainer = cdnApi.get("container-1"); - checkCDNContainer(cdnContainer); - + + CDNContainer cdnContainer = api.cdnApiInRegion("DFW").get("container-1"); + assertCDNContainerNotNull(cdnContainer); + // update the CDN Container - assertTrue(cdnApi.update("container-1", enabled(false).logRetention(true).ttl(7654321))); - - cdnContainer = cdnApi.get("container-1"); - checkCDNContainer(cdnContainer); - + assertTrue(api.cdnApiInRegion("DFW").update("container-1", enabled(false).logRetention(true).ttl(7654321))); + + cdnContainer = api.cdnApiInRegion("DFW").get("container-1"); + assertCDNContainerNotNull(cdnContainer); + CDNContainer updatedContainer = CDNContainer.builder() .name("container-1") .enabled(false) @@ -249,9 +365,9 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp .streamingUri(URI.create("http://streaming-id-1.stream.rackspace.com")) .iosUri(URI.create("http://ios-id-1.iosr.rackspace.com")) .build(); - + assertEquals(updatedContainer, cdnContainer); - + assertEquals(server.getRequestCount(), 4); assertAuthentication(server); assertRequest(server.takeRequest(), "HEAD", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); @@ -262,15 +378,39 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp } } - private static void checkCDNContainer(CDNContainer cdnContainer) { - assertNotNull(cdnContainer.getName()); - assertNotNull(cdnContainer.isEnabled()); - assertNotNull(cdnContainer.isLogRetentionEnabled()); - assertNotNull(cdnContainer.getTtl()); - assertNotNull(cdnContainer.getUri()); - assertNotNull(cdnContainer.getSslUri()); - assertNotNull(cdnContainer.getStreamingUri()); - assertNotNull(cdnContainer.getIosUri()); + public void testUpdateFail() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")).setResponseCode(200))); + server.enqueue(addCommonHeaders(enabledResponse().setResponseCode(200))); + server.enqueue(addCommonHeaders(updatedResponse().setResponseCode(404))); + + try { + CloudFilesApi api = api(server.getUrl("/").toString(), "rackspace-cloudfiles"); + + CDNContainer cdnContainer = api.cdnApiInRegion("DFW").get("container-1"); + assertCDNContainerNotNull(cdnContainer); + + // update the CDN Container + assertFalse(api.cdnApiInRegion("DFW").update("container-1", enabled(false).logRetention(true).ttl(7654321))); + + assertEquals(server.getRequestCount(), 3); + assertAuthentication(server); + assertRequest(server.takeRequest(), "HEAD", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); + assertRequest(server.takeRequest(), "POST", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/container-1"); + } finally { + server.shutdown(); + } + } + + private static final void assertCDNContainerNotNull(CDNContainer container) { + assertNotNull(container.getName()); + assertNotNull(container.isEnabled()); + assertNotNull(container.isLogRetentionEnabled()); + assertNotNull(container.getTtl()); + assertNotNull(container.getUri()); + assertNotNull(container.getSslUri()); + assertNotNull(container.getStreamingUri()); + assertNotNull(container.getIosUri()); } private static final CDNContainer mockCDNContainer = CDNContainer.builder() @@ -296,19 +436,6 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp .addHeader(CONTENT_LENGTH, "0") .addHeader(CONTENT_TYPE, "text/plain; charset=UTF-8"); } - - private static MockResponse disabledResponse() { - return new MockResponse() - .addHeader(CDN_ENABLED, "false") - .addHeader(CDN_LOG_RETENTION, "false") - .addHeader(CDN_TTL, "777777") - .addHeader(CDN_URI,"http://id-1.cdn.rackspace.com") - .addHeader(CDN_SSL_URI, "https://ssl-id-1.ssl.rackspace.com") - .addHeader(CDN_STREAMING_URI, "http://streaming-id-1.stream.rackspace.com") - .addHeader(CDN_IOS_URI, "http://ios-id-1.iosr.rackspace.com") - .addHeader(CONTENT_LENGTH, "0") - .addHeader(CONTENT_TYPE, "text/plain; charset=UTF-8"); - } private static MockResponse updatedResponse() { return new MockResponse() @@ -364,23 +491,4 @@ public class CloudFilesCDNApiMockTest extends BaseOpenStackMockTest<CloudFilesAp .streamingUri(URI.create("http://streaming-id-4.stream.rackspace.com")) .iosUri(URI.create("http://ios-id-4.iosr.rackspace.com")) .build()); - - private static MockResponse objectResponse() { - return new MockResponse() - .addHeader(LAST_MODIFIED, "Fri, 12 Jun 2010 13:40:18 GMT") - .addHeader(ETAG, "8a964ee2a5e88be344f36c22562a6486") - // TODO: MWS doesn't allow you to return content length w/o content - // on HEAD! - .setBody("ABCD".getBytes(US_ASCII)) - .addHeader(CONTENT_LENGTH, "4").addHeader(CONTENT_TYPE, "text/plain; charset=UTF-8"); - } - - private static final byte[] NO_CONTENT = new byte[] {}; - - private static Payload payload(long bytes, String contentType) { - Payload payload = Payloads.newByteArrayPayload(NO_CONTENT); - payload.getContentMetadata().setContentLength(bytes); - payload.getContentMetadata().setContentType(contentType); - return payload; - } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/052e6cc8/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java ---------------------------------------------------------------------- diff --git a/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java b/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java new file mode 100644 index 0000000..3ff8c00 --- /dev/null +++ b/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java @@ -0,0 +1,111 @@ +/* + * 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.jclouds.rackspace.cloudfiles.v1.options; + +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_DIRECTORY_TYPE; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_ERROR; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_INDEX; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_LISTINGS; +import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.STATIC_WEB_LISTINGS_CSS; +import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_LOG_RETENTION; +import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_TTL; +import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_TTL_MAX; +import static org.jclouds.rackspace.cloudfiles.v1.reference.CloudFilesHeaders.CDN_TTL_MIN; +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.net.MediaType; + +/** + * Tests behavior of {@link UpdateCDNContainerOptions}. + * + * @author Jeremy Daggett + */ +@Test(groups = "unit") +public class UpdateCDNContainerOptionsTest { + + public void testTTLInRange() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().ttl(123456); + assertEquals(ImmutableList.of("123456"), options.buildRequestHeaders().get(CDN_TTL)); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testTTLLessThanMin() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().ttl(CDN_TTL_MIN - 1); + options.buildRequestHeaders().get(CDN_TTL); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testTTLGreaterThanMax() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().ttl(CDN_TTL_MAX + 1); + options.buildRequestHeaders().get(CDN_TTL); + } + + public void testEnableLogRetention() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().logRetention(true); + assertEquals(ImmutableList.of("true"), options.buildRequestHeaders().get(CDN_LOG_RETENTION)); + } + + public void testDisableLogRetention() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().logRetention(false); + assertEquals(ImmutableList.of("false"), options.buildRequestHeaders().get(CDN_LOG_RETENTION)); + } + + public void testStaticWebsiteDirectoryType() { + MediaType appDir = MediaType.create("application", "directory"); + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().staticWebsiteDirectoryType(appDir); + assertEquals(ImmutableList.of(appDir.toString()), options.buildRequestHeaders().get(STATIC_WEB_DIRECTORY_TYPE)); + } + + public void testStaticWebsiteIndexPage() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().staticWebsiteIndexPage("index.html"); + assertEquals(ImmutableList.of("index.html"), options.buildRequestHeaders().get(STATIC_WEB_INDEX)); + } + + public void testStaticWebsiteErrorPage() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().staticWebsiteErrorPage("error.html"); + assertEquals(ImmutableList.of("error.html"), options.buildRequestHeaders().get(STATIC_WEB_ERROR)); + } + + public void testEnableStaticWebsiteListings() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().staticWebsiteListings(true); + assertEquals(ImmutableList.of("true"), options.buildRequestHeaders().get(STATIC_WEB_LISTINGS)); + } + + public void testDiableStaticWebsiteListings() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().staticWebsiteListings(false); + assertEquals(ImmutableList.of("false"), options.buildRequestHeaders().get(STATIC_WEB_LISTINGS)); + } + + public void testStaticWebsiteListingsCSS() { + UpdateCDNContainerOptions options = + new UpdateCDNContainerOptions().staticWebsiteListingsCSS("listings.css"); + assertEquals(ImmutableList.of("listings.css"), options.buildRequestHeaders().get(STATIC_WEB_LISTINGS_CSS)); + } +}
