Adds paging fail tests for Queues. Implements Queues-specific fallback.
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/fallbacks/EmptyQueuesFallback.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/fallbacks/EmptyQueuesFallback.java
new file mode 100644
index 0000000..a3ac019
--- /dev/null
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/fallbacks/EmptyQueuesFallback.java
@@ -0,0 +1,45 @@
+/*
+ * 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.openstack.marconi.v1.fallbacks;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.jclouds.Fallback;
+import org.jclouds.openstack.marconi.v1.domain.Queues;
+import org.jclouds.rest.ResourceNotFoundException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Throwables.propagate;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+import static org.jclouds.http.HttpUtils.contains404;
+import static org.jclouds.util.Throwables2.getFirstThrowableOfType;
+
+public class EmptyQueuesFallback implements Fallback<Queues> {
+
+   public ListenableFuture<Queues> create(Throwable t) throws Exception {
+      return immediateFuture(createOrPropagate(t));
+   }
+
+   @Override
+   public Queues createOrPropagate(Throwable t) throws Exception {
+      if ((getFirstThrowableOfType(checkNotNull(t, "throwable"), ResourceNotFoundException.class) != null)
+            || contains404(t)) {
+         return Queues.EMPTY;
+      }
+      throw propagate(t);
+   }
+}
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
index 7df6093..be81eb4 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
@@ -21,6 +21,7 @@
 import org.jclouds.openstack.marconi.v1.domain.Queue;
 import org.jclouds.openstack.marconi.v1.domain.QueueStats;
 import org.jclouds.openstack.marconi.v1.domain.Queues;
+import org.jclouds.openstack.marconi.v1.fallbacks.EmptyQueuesFallback;
 import org.jclouds.openstack.marconi.v1.functions.ParseQueueStats;
 import org.jclouds.openstack.marconi.v1.functions.ParseQueues;
 import org.jclouds.openstack.marconi.v1.functions.QueuesToPagedIterable;
@@ -47,7 +48,6 @@
 
 import static org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
 import static org.jclouds.Fallbacks.FalseOnNotFoundOr404;
-import static org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
 
 /**
  * Provides access to Queues via their REST API.
@@ -114,7 +114,7 @@
    @GET
    @ResponseParser(ParseQueues.class)
    @Consumes(MediaType.APPLICATION_JSON)
-   @Fallback(EmptyPaginatedCollectionOnNotFoundOr404.class)
+   @Fallback(EmptyQueuesFallback.class)
    @Path("queues")
    Queues list(ListQueuesOptions options);
 
diff --git a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiMockTest.java b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiMockTest.java
index fb535b7..0307e7d 100644
--- a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiMockTest.java
+++ b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiMockTest.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.openstack.marconi.v1.features;
 
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.squareup.okhttp.mockwebserver.MockResponse;
@@ -25,6 +26,7 @@
 import org.jclouds.openstack.marconi.v1.domain.Queue;
 import org.jclouds.openstack.marconi.v1.domain.QueueStats;
 import org.jclouds.openstack.marconi.v1.domain.Queues;
+import org.jclouds.openstack.marconi.v1.options.ListQueuesOptions;
 import org.jclouds.openstack.v2_0.internal.BaseOpenStackMockTest;
 import org.testng.annotations.Test;
 
@@ -178,6 +180,42 @@
       }
    }
 
+   public void listOnePageOfQueuesFail() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(new MockResponse().setBody(accessRackspace));
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      try {
+         MarconiApi api = api(server.getUrl("/").toString(), "openstack-marconi");
+         QueueApi queueApi = api.getQueueApiForZoneAndClient("DFW", CLIENT_ID);
+
+         FluentIterable<Queue> queues = queueApi.list(false).concat();
+
+         assertTrue(queues.isEmpty(), "Expecting empty queues but was " + queues.toString());
+      }
+      finally {
+         server.shutdown();
+      }
+   }
+
+   public void listPagedIterableCollectionQueuesFail() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(new MockResponse().setBody(accessRackspace));
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      try {
+         MarconiApi api = api(server.getUrl("/").toString(), "openstack-marconi");
+         QueueApi queueApi = api.getQueueApiForZoneAndClient("DFW", CLIENT_ID);
+
+         Queues queues = queueApi.list(ListQueuesOptions.NONE);
+
+         assertTrue(queues.isEmpty(), "Expecting empty queues but was " + queues.toString());
+      }
+      finally {
+         server.shutdown();
+      }
+   }
+
    public void listManyPagesOfQueues() throws Exception {
       MockWebServer server = mockOpenStackServer();
       server.enqueue(new MockResponse().setBody(accessRackspace));