http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LimitApiTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LimitApiTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LimitApiTest.java
new file mode 100644
index 0000000..ea432f0
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LimitApiTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.cloudstack.features;
+import static org.jclouds.reflect.Reflection2.method;
+
+import java.io.IOException;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiTest;
+import org.jclouds.cloudstack.options.ListResourceLimitsOptions;
+import org.jclouds.http.functions.ParseFirstJsonValueNamed;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.reflect.Invokable;
+
+/**
+ * Tests behavior of {@code LimitApi}
+ */
+@Test(groups = "unit", testName = "LimitApiTest")
+public class LimitApiTest extends BaseCloudStackApiTest<LimitApi> {
+
+   public void testListResourceLimits() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(LimitApi.class, "listResourceLimits", 
ListResourceLimitsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.of());
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listResourceLimits&listAll=true
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListResourceLimitsOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(LimitApi.class, "listResourceLimits", 
ListResourceLimitsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(ListResourceLimitsOptions.Builder.account("jclouds" , 
"23")));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listResourceLimits&listAll=true&account=jclouds&domainid=23
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java
new file mode 100644
index 0000000..82d3a62
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java
@@ -0,0 +1,226 @@
+/*
+ * 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.cloudstack.features;
+
+import static com.google.common.collect.Iterables.find;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static 
org.jclouds.cloudstack.predicates.NetworkPredicates.hasLoadBalancerService;
+import static 
org.jclouds.cloudstack.predicates.NetworkPredicates.isVirtualNetwork;
+import static org.jclouds.util.Predicates2.retry;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.AsyncJob;
+import org.jclouds.cloudstack.domain.JobResult;
+import org.jclouds.cloudstack.domain.LoadBalancerRule;
+import org.jclouds.cloudstack.domain.LoadBalancerRule.Algorithm;
+import org.jclouds.cloudstack.domain.LoadBalancerRule.State;
+import org.jclouds.cloudstack.domain.Network;
+import org.jclouds.cloudstack.domain.PublicIPAddress;
+import org.jclouds.cloudstack.domain.VirtualMachine;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest;
+import org.jclouds.cloudstack.predicates.LoadBalancerRuleActive;
+import org.jclouds.ssh.SshException;
+import org.testng.annotations.AfterGroups;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.net.HostAndPort;
+
+/**
+ * Tests behavior of {@code LoadBalancerApiLiveTest}
+ */
+@Test(groups = "live", singleThreaded = true, testName = 
"LoadBalancerApiLiveTest")
+public class LoadBalancerApiLiveTest extends BaseCloudStackApiLiveTest {
+   private PublicIPAddress ip = null;
+   private VirtualMachine vm;
+   private LoadBalancerRule rule;
+   private Predicate<LoadBalancerRule> loadBalancerRuleActive;
+   private Network network;
+   private boolean networksDisabled;
+
+   @BeforeGroups(groups = "live")
+   public void setupContext() {
+      super.setupContext();
+      loadBalancerRuleActive = retry(new LoadBalancerRuleActive(client), 60, 
1, 1, SECONDS);
+      prefix += "rule";
+      try {
+         network = find(client.getNetworkApi().listNetworks(),
+               Predicates.and(hasLoadBalancerService(), isVirtualNetwork(),
+                  new Predicate<Network>() {
+                     @Override
+                     public boolean apply(Network network) {
+                        return network.isDefault()
+                           && !network.isSecurityGroupEnabled()
+                           && !network.isSystem()
+                           && network.getAccount().equals(user.getName());
+                     }
+                  }));
+      } catch (NoSuchElementException e) {
+         networksDisabled = true;
+      }
+   }
+
+   public void testCreateVm() {
+      if (networksDisabled)
+         return;
+      String defaultTemplate = template != null ? template.getImageId() : null;
+      vm = VirtualMachineApiLiveTest.createVirtualMachineInNetwork(network,
+            defaultTemplateOrPreferredInZone(defaultTemplate, client, 
network.getZoneId()),
+            client, jobComplete, virtualMachineRunning);
+      if (vm.getPassword() != null && 
!loginCredentials.getOptionalPassword().isPresent())
+         loginCredentials = 
loginCredentials.toBuilder().password(vm.getPassword()).build();
+   }
+
+   @Test(dependsOnMethods = "testCreateVm")
+   public void testCreateLoadBalancerRule() throws Exception {
+      if (networksDisabled)
+         return;
+      int attempts = 0;
+      while (rule == null && attempts < 10) {
+         ip = reuseOrAssociate.apply(network);
+         try {
+            String jobId = 
client.getLoadBalancerApi().createLoadBalancerRuleForPublicIP(ip.getId(),
+                  Algorithm.LEASTCONN, prefix, 22, 22);
+            assertTrue(jobComplete.apply(jobId));
+            AsyncJob<LoadBalancerRule> asyncJob = 
client.getAsyncJobApi().getAsyncJob(jobId);
+            LoadBalancerRule result = asyncJob.getResult();
+            rule = result;
+         } catch (IllegalStateException e) {
+            // very likely an ip conflict, so retry;
+            attempts++;
+         }
+      }
+      assertNotNull(rule, "Failed to get a load balancer rule after " + 
attempts + " attempts");
+      assert rule.getPublicIPId() == ip.getId() : rule;
+      assertEquals(rule.getPublicPort(), 22);
+      assertEquals(rule.getPrivatePort(), 22);
+      assertEquals(rule.getAlgorithm(), Algorithm.LEASTCONN);
+      assertEquals(rule.getName(), prefix);
+      assertEquals(rule.getState(), State.ADD);
+      
assertEquals(client.getLoadBalancerApi().listVirtualMachinesAssignedToLoadBalancerRule(rule.getId()).size(),
 0);
+      checkRule(rule);
+
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancerRule")
+   public void testAssignToLoadBalancerRule() throws Exception {
+      if (networksDisabled)
+         return;
+      String jobId = 
client.getLoadBalancerApi().assignVirtualMachinesToLoadBalancerRule(rule.getId(),
 vm.getId());
+      assertTrue(jobComplete.apply(jobId));
+      AsyncJob<JobResult> result = client.getAsyncJobApi().getAsyncJob(jobId);
+      assertTrue(result.hasSucceed());
+      Set<VirtualMachine> machines = 
client.getLoadBalancerApi().listVirtualMachinesAssignedToLoadBalancerRule(
+            rule.getId());
+      assertEquals(machines.size(), 1);
+      assertTrue(loadBalancerRuleActive.apply(rule), rule.toString());
+   }
+
+   @Test(dependsOnMethods = "testAssignToLoadBalancerRule")
+   public void testCanSshInThroughNewLoadBalancerRule() throws Exception {
+      loopAndCheckSSH();
+   }
+
+   // note that when in LB mode, there's a chance you'll have a connection
+   // failure
+   private void loopAndCheckSSH() throws IOException {
+      for (int i = 0; i < 5; i++) {// retry loop TODO replace with predicate.
+         try {
+            checkSSH(HostAndPort.fromParts(ip.getIPAddress(), 22));
+            return;
+         } catch (SshException e) {
+            e.printStackTrace();
+            try {
+               Thread.sleep(10 * 1000);
+            } catch (InterruptedException e1) {
+            }
+            continue;
+         }
+      }
+   }
+
+   @Test(dependsOnMethods = "testAssignToLoadBalancerRule", expectedExceptions 
= SshException.class)
+   public void testRemoveFromLoadBalancerRule() throws Exception {
+      if (networksDisabled)
+         throw new SshException();
+      
assertTrue(jobComplete.apply(client.getLoadBalancerApi().removeVirtualMachinesFromLoadBalancerRule(
+            rule.getId(), vm.getId())));
+      
assertEquals(client.getLoadBalancerApi().listVirtualMachinesAssignedToLoadBalancerRule(rule.getId()).size(),
 0);
+      assertEquals(rule.getState(), State.ADD);
+      checkSSH(HostAndPort.fromParts(ip.getIPAddress(), 22));
+   }
+
+   @AfterGroups(groups = "live")
+   @Override
+   protected void tearDownContext() {
+      if (rule != null) {
+         
assertTrue(jobComplete.apply(client.getLoadBalancerApi().deleteLoadBalancerRule(rule.getId())));
+      }
+      if (vm != null) {
+         
assertTrue(jobComplete.apply(client.getVirtualMachineApi().destroyVirtualMachine(vm.getId())));
+      }
+      if (ip != null) {
+         client.getAddressApi().disassociateIPAddress(ip.getId());
+      }
+      super.tearDownContext();
+   }
+
+   public void testListLoadBalancerRules() throws Exception {
+      Set<LoadBalancerRule> response = 
client.getLoadBalancerApi().listLoadBalancerRules();
+      assert null != response;
+      assertTrue(response.size() >= 0);
+      for (LoadBalancerRule rule : response) {
+         LoadBalancerRule newDetails = findRuleWithId(rule.getId());
+         assertEquals(rule.getId(), newDetails.getId());
+         checkRule(rule);
+      }
+   }
+
+   private LoadBalancerRule findRuleWithId(final String id) {
+      return find(client.getLoadBalancerApi().listLoadBalancerRules(), new 
Predicate<LoadBalancerRule>() {
+
+         @Override
+         public boolean apply(LoadBalancerRule arg0) {
+            return arg0.getId() == id;
+         }
+
+      });
+   }
+
+   protected void checkRule(LoadBalancerRule rule) {
+      assertEquals(rule.getId(), findRuleWithId(rule.getId()).getId());
+      assert rule.getId() != null : rule;
+      assert rule.getAccount() != null : rule;
+      assert rule.getAlgorithm() != null : rule;
+      assert rule.getPrivatePort() > 0 : rule;
+      assert rule.getPublicPort() > 0 : rule;
+      assert rule.getDomain() != null : rule;
+      assert rule.getDomainId() != null : rule;
+      assert rule.getState() != null : rule;
+      assert rule.getName() != null : rule;
+      assert rule.getPublicIP() != null : rule;
+      assert rule.getPublicIPId() != null : rule;
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiTest.java
new file mode 100644
index 0000000..5656072
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiTest.java
@@ -0,0 +1,159 @@
+/*
+ * 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.cloudstack.features;
+
+import static org.jclouds.reflect.Reflection2.method;
+
+import java.io.IOException;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.cloudstack.domain.LoadBalancerRule.Algorithm;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiTest;
+import org.jclouds.cloudstack.options.CreateLoadBalancerRuleOptions;
+import org.jclouds.cloudstack.options.ListLoadBalancerRulesOptions;
+import org.jclouds.cloudstack.options.UpdateLoadBalancerRuleOptions;
+import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseFirstJsonValueNamed;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.reflect.Invokable;
+/**
+ * Tests behavior of {@code LoadBalancerApi}
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "LoadBalancerApiTest")
+public class LoadBalancerApiTest extends 
BaseCloudStackApiTest<LoadBalancerApi> {
+   public void testListLoadBalancerRules() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(LoadBalancerApi.class, 
"listLoadBalancerRules",
+            ListLoadBalancerRulesOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.of());
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listLoadBalancerRules&listAll=true
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListLoadBalancerRulesOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(LoadBalancerApi.class, 
"listLoadBalancerRules",
+            ListLoadBalancerRulesOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> 
of(ListLoadBalancerRulesOptions.Builder.publicIPId("3")));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listLoadBalancerRules&listAll=true&publicipid=3
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   HttpRequest createLoadBalancerRule = HttpRequest.builder().method("GET")
+                                                   
.endpoint("http://localhost:8080/client/api";)
+                                                   .addQueryParam("response", 
"json")
+                                                   .addQueryParam("command", 
"createLoadBalancerRule")
+                                                   
.addQueryParam("publicipid", "6")
+                                                   .addQueryParam("algorithm", 
"leastconn")
+                                                   .addQueryParam("name", 
"tcp")
+                                                   
.addQueryParam("privateport", "22")
+                                                   
.addQueryParam("publicport", "22").build();
+
+   public void testCreateLoadBalancerRuleForPublicIP() throws 
SecurityException, NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(LoadBalancerApi.class, 
"createLoadBalancerRuleForPublicIP", String.class,
+            Algorithm.class, String.class, int.class, int.class, 
CreateLoadBalancerRuleOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(6, Algorithm.LEASTCONN, "tcp", 22, 22));
+
+      assertRequestLineEquals(httpRequest, 
createLoadBalancerRule.getRequestLine());
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testUpdateLoadBalancerRule() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(LoadBalancerApi.class, 
"updateLoadBalancerRule", String.class, UpdateLoadBalancerRuleOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(5));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=updateLoadBalancerRule&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testDeleteLoadBalancerRule() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(LoadBalancerApi.class, 
"deleteLoadBalancerRule", String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(5));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=deleteLoadBalancerRule&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListVirtualMachinesAssignedToLoadBalancerRule() throws 
SecurityException, NoSuchMethodException,
+         IOException {
+      Invokable<?, ?> method = method(LoadBalancerApi.class, 
"listVirtualMachinesAssignedToLoadBalancerRule",
+            String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(5));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listLoadBalancerRuleInstances&listAll=true&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NATApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NATApiLiveTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NATApiLiveTest.java
new file mode 100644
index 0000000..2ecd4b6
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NATApiLiveTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.cloudstack.features;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.IPForwardingRule;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest;
+import org.jclouds.cloudstack.options.ListIPForwardingRulesOptions;
+import org.testng.annotations.Test;
+
+/**
+ * Tests behavior of {@code NATApiLiveTest}
+ */
+@Test(groups = "live", singleThreaded = true, testName = "NATApiLiveTest")
+public class NATApiLiveTest extends BaseCloudStackApiLiveTest {
+
+   @Test(enabled = false)
+   // takes too long
+   public void testListIPForwardingRules() throws Exception {
+      Set<IPForwardingRule> response = 
client.getNATApi().listIPForwardingRules();
+      assert null != response;
+      assertTrue(response.size() >= 0);
+      for (IPForwardingRule rule : response) {
+         IPForwardingRule newDetails = 
getOnlyElement(client.getNATApi().listIPForwardingRules(
+               ListIPForwardingRulesOptions.Builder.id(rule.getId())));
+         assertEquals(rule.getId(), newDetails.getId());
+         checkRule(rule);
+      }
+   }
+
+   protected void checkRule(IPForwardingRule rule) {
+      assertEquals(rule.getId(), 
client.getNATApi().getIPForwardingRule(rule.getId()).getId());
+      assert rule.getId() != null : rule;
+      assert rule.getIPAddress() != null : rule;
+      assert rule.getIPAddressId() != null : rule;
+      assert rule.getStartPort() > 0 : rule;
+      assert rule.getProtocol() != null : rule;
+      assert rule.getEndPort() > 0 : rule;
+      assert rule.getState() != null : rule;
+      assert rule.getVirtualMachineId() != null : rule;
+      assert rule.getVirtualMachineName() != null : rule;
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NATApiTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NATApiTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NATApiTest.java
new file mode 100644
index 0000000..2308e01
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NATApiTest.java
@@ -0,0 +1,200 @@
+/*
+ * 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.cloudstack.features;
+
+import static org.jclouds.reflect.Reflection2.method;
+
+import java.io.IOException;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiTest;
+import org.jclouds.cloudstack.options.CreateIPForwardingRuleOptions;
+import org.jclouds.cloudstack.options.ListIPForwardingRulesOptions;
+import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseFirstJsonValueNamed;
+import org.jclouds.http.functions.ReleasePayloadAndReturn;
+import org.jclouds.http.functions.UnwrapOnlyJsonValue;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.reflect.Invokable;
+/**
+ * Tests behavior of {@code NATApi}
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "NATApiTest")
+public class NATApiTest extends BaseCloudStackApiTest<NATApi> {
+   public void testListIPForwardingRules() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NATApi.class, "listIPForwardingRules", 
ListIPForwardingRulesOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.of());
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listIpForwardingRules&listAll=true
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListIPForwardingRulesOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NATApi.class, "listIPForwardingRules", 
ListIPForwardingRulesOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(
+            ListIPForwardingRulesOptions.Builder.virtualMachineId("3")));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listIpForwardingRules&listAll=true&virtualmachineid=3
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testGetIPForwardingRule() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NATApi.class, "getIPForwardingRule", 
String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(5));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listIpForwardingRules&listAll=true&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   HttpRequest createIpForwardingRule = HttpRequest.builder().method("GET")
+                                                             
.endpoint("http://localhost:8080/client/api";)
+                                                             
.addQueryParam("response", "json")
+                                                             
.addQueryParam("command", "createIpForwardingRule")
+                                                             
.addQueryParam("ipaddressid", "7")
+                                                             
.addQueryParam("protocol", "tcp")
+                                                             
.addQueryParam("startport", "22").build();
+
+   public void testCreateIPForwardingRuleForVirtualMachine() throws 
SecurityException, NoSuchMethodException,
+         IOException {
+      Invokable<?, ?> method = method(NATApi.class, "createIPForwardingRule", 
String.class, String.class, int.class,
+            CreateIPForwardingRuleOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(7, "tcp", 22));
+
+      assertRequestLineEquals(httpRequest, 
createIpForwardingRule.getRequestLine());
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
UnwrapOnlyJsonValue.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   HttpRequest createIpForwardingRuleOptions = 
HttpRequest.builder().method("GET")
+                                                          
.endpoint("http://localhost:8080/client/api";)
+                                                          
.addQueryParam("response", "json")
+                                                          
.addQueryParam("command", "createIpForwardingRule")
+                                                          
.addQueryParam("ipaddressid", "7")
+                                                          
.addQueryParam("protocol", "tcp")
+                                                          
.addQueryParam("startport", "22")
+                                                          
.addQueryParam("endport", "22").build();
+
+   public void testCreateIPForwardingRuleForVirtualMachineOptions() throws 
SecurityException, NoSuchMethodException,
+         IOException {
+      Invokable<?, ?> method = method(NATApi.class, "createIPForwardingRule", 
String.class, String.class, int.class,
+            CreateIPForwardingRuleOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(7, "tcp", 22,
+            CreateIPForwardingRuleOptions.Builder.endPort(22)));
+
+      assertRequestLineEquals(httpRequest, 
createIpForwardingRuleOptions.getRequestLine());
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
UnwrapOnlyJsonValue.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testEnableStaticNATForVirtualMachine() throws 
SecurityException, NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NATApi.class, 
"enableStaticNATForVirtualMachine", String.class, String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(5, 6));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=enableStaticNat&virtualmachineid=5&ipaddressid=6
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ReleasePayloadAndReturn.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testDisableStaticNATOnPublicIP() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NATApi.class, 
"disableStaticNATOnPublicIP", String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(5));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=disableStaticNat&ipaddressid=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testDeleteIPForwardingRule() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NATApi.class, "deleteIPForwardingRule", 
String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(5));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=deleteIpForwardingRule&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NetworkApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NetworkApiLiveTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NetworkApiLiveTest.java
new file mode 100644
index 0000000..23978c9
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NetworkApiLiveTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.cloudstack.features;
+
+import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.get;
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static org.jclouds.cloudstack.options.CreateNetworkOptions.Builder.vlan;
+import static 
org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.specifyVLAN;
+import static 
org.jclouds.cloudstack.options.ListNetworksOptions.Builder.accountInDomain;
+import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.id;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.jclouds.cloudstack.domain.GuestIPType;
+import org.jclouds.cloudstack.domain.Network;
+import org.jclouds.cloudstack.domain.NetworkOffering;
+import org.jclouds.cloudstack.domain.Zone;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest;
+import org.jclouds.cloudstack.predicates.NetworkOfferingPredicates;
+import org.jclouds.cloudstack.predicates.ZonePredicates;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+/**
+ * Tests behavior of {@code NetworkApiLiveTest}
+ */
+@Test(groups = "live", singleThreaded = true, testName = "NetworkApiLiveTest")
+public class NetworkApiLiveTest extends BaseCloudStackApiLiveTest {
+
+   private boolean networksSupported;
+   private Zone zone;
+
+   @BeforeGroups(groups = "live")
+   public void setupContext() {
+      super.setupContext();
+
+      try {
+         zone = find(client.getZoneApi().listZones(), 
ZonePredicates.supportsAdvancedNetworks());
+         networksSupported = true;
+      } catch (NoSuchElementException e) {
+      }
+   }
+
+   @Test
+   public void testCreateGuestVirtualNetwork() {
+      if (!networksSupported)
+         return;
+      final NetworkOffering offering;
+      try {
+         offering = find(client.getOfferingApi().listNetworkOfferings(),
+               NetworkOfferingPredicates.supportsGuestVirtualNetworks());
+
+      } catch (NoSuchElementException e) {
+         Logger.getAnonymousLogger().log(Level.SEVERE, "guest networks not 
supported, skipping test");
+         return;
+      }
+      String name = prefix + "-virtual";
+
+      Network network = null;
+      try {
+         network = client.getNetworkApi().createNetworkInZone(zone.getId(), 
offering.getId(), name, name);
+         checkNetwork(network);
+      } catch (IllegalStateException e) {
+         Logger.getAnonymousLogger().log(Level.SEVERE, "couldn't create a 
network, skipping test", e);
+      } finally {
+         if (network != null) {
+            String jobId = 
client.getNetworkApi().deleteNetwork(network.getId());
+            if (jobId != null)
+               jobComplete.apply(jobId);
+         }
+      }
+   }
+
+   @Test
+   public void testCreateVLANNetwork() {
+      skipIfNotDomainAdmin();
+      if (!networksSupported)
+         return;
+
+      final NetworkOffering offering;
+      try {
+         offering = get(
+               
cloudStackContext.getApi().getOfferingApi().listNetworkOfferings(specifyVLAN(true).zoneId(zone.getId())),
 0);
+      } catch (NoSuchElementException e) {
+         Logger.getAnonymousLogger().log(Level.SEVERE, "VLAN networks not 
supported, skipping test");
+         return;
+      }
+      String name = prefix + "-vlan";
+
+      Network network = null;
+      try {
+         network = domainAdminClient
+               .getNetworkApi()
+               // startIP/endIP/netmask/gateway must be specified together
+               .createNetworkInZone(zone.getId(), offering.getId(), name, name,
+                     
vlan("65").startIP("192.168.1.2").netmask("255.255.255.0").gateway("192.168.1.1"));
+         checkNetwork(network);
+      } catch (IllegalStateException e) {
+         Logger.getAnonymousLogger().log(Level.SEVERE, "couldn't create a 
network, skipping test", e);
+      } finally {
+         if (network != null) {
+            String jobId = 
adminClient.getNetworkApi().deleteNetwork(network.getId());
+            if (jobId != null)
+               adminJobComplete.apply(jobId);
+         }
+      }
+   }
+
+   @Test
+   public void testListNetworks() throws Exception {
+      if (!networksSupported)
+         return;
+      Set<Network> response = client.getNetworkApi().listNetworks(
+            accountInDomain(user.getAccount(), user.getDomainId()));
+      assert null != response;
+      long networkCount = response.size();
+      assertTrue(networkCount >= 0);
+      for (Network network : response) {
+         Network newDetails = 
getOnlyElement(client.getNetworkApi().listNetworks(id(network.getId())));
+         assertEquals(network, newDetails);
+         assertEquals(network, 
client.getNetworkApi().getNetwork(network.getId()));
+         checkNetwork(network);
+      }
+   }
+
+   private void checkNetwork(Network network) {
+      assert network.getId() != null : network;
+      assert network.getName() != null : network;
+      assert network.getDNS().size() != 0 : network;
+      assert network.getGuestIPType() != null && network.getGuestIPType() != 
GuestIPType.UNRECOGNIZED : network;
+      assert network.getBroadcastDomainType() != null : network;
+      assert network.getDisplayText() != null : network;
+      // Network domain can be null sometimes
+      // assert network.getNetworkDomain() != null : network;
+      assert network.getNetworkOfferingAvailability() != null : network;
+      assert network.getNetworkOfferingDisplayText() != null : network;
+      assert network.getNetworkOfferingId() != null : network;
+      assert network.getNetworkOfferingName() != null : network;
+      assert network.getRelated() != null : network;
+      assert network.getServices().size() != 0 : network;
+      assert network.getState() != null : network;
+      assert network.getTrafficType() != null : network;
+      assert network.getZoneId() != null : network;
+      assert network.getDomain() != null : network;
+      switch (network.getGuestIPType()) {
+      case VIRTUAL:
+         assert network.getNetmask() == null : network;
+         assert network.getGateway() == null : network;
+         assert network.getVLAN() == null : network;
+         assert network.getStartIP() == null : network;
+         assert network.getEndIP() == null : network;
+         break;
+      case DIRECT:
+         // TODO: I've found a network that doesn't have a netmask associated
+         assert network.getNetmask() != null : network;
+         assert network.getGateway() != null : network;
+         assert network.getVLAN() != null : network;
+         assertEquals(network.getBroadcastURI(), URI.create("vlan://" + 
network.getVLAN()));
+         assert network.getStartIP() != null : network;
+         assert network.getEndIP() != null : network;
+         break;
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NetworkApiTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NetworkApiTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NetworkApiTest.java
new file mode 100644
index 0000000..b53fc5f
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/NetworkApiTest.java
@@ -0,0 +1,171 @@
+/*
+ * 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.cloudstack.features;
+
+import static org.jclouds.reflect.Reflection2.method;
+
+import java.io.IOException;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.cloudstack.domain.NetworkType;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiTest;
+import org.jclouds.cloudstack.options.CreateNetworkOptions;
+import org.jclouds.cloudstack.options.ListNetworksOptions;
+import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
+import org.jclouds.functions.IdentityFunction;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseFirstJsonValueNamed;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Functions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.reflect.Invokable;
+/**
+ * Tests behavior of {@code NetworkApi}
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "NetworkApiTest")
+public class NetworkApiTest extends BaseCloudStackApiTest<NetworkApi> {
+   public void testListNetworks() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NetworkApi.class, "listNetworks", 
ListNetworksOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.of());
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listNetworks&listAll=true
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListNetworksOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NetworkApi.class, "listNetworks", 
ListNetworksOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(ListNetworksOptions.Builder.type(NetworkType.ADVANCED)
+            .domainId("6").id("5")));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listNetworks&listAll=true&type=Advanced&domainid=6&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testGetNetwork() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NetworkApi.class, "getNetwork", 
String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of("id"));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listNetworks&listAll=true&id=id
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest,
+            Functions.compose(IdentityFunction.INSTANCE, 
IdentityFunction.INSTANCE).getClass());
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   HttpRequest createNetwork = HttpRequest.builder().method("GET")
+                                          
.endpoint("http://localhost:8080/client/api";)
+                                          .addQueryParam("response", "json")
+                                          .addQueryParam("command", 
"createNetwork")
+                                          .addQueryParam("zoneid", "1")
+                                          .addQueryParam("networkofferingid", 
"2")
+                                          .addQueryParam("name", "named")
+                                          .addQueryParam("displaytext", 
"lovely").build();
+
+   public void testCreateNetworkInZone() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NetworkApi.class, "createNetworkInZone", 
String.class, String.class, String.class,
+            String.class, CreateNetworkOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(1, 2, "named", "lovely"));
+
+      assertRequestLineEquals(httpRequest, createNetwork.getRequestLine());
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   HttpRequest createNetworkOptions = HttpRequest.builder().method("GET")
+                                                 
.endpoint("http://localhost:8080/client/api";)
+                                                 .addQueryParam("response", 
"json")
+                                                 .addQueryParam("command", 
"createNetwork")
+                                                 .addQueryParam("zoneid", "1")
+                                                 
.addQueryParam("networkofferingid", "2")
+                                                 .addQueryParam("name", 
"named")
+                                                 .addQueryParam("displaytext", 
"lovely")
+                                                 .addQueryParam("netmask", 
"255.255.255.0")
+                                                 .addQueryParam("domainid", 
"6").build();
+
+   public void testCreateNetworkInZoneOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NetworkApi.class, "createNetworkInZone", 
String.class, String.class, String.class,
+            String.class, CreateNetworkOptions[].class);
+
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(1, 2, "named", "lovely", CreateNetworkOptions.Builder
+            .netmask("255.255.255.0").domainId("6")));
+
+      assertRequestLineEquals(httpRequest, 
createNetworkOptions.getRequestLine());
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testDeleteNetwork() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(NetworkApi.class, "deleteNetwork", 
String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(5));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=deleteNetwork&id=5 
HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/OfferingApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/OfferingApiLiveTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/OfferingApiLiveTest.java
new file mode 100644
index 0000000..2bbdf20
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/OfferingApiLiveTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.cloudstack.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.DiskOffering;
+import org.jclouds.cloudstack.domain.NetworkOffering;
+import org.jclouds.cloudstack.domain.ServiceOffering;
+import org.jclouds.cloudstack.domain.StorageType;
+import org.jclouds.cloudstack.domain.TrafficType;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest;
+import org.jclouds.cloudstack.options.ListDiskOfferingsOptions;
+import org.jclouds.cloudstack.options.ListNetworkOfferingsOptions;
+import org.jclouds.cloudstack.options.ListServiceOfferingsOptions;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests behavior of {@code OfferingApi}
+ */
+@Test(groups = "live", singleThreaded = true, testName = "OfferingApiLiveTest")
+public class OfferingApiLiveTest extends BaseCloudStackApiLiveTest {
+
+   public void testListDiskOfferings() throws Exception {
+      Set<DiskOffering> response = client.getOfferingApi().listDiskOfferings();
+      assert null != response;
+      long offeringCount = response.size();
+      assertTrue(offeringCount >= 0);
+      for (DiskOffering offering : response) {
+         try {
+           DiskOffering newDetails = 
Iterables.getOnlyElement(client.getOfferingApi().listDiskOfferings(
+               ListDiskOfferingsOptions.Builder.id(offering.getId())));
+           assertEquals(offering, newDetails);
+           assertEquals(offering, 
client.getOfferingApi().getDiskOffering(offering.getId()));
+           assert offering.getId() != null : offering;
+           assert offering.getName() != null : offering;
+           assert offering.getCreated() != null : offering;
+           assert offering.getDisplayText() != null : offering;
+           assert offering.getDiskSize() > 0 || (offering.getDiskSize() == 0 
&& offering.isCustomized()) : offering;
+           assert offering.getTags() != null : offering;
+
+         } catch (NoSuchElementException e) {
+            // This bug is present both in 2.2.8 and 2.2.12
+            assertTrue(Predicates.in(ImmutableSet.of("2.2.8", 
"2.2.12")).apply(apiVersion));
+         }
+      }
+   }
+
+   public void testListServiceOfferings() throws Exception {
+      Set<ServiceOffering> response = 
client.getOfferingApi().listServiceOfferings();
+      assert null != response;
+      long offeringCount = response.size();
+      assertTrue(offeringCount >= 0);
+      for (ServiceOffering offering : response) {
+         ServiceOffering newDetails = 
Iterables.getOnlyElement(client.getOfferingApi().listServiceOfferings(
+               ListServiceOfferingsOptions.Builder.id(offering.getId())));
+         assertEquals(offering, newDetails);
+
+         assert offering.getId() != null : offering;
+         assert offering.getName() != null : offering;
+         assert offering.getDisplayText() != null : offering;
+         assert offering.getCpuNumber() > 0 : offering;
+         assert offering.getCpuSpeed() > 0 : offering;
+         assert offering.getMemory() > 0 : offering;
+         assert offering.getStorageType() != null && StorageType.UNRECOGNIZED 
!= offering.getStorageType() : offering;
+         assert offering.getTags() != null : offering;
+      }
+   }
+
+   public void testListNetworkOfferings() throws Exception {
+      Set<NetworkOffering> response = 
client.getOfferingApi().listNetworkOfferings();
+      assert null != response;
+      long offeringCount = response.size();
+      assertTrue(offeringCount >= 0);
+      for (NetworkOffering offering : response) {
+         NetworkOffering newDetails = 
Iterables.getOnlyElement(client.getOfferingApi().listNetworkOfferings(
+               ListNetworkOfferingsOptions.Builder.id(offering.getId())));
+         assertEquals(offering, newDetails);
+         assertEquals(offering, 
client.getOfferingApi().getNetworkOffering(offering.getId()));
+         assert offering.getId() != null : offering;
+         assert offering.getName() != null : offering;
+         assert offering.getDisplayText() != null : offering;
+         assert offering.getMaxConnections() == null || 
offering.getMaxConnections() > 0 : offering;
+         assert offering.getTrafficType() != null && TrafficType.UNRECOGNIZED 
!= offering.getTrafficType() : offering;
+         assert offering.getTags() != null : offering;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/OfferingApiTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/OfferingApiTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/OfferingApiTest.java
new file mode 100644
index 0000000..6315fea
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/OfferingApiTest.java
@@ -0,0 +1,204 @@
+/*
+ * 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.cloudstack.features;
+
+import static 
org.jclouds.cloudstack.domain.NetworkOfferingAvailabilityType.DEFAULT;
+import static org.jclouds.reflect.Reflection2.method;
+
+import java.io.IOException;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiTest;
+import org.jclouds.cloudstack.options.ListDiskOfferingsOptions;
+import org.jclouds.cloudstack.options.ListNetworkOfferingsOptions;
+import org.jclouds.cloudstack.options.ListServiceOfferingsOptions;
+import org.jclouds.functions.IdentityFunction;
+import org.jclouds.http.functions.ParseFirstJsonValueNamed;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Functions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.reflect.Invokable;
+/**
+ * Tests behavior of {@code OfferingApi}
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "OfferingApiTest")
+public class OfferingApiTest extends BaseCloudStackApiTest<OfferingApi> {
+   public void testListDiskOfferings() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, "listDiskOfferings", 
ListDiskOfferingsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.of());
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listDiskOfferings&listAll=true
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListDiskOfferingsOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, "listDiskOfferings", 
ListDiskOfferingsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> 
of(ListDiskOfferingsOptions.Builder.domainId("6").id("5")));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listDiskOfferings&listAll=true&domainid=6&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testGetDiskOffering() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, "getDiskOffering", 
String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of("5"));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listDiskOfferings&listAll=true&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest,
+            Functions.compose(IdentityFunction.INSTANCE, 
IdentityFunction.INSTANCE).getClass());
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListNetworkOfferings() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, 
"listNetworkOfferings", ListNetworkOfferingsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.of());
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listNetworkOfferings&listAll=true
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListNetworkOfferingsOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, 
"listNetworkOfferings", ListNetworkOfferingsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(
+         
ListNetworkOfferingsOptions.Builder.availability(DEFAULT).isShared(true).id("6")));
+
+      assertRequestLineEquals(
+            httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listNetworkOfferings&listAll=true&availability=Default&isshared=true&id=6
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testGetNetworkOffering() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, "getNetworkOffering", 
String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of("5"));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listNetworkOfferings&listAll=true&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest,
+            Functions.compose(IdentityFunction.INSTANCE, 
IdentityFunction.INSTANCE).getClass());
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListServiceOfferings() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, 
"listServiceOfferings", ListServiceOfferingsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.of());
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listServiceOfferings&listAll=true
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListServiceOfferingsOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, 
"listServiceOfferings", ListServiceOfferingsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> 
of(ListServiceOfferingsOptions.Builder.virtualMachineId("4")
+            .domainId("5").id("6")));
+
+      assertRequestLineEquals(
+            httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listServiceOfferings&listAll=true&virtualmachineid=4&domainid=5&id=6
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testGetServiceOffering() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(OfferingApi.class, "getServiceOffering", 
String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of("5"));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listServiceOfferings&listAll=true&id=5
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest,
+            Functions.compose(IdentityFunction.INSTANCE, 
IdentityFunction.INSTANCE).getClass());
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiExpectTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiExpectTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiExpectTest.java
new file mode 100644
index 0000000..b7665be
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiExpectTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.cloudstack.features;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.Set;
+
+import org.jclouds.cloudstack.CloudStackContext;
+import org.jclouds.cloudstack.domain.Project;
+import org.jclouds.cloudstack.internal.BaseCloudStackExpectTest;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Test the CloudStack ProjectApi
+ */
+@Test(groups = "unit", testName = "ProjectApiExpectTest")
+public class ProjectApiExpectTest extends BaseCloudStackExpectTest<ProjectApi> 
{
+
+
+   public void testListProjectsWhenResponseIs2xx() {
+
+      ProjectApi client = requestSendsResponse(
+         HttpRequest.builder()
+            .method("GET")
+            
.endpoint("http://localhost:8080/client/api?response=json&command=listProjects&listAll=true&apiKey=identity&signature=vtCqaYXfXttr6mD18Es0e22QBIQ%3D";)
+            .addHeader("Accept", "application/json")
+            .build(),
+         HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResource("/listprojectsresponse.json"))
+            .build());
+
+      Set<Project> projects = ImmutableSet.of(
+              Project.builder()
+                      .id("489da162-0b77-489d-b044-ce39aa018b1f")
+                      .account("thyde")
+                      .displayText("")
+                      .domain("ROOT")
+                      .domainId("41a4917b-7952-499d-ba7f-4c57464d3dc8")
+                      .name("NN-HA-T1")
+                      .state(Project.State.ACTIVE).build(),
+              Project.builder()
+                      .id("1c11f22c-15ac-4fa7-b833-4d748df317b7")
+                      .account("prasadm")
+                      .displayText("Hive")
+                      .domain("ROOT")
+                      .domainId("41a4917b-7952-499d-ba7f-4c57464d3dc8")
+                      .name("hive")
+                      .state(Project.State.ACTIVE).build());
+
+      assertEquals(client.listProjects(), projects);
+   }
+
+   @Override
+   protected ProjectApi clientFrom(CloudStackContext context) {
+      return context.getApi().getProjectApi();
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiLiveTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiLiveTest.java
new file mode 100644
index 0000000..071c9d9
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiLiveTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.cloudstack.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.cloudstack.domain.Project;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest;
+import org.testng.annotations.Test;
+
+/**
+ * Tests behavior of {@code ProjectApi}
+ */
+@Test(groups = "live", singleThreaded = true, testName = "ProjectApiLiveTest")
+public class ProjectApiLiveTest extends BaseCloudStackApiLiveTest {
+
+   @Test
+   public void testListAccounts() throws Exception {
+      for (Project project : client.getProjectApi().listProjects())
+         checkProject(project);
+   }
+
+   protected void checkProject(Project project) {
+      assertNotNull(project.getId());
+      assertEquals(project.toString(), 
client.getProjectApi().getProject(project.getId()).toString());
+      assertNotNull(project.getState());
+      assertNotEquals(project.getState(), Project.State.UNRECOGNIZED);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiTest.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiTest.java
new file mode 100644
index 0000000..6b06c93
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/ProjectApiTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.cloudstack.features;
+import static org.jclouds.reflect.Reflection2.method;
+
+import java.io.IOException;
+
+import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.cloudstack.internal.BaseCloudStackApiTest;
+import org.jclouds.cloudstack.options.ListProjectsOptions;
+import org.jclouds.functions.IdentityFunction;
+import org.jclouds.http.functions.ParseFirstJsonValueNamed;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Functions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.reflect.Invokable;
+
+/**
+ * Tests behavior of {@code ProjectApi}
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "ProjectApiTest")
+public class ProjectApiTest extends BaseCloudStackApiTest<ProjectApi> {
+
+   public void testListProjects() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(ProjectApi.class, "listProjects", 
ListProjectsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.of());
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listProjects&listAll=true
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListProjectsOptions() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(ProjectApi.class, "listProjects", 
ListProjectsOptions[].class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of(
+            ListProjectsOptions.Builder.accountInDomain("jclouds", "123")));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listProjects&listAll=true&account=jclouds&domainid=123
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, 
ParseFirstJsonValueNamed.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testGetAccount() throws SecurityException, 
NoSuchMethodException, IOException {
+      Invokable<?, ?> method = method(ProjectApi.class, "getProject", 
String.class);
+      GeneratedHttpRequest httpRequest = processor.createRequest(method, 
ImmutableList.<Object> of("3"));
+
+      assertRequestLineEquals(httpRequest,
+            "GET 
http://localhost:8080/client/api?response=json&command=listProjects&listAll=true&id=3
 HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest,
+            Functions.compose(IdentityFunction.INSTANCE, 
IdentityFunction.INSTANCE).getClass());
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, NullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+}

Reply via email to