You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by za...@apache.org on 2015/04/07 23:33:04 UTC

[06/32] jclouds git commit: Refactored CDN headers and test classes

Refactored CDN headers and test classes


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/d13ff0eb
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/d13ff0eb
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/d13ff0eb

Branch: refs/heads/master
Commit: d13ff0ebd972198482c60e5971770ffe3eb53264
Parents: 1814627
Author: Jeremy Daggett <je...@rackspace.com>
Authored: Mon Mar 10 11:40:08 2014 -0700
Committer: Everett Toews <ev...@rackspace.com>
Committed: Thu Apr 3 16:46:35 2014 -0500

----------------------------------------------------------------------
 .../v1/options/UpdateCDNContainerOptions.java   |  86 +++---
 .../v1/reference/CloudFilesHeaders.java         |   9 +-
 .../v1/features/CloudFilesCDNApiLiveTest.java   | 129 ++++++--
 .../v1/features/CloudFilesCDNApiMockTest.java   | 302 +++++++++++++------
 .../options/UpdateCDNContainerOptionsTest.java  | 111 +++++++
 5 files changed, 476 insertions(+), 161 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/d13ff0eb/apis/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java
----------------------------------------------------------------------
diff --git a/apis/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java b/apis/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java
index d044657..0fcb177 100644
--- a/apis/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptions.java
+++ b/apis/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/blob/d13ff0eb/apis/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java
----------------------------------------------------------------------
diff --git a/apis/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java b/apis/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java
index 7247700..c6d2bc5 100644
--- a/apis/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/reference/CloudFilesHeaders.java
+++ b/apis/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/blob/d13ff0eb/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java b/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java
index 15a9dd9..3e450fd 100644
--- a/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiLiveTest.java
+++ b/apis/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/blob/d13ff0eb/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java
----------------------------------------------------------------------
diff --git a/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java b/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java
index 8e55c2e..18cd36c 100644
--- a/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/features/CloudFilesCDNApiMockTest.java
+++ b/apis/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/blob/d13ff0eb/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java
----------------------------------------------------------------------
diff --git a/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java b/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java
new file mode 100644
index 0000000..3ff8c00
--- /dev/null
+++ b/apis/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));
+   }
+}