Repository: jclouds
Updated Branches:
  refs/heads/2.0.x df5427f77 -> a9cc10c49


http://git-wip-us.apache.org/repos/asf/jclouds/blob/a9cc10c4/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSecurityGroupApiMockTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSecurityGroupApiMockTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSecurityGroupApiMockTest.java
new file mode 100644
index 0000000..4d6b382
--- /dev/null
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSecurityGroupApiMockTest.java
@@ -0,0 +1,270 @@
+/*
+ * 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.aws.ec2.features;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.Set;
+
+import org.jclouds.aws.ec2.internal.BaseAWSEC2ApiMockTest;
+import org.jclouds.aws.ec2.options.CreateSecurityGroupOptions;
+import org.jclouds.ec2.domain.SecurityGroup;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+
+@Test(groups = "unit", testName = "AWSSecurityGroupApiMockTest", 
singleThreaded = true)
+public class AWSSecurityGroupApiMockTest extends BaseAWSEC2ApiMockTest {
+
+   private final String describeSecurityGroupsResponse = Joiner.on("\n").join(
+         "<DescribeSecurityGroupsResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-11-15/\";>",
+         "  <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>",
+         "  <securityGroupInfo>",
+         "    <item>",
+         "      <ownerId>123456789012</ownerId>",
+         "      <groupId>sg-1a2b3c4d</groupId>",
+         "      <groupName>WebServers</groupName>",
+         "      <groupDescription>Web Servers</groupDescription>",
+         "      <vpcId>vpc-614cc409</vpcId>",
+         "      <ipPermissions>",
+         "        <item>",
+         "          <ipProtocol>-1</ipProtocol>",
+         "          <groups>",
+         "            <item>",
+         "              <userId>123456789012</userId>",
+         "              <groupId>sg-af8661c0</groupId>",
+         "            </item>",
+         "          </groups>",
+         "          <ipRanges/>",
+         "          <prefixListIds/>",
+         "        </item>",
+         "        <item>",
+         "          <ipProtocol>tcp</ipProtocol>",
+         "          <fromPort>22</fromPort>",
+         "          <toPort>22</toPort>",
+         "          <groups/>",
+         "          <ipRanges>",
+         "            <item>",
+         "              <cidrIp>204.246.162.38/32</cidrIp>",
+         "            </item>",
+         "          </ipRanges>",
+         "          <prefixListIds/>",
+         "        </item>",
+         "      </ipPermissions>",
+         "      <ipPermissionsEgress>",
+         "        <item>",
+         "          <ipProtocol>-1</ipProtocol>",
+         "          <groups/>",
+         "          <ipRanges>",
+         "            <item>",
+         "              <cidrIp>0.0.0.0/0</cidrIp>",
+         "            </item>",
+         "          </ipRanges>",
+         "          <prefixListIds/>",
+         "        </item>",
+         "      </ipPermissionsEgress>",
+         "    </item>",
+         "  </securityGroupInfo>",
+         "</DescribeSecurityGroupsResponse>");
+
+   private final String createSecurityGroupResponse = Joiner.on("\n").join(
+         "<CreateSecurityGroupResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-11-15/\";>",
+         "  <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>",
+         "  <return>true</return>",
+         "  <groupId>sg-0a42d66a</groupId>",
+         "</CreateSecurityGroupResponse>");
+
+   private final String authorizeSecurityGroupIngressResponse = 
Joiner.on("\n").join(
+            "<AuthorizeSecurityGroupIngressResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-11-15/\";>",
+            "  <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>",
+            "  <return>true</return>",
+            "</AuthorizeSecurityGroupIngressResponse>");
+
+   private final String revokeSecurityGroupIngressResponse = 
Joiner.on("\n").join(
+         "<RevokeSecurityGroupIngressResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-11-15/\";>",
+         "  <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>",
+         "  <return>true</return>",
+         "</RevokeSecurityGroupIngressResponse>");
+
+   private final String deleteSecurityGroupResponse = Joiner.on("\n").join(
+         "<DeleteSecurityGroupResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-11-15/\";>",
+         "  <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>",
+         "  <return>true</return>",
+         "</DeleteSecurityGroupResponse>");
+
+   @SuppressWarnings("deprecation")
+   public void describeSecurityGroups() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(describeSecurityGroupsResponse));
+
+      Set<SecurityGroup> results = 
securityGroupApi().describeSecurityGroupsInRegion(DEFAULT_REGION);
+      SecurityGroup result = Iterables.getOnlyElement(results);
+      assertEquals(result.getId(), "sg-1a2b3c4d");
+      assertEquals(result.getRegion(), "us-east-1");
+      assertEquals(result.getName(), "WebServers");
+      assertEquals(result.getOwnerId(), "123456789012");
+      assertEquals(result.getDescription(), "Web Servers");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, "Action=DescribeSecurityGroups");
+   }
+
+   public void describeSecurityGroupsGiving404() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404));
+
+      Set<SecurityGroup> results = 
securityGroupApi().describeSecurityGroupsInRegion(DEFAULT_REGION);
+      assertEquals(results, ImmutableSet.of());
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, "Action=DescribeSecurityGroups");
+   }
+
+   public void describeSecurityGroupsById() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(describeSecurityGroupsResponse));
+
+      Set<SecurityGroup> results = 
securityGroupApi().describeSecurityGroupsInRegionById(DEFAULT_REGION, 
"sg-1a2b3c4d");
+      SecurityGroup result = Iterables.getOnlyElement(results);
+      assertEquals(result.getId(), "sg-1a2b3c4d");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeSecurityGroups&GroupId.1=sg-1a2b3c4d");
+   }
+
+   public void describeSecurityGroupsByName() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(describeSecurityGroupsResponse));
+
+      Set<SecurityGroup> results = 
securityGroupApi().describeSecurityGroupsInRegion(DEFAULT_REGION, "WebServers");
+      SecurityGroup result = Iterables.getOnlyElement(results);
+      assertEquals(result.getId(), "sg-1a2b3c4d");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeSecurityGroups&GroupName.1=WebServers");
+   }
+
+   public void describeSecurityGroupsFiltered() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(describeSecurityGroupsResponse));
+
+      Set<SecurityGroup> results = 
securityGroupApi().describeSecurityGroupsInRegionWithFilter(DEFAULT_REGION, 
+            ImmutableMultimap.of("group-name", "WebServers", "vpc-id", 
"vpc-614cc409"));
+      SecurityGroup result = Iterables.getOnlyElement(results);
+      assertEquals(result.getId(), "sg-1a2b3c4d");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeSecurityGroups&Filter.1.Name=group-name&Filter.1.Value.1=WebServers&Filter.2.Name=vpc-id&Filter.2.Value.1=vpc-614cc409");
+   }
+
+   public void describeSecurityGroupsDifferentRegion() throws Exception {
+      String region = "us-west-2";
+      enqueueRegions(DEFAULT_REGION, region);
+      enqueue(region, new 
MockResponse().setBody(describeSecurityGroupsResponse));
+
+      Set<SecurityGroup> results = 
securityGroupApi().describeSecurityGroupsInRegion(region);
+      SecurityGroup result = Iterables.getOnlyElement(results);
+      assertEquals(result.getId(), "sg-1a2b3c4d");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(region, "Action=DescribeSecurityGroups");
+   }
+
+   public void createSecurityGroupsInRegionAndReturnId() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(createSecurityGroupResponse));
+
+      String result = 
securityGroupApi().createSecurityGroupInRegionAndReturnId(DEFAULT_REGION, 
"WebServers", "Web Servers", 
CreateSecurityGroupOptions.Builder.vpcId("vpc-614cc409"));
+      assertEquals(result, "sg-0a42d66a");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=CreateSecurityGroup&GroupName=WebServers&GroupDescription=Web%20Servers&VpcId=vpc-614cc409");
+   }
+
+   public void authorizeSecurityGroupIngress() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(authorizeSecurityGroupIngressResponse));
+
+      IpPermission perm = 
IpPermission.builder().ipProtocol(IpProtocol.TCP).cidrBlock("0.0.0.0/0")
+            .fromPort(8080).toPort(8080).build();
+      securityGroupApi().authorizeSecurityGroupIngressInRegion(DEFAULT_REGION, 
"sg-1a2b3c4d", perm);
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=AuthorizeSecurityGroupIngress&GroupId=sg-1a2b3c4d&IpPermissions.0.IpProtocol=tcp&IpPermissions.0.FromPort=8080&IpPermissions.0.ToPort=8080&IpPermissions.0.IpRanges.0.CidrIp=0.0.0.0/0");
+   }
+
+   public void authorizeSecurityGroupIngressList() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(authorizeSecurityGroupIngressResponse));
+
+      IpPermission perm = 
IpPermission.builder().ipProtocol(IpProtocol.TCP).cidrBlock("0.0.0.0/0")
+            .fromPort(8080).toPort(8080).build();
+      IpPermission perm2 = 
IpPermission.builder().ipProtocol(IpProtocol.TCP).cidrBlock("0.0.0.0/0")
+            .fromPort(8443).toPort(8443).build();
+      securityGroupApi().authorizeSecurityGroupIngressInRegion(DEFAULT_REGION, 
"sg-1a2b3c4d", ImmutableList.of(perm, perm2));
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=AuthorizeSecurityGroupIngress&GroupId=sg-1a2b3c4d&IpPermissions.0.IpProtocol=tcp&IpPermissions.0.FromPort=8080&IpPermissions.0.ToPort=8080&IpPermissions.0.IpRanges.0.CidrIp=0.0.0.0/0&IpPermissions.1.IpProtocol=tcp&IpPermissions.1.FromPort=8443&IpPermissions.1.ToPort=8443&IpPermissions.1.IpRanges.0.CidrIp=0.0.0.0/0");
+   }
+
+   public void revokeSecurityGroupIngress() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(revokeSecurityGroupIngressResponse));
+
+      IpPermission perm = 
IpPermission.builder().ipProtocol(IpProtocol.TCP).cidrBlock("0.0.0.0/0")
+            .fromPort(8080).toPort(8080).build();
+      securityGroupApi().revokeSecurityGroupIngressInRegion(DEFAULT_REGION, 
"sg-1a2b3c4d", perm);
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=RevokeSecurityGroupIngress&GroupId=sg-1a2b3c4d&IpPermissions.0.IpProtocol=tcp&IpPermissions.0.FromPort=8080&IpPermissions.0.ToPort=8080&IpPermissions.0.IpRanges.0.CidrIp=0.0.0.0/0");
+   }
+
+   public void revokeSecurityGroupIngressList() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(revokeSecurityGroupIngressResponse));
+
+      IpPermission perm = 
IpPermission.builder().ipProtocol(IpProtocol.TCP).cidrBlock("0.0.0.0/0")
+            .fromPort(8080).toPort(8080).build();
+      IpPermission perm2 = 
IpPermission.builder().ipProtocol(IpProtocol.TCP).cidrBlock("0.0.0.0/0")
+            .fromPort(8443).toPort(8443).build();
+      securityGroupApi().revokeSecurityGroupIngressInRegion(DEFAULT_REGION, 
"sg-1a2b3c4d", ImmutableList.of(perm, perm2));
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=RevokeSecurityGroupIngress&GroupId=sg-1a2b3c4d&IpPermissions.0.IpProtocol=tcp&IpPermissions.0.FromPort=8080&IpPermissions.0.ToPort=8080&IpPermissions.0.IpRanges.0.CidrIp=0.0.0.0/0&IpPermissions.1.IpProtocol=tcp&IpPermissions.1.FromPort=8443&IpPermissions.1.ToPort=8443&IpPermissions.1.IpRanges.0.CidrIp=0.0.0.0/0");
+   }
+
+   public void deleteSecurityGroups() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody(deleteSecurityGroupResponse));
+
+      securityGroupApi().deleteSecurityGroupInRegionById(DEFAULT_REGION, 
"sg-1a2b3c4d");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DeleteSecurityGroup&GroupId=sg-1a2b3c4d");
+   }
+
+   private AWSSecurityGroupApi securityGroupApi() {
+      return api().getSecurityGroupApi().get();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a9cc10c4/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiLiveTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiLiveTest.java
index 0dc9b08..b851f3a 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiLiveTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiLiveTest.java
@@ -16,12 +16,115 @@
  */
 package org.jclouds.aws.ec2.features;
 
-import org.jclouds.ec2.features.SubnetApiLiveTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import org.jclouds.aws.ec2.AWSEC2Api;
+import org.jclouds.aws.ec2.domain.VPC;
+import org.jclouds.aws.ec2.options.CreateVpcOptions;
+import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
+import org.jclouds.ec2.domain.Subnet;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-@Test(groups = "live", testName = "AWSSubnetApiLiveTest")
-public class AWSSubnetApiLiveTest extends SubnetApiLiveTest {
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests behavior of {@code VPCApi}
+ */
+@Test(groups = "live", singleThreaded = true)
+public class AWSSubnetApiLiveTest extends BaseComputeServiceContextLiveTest {
+
+   private String region;
+
+   private AWSEC2Api api;
+   private AWSSubnetApi subnetClient;
+   private VPCApi vpcClient;
+
+   private Subnet subnet;
+   private VPC vpc;
+
    public AWSSubnetApiLiveTest() {
       provider = "aws-ec2";
+      region = "us-west-2";
+   }
+
+   @Override
+   @BeforeClass(groups = { "integration", "live" })
+   public void setupContext() {
+      super.setupContext();
+      api = view.unwrapApi(AWSEC2Api.class);
+      subnetClient = api.getAWSSubnetApi().get();
+      vpcClient = view.unwrapApi(AWSEC2Api.class).getVPCApi().get();
+   }
+
+   @Override
+   @AfterClass(groups = { "integration", "live" })
+   public void tearDownContext() {
+      try {
+         try {
+            if (subnet != null) {
+               subnetClient.deleteSubnetInRegion(region, subnet.getSubnetId());
+            }
+         } finally {
+            if (vpc != null) {
+               vpcClient.deleteVpc(region, vpc.id());
+            }
+         }
+      } finally {
+         super.tearDownContext();
+      }
+   }
+
+   @Test
+   public void testCreateSubnetInRegion() {
+      vpc = vpcClient.createVpc(region, "10.0.0.0/16", CreateVpcOptions.NONE);
+      subnet = subnetClient.createSubnetInRegion(region, vpc.id(), 
"10.0.0.0/20");
+      assertNotNull(subnet);
+      assertEquals(subnet.getCidrBlock(), "10.0.0.0/20");
+   }
+
+   @Test(dependsOnMethods = "testCreateSubnetInRegion")
+   public void testGet() {
+      FluentIterable<Subnet> subnets = 
subnetClient.describeSubnetsInRegion(region, subnet.getSubnetId());
+      Subnet subnetFound = Iterables.getOnlyElement(subnets);
+      assertEquals(subnetFound.getSubnetId(), subnet.getSubnetId());
+   }
+
+   @Test(dependsOnMethods = "testCreateSubnetInRegion")
+   public void testFilter() {
+      FluentIterable<Subnet> subnets = 
subnetClient.describeSubnetsInRegionWithFilter(region, 
+            ImmutableMultimap.of("subnet-id", subnet.getSubnetId()));
+      Subnet subnetFound = Iterables.getOnlyElement(subnets);
+      assertEquals(subnetFound.getSubnetId(), subnet.getSubnetId());
+   }
+
+   @Test(dependsOnMethods = "testCreateSubnetInRegion")
+   public void testList() {
+      FluentIterable<Subnet> subnets = 
subnetClient.describeSubnetsInRegionWithFilter(region, 
+            ImmutableMultimap.<String, String>of());
+      Optional<Subnet> subnetFound = Iterables.tryFind(subnets, new 
Predicate<Subnet>() {
+         @Override
+         public boolean apply(Subnet input) {
+            return input != null && 
input.getSubnetId().equals(subnet.getSubnetId());
+         }
+      });
+      assertTrue(subnetFound.isPresent(), "subnets=" + 
ImmutableList.copyOf(subnets));
+   }
+
+   @Test(dependsOnMethods = {"testGet", "testFilter", "testList"}, alwaysRun = 
true)
+   public void testDelete() {
+      if (subnet != null) {
+         String subnetId = subnet.getSubnetId();
+         subnet = null;
+         subnetClient.deleteSubnetInRegion(region, subnetId);
+      }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a9cc10c4/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiMockTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiMockTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiMockTest.java
new file mode 100644
index 0000000..b8f81ca
--- /dev/null
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSSubnetApiMockTest.java
@@ -0,0 +1,213 @@
+/*
+ * 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.aws.ec2.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import org.jclouds.aws.ec2.internal.BaseAWSEC2ApiMockTest;
+import org.jclouds.aws.ec2.options.CreateSubnetOptions;
+import org.jclouds.ec2.domain.Subnet;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.Iterables;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+
+@Test(groups = "unit", testName = "AWSSubnetApiMockTest", singleThreaded = 
true)
+public class AWSSubnetApiMockTest extends BaseAWSEC2ApiMockTest {
+
+   private final String describeSubnetsResponse = "<DescribeSubnetsResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-11-15/\";>\n" +
+         "  <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>\n" +
+         "  <subnetSet>\n" +
+         "    <item>\n" +
+         "      <subnetId>subnet-9d4a7b6c</subnetId>\n" +
+         "      <state>available</state>\n" +
+         "      <vpcId>vpc-1a2b3c4d</vpcId>\n" +
+         "      <cidrBlock>10.0.1.0/24</cidrBlock> \n" +
+         "      <ipv6CidrBlockAssociationSet>\n" +
+         "        <item>\n" +
+         "          <ipv6CidrBlock>2001:db8:1234:1a00::/64</ipv6CidrBlock>\n" +
+         "          
<associationId>subnet-cidr-assoc-abababab</associationId>\n" +
+         "          <ipv6CidrBlockState>\n" +
+         "          <state>ASSOCIATED</state>\n" +
+         "          </ipv6CidrBlockState>\n" +
+         "        </item>\n" +
+         "      </ipv6CidrBlockAssociationSet>\n" +
+         "      <availableIpAddressCount>251</availableIpAddressCount>\n" +
+         "      <availabilityZone>us-east-1a</availabilityZone>\n" +
+         "      <defaultForAz>false</defaultForAz>\n" +
+         "      <mapPublicIpOnLaunch>false</mapPublicIpOnLaunch>\n" +
+         "      <tagSet/>\n" +
+         "      
<assignIpv6AddressOnCreation>false</assignIpv6AddressOnCreation>\n" +
+         "    </item>\n" +
+         "  </subnetSet>\n" +
+         "</DescribeSubnetsResponse>";
+
+   public void createSubnetInRegion() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION, new 
MockResponse().setBody("<CreateSubnetResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-09-15/\";>\n" +
+              "  <requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>\n" 
+
+              "  <subnet>\n" +
+              "    <subnetId>subnet-9d4a7b6c</subnetId>\n" +
+              "    <state>pending</state>\n" +
+              "    <vpcId>vpc-1a2b3c4d</vpcId>\n" +
+              "    <cidrBlock>10.0.1.0/24</cidrBlock> \n" +
+              "    <availableIpAddressCount>251</availableIpAddressCount>\n" +
+              "    <availabilityZone>us-east-1a</availabilityZone>\n" +
+              "    <tagSet/>\n" +
+              "  </subnet>\n" +
+              "</CreateSubnetResponse>"));
+
+      Subnet result = subnetApi().createSubnetInRegion(DEFAULT_REGION, 
"vpc-1a2b3c4d", "10.0.1.0/24");
+      assertEquals(result.getVpcId(), "vpc-1a2b3c4d");
+      assertEquals(result.getCidrBlock(), "10.0.1.0/24");
+      assertEquals(result.getAvailabilityZone(), "us-east-1a");
+      assertEquals(result.getSubnetId(), "subnet-9d4a7b6c");
+      assertEquals(result.getSubnetState().value(), "pending");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=CreateSubnet&VpcId=vpc-1a2b3c4d&CidrBlock=10.0.1.0/24");
+   }
+
+   public void createSubnetInRegion_options() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION,
+            new MockResponse().setBody("<CreateSubnetResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-09-15/\";>\n" +
+                    "  
<requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>\n" +
+                    "  <subnet>\n" +
+                    "    <subnetId>subnet-9d4a7b6c</subnetId>\n" +
+                    "    <state>pending</state>\n" +
+                    "    <vpcId>vpc-1a2b3c4d</vpcId>\n" +
+                    "    <cidrBlock>10.0.1.0/24</cidrBlock> \n" +
+                    "    
<availableIpAddressCount>251</availableIpAddressCount>\n" +
+                    "    <availabilityZone>us-east-1a</availabilityZone>\n" +
+                    "    <tagSet/>\n" +
+                    "  </subnet>\n" +
+                    "</CreateSubnetResponse>"));
+
+      Subnet result = subnetApi().createSubnetInRegion(DEFAULT_REGION, 
"vpc-1a2b3c4d", "10.0.1.0/24",
+            new CreateSubnetOptions().dryRun().availabilityZone("us-east-1a"));
+      assertEquals(result.getVpcId(), "vpc-1a2b3c4d");
+      assertEquals(result.getCidrBlock(), "10.0.1.0/24");
+      assertEquals(result.getAvailabilityZone(), "us-east-1a");
+      assertEquals(result.getSubnetId(), "subnet-9d4a7b6c");
+      assertEquals(result.getSubnetState().value(), "pending");
+      
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=CreateSubnet&VpcId=vpc-1a2b3c4d&CidrBlock=10.0.1.0/24&DryRun=true&AvailabilityZone=us-east-1a");
+   }
+
+   public void deleteSubnetInRegion() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION,
+            new MockResponse().setBody("<DeleteSubnetResponse 
xmlns=\"http://ec2.amazonaws.com/doc/2016-09-15/\";>\n" +
+                    "  
<requestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</requestId>\n" +
+                    "  <return>true</return>\n" +
+                    "</DeleteSubnetResponse>"));
+
+      subnetApi().deleteSubnetInRegion(DEFAULT_REGION, "subnet-9d4a7b6c");
+      
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DeleteSubnet&SubnetId=subnet-9d4a7b6c");
+   }
+
+   public void describeSubnetInRegion() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION,
+            new MockResponse().setBody(describeSubnetsResponse));
+
+      FluentIterable<Subnet> results = 
subnetApi().describeSubnetsInRegion(DEFAULT_REGION);
+      Subnet result = Iterables.getOnlyElement(results);
+      assertEquals(result.getSubnetId(), "subnet-9d4a7b6c");
+      assertEquals(result.getSubnetState().value(), "available");
+      assertEquals(result.getVpcId(), "vpc-1a2b3c4d");
+      assertEquals(result.getCidrBlock(), "10.0.1.0/24");
+      assertEquals(result.getAvailabilityZone(), "us-east-1a");
+      assertEquals(result.getAvailableIpAddressCount(), 251);
+      
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, "Action=DescribeSubnets");
+   }
+
+   public void describeSubnetInRegionWithFilter() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION,
+            new MockResponse().setBody(describeSubnetsResponse));
+
+      FluentIterable<Subnet> results = 
subnetApi().describeSubnetsInRegionWithFilter(DEFAULT_REGION,
+            ImmutableMultimap.of("vpc-id", "vpc-1a2b3c4d", "availabilityZone", 
"us-east-1a"));
+      Subnet result = Iterables.getOnlyElement(results);
+      assertEquals(result.getSubnetId(), "subnet-9d4a7b6c");
+      assertEquals(result.getSubnetState().value(), "available");
+      assertEquals(result.getVpcId(), "vpc-1a2b3c4d");
+      assertEquals(result.getCidrBlock(), "10.0.1.0/24");
+      assertEquals(result.getAvailabilityZone(), "us-east-1a");
+      assertEquals(result.getAvailableIpAddressCount(), 251);
+      
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeSubnets&Filter.1.Name=vpc-id&Filter.1.Value.1=vpc-1a2b3c4d&Filter.2.Name=availabilityZone&Filter.2.Value.1=us-east-1a");
+   }
+
+   public void describeSubnetInRegionWhen404() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION,
+            new MockResponse().setResponseCode(404));
+
+      FluentIterable<Subnet> results = 
subnetApi().describeSubnetsInRegion(DEFAULT_REGION);
+      assertTrue(Iterables.isEmpty(results));
+      
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, "Action=DescribeSubnets");
+   }
+
+   public void describeSubnetInRegionWithFilterWhen404() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueue(DEFAULT_REGION,
+            new MockResponse().setResponseCode(404));
+
+      FluentIterable<Subnet> results = 
subnetApi().describeSubnetsInRegionWithFilter(DEFAULT_REGION,
+            ImmutableMultimap.of("vpc-id", "vpc-1a2b3c4d"));
+      assertTrue(Iterables.isEmpty(results));
+      
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeSubnets&Filter.1.Name=vpc-id&Filter.1.Value.1=vpc-1a2b3c4d");
+   }
+
+   public void describeSubnetInNonDefaultRegionWhen404() throws Exception {
+      String region = "us-west-2";
+      
+      enqueueRegions(DEFAULT_REGION, region);
+      enqueue(region,
+            new MockResponse().setResponseCode(404));
+
+      FluentIterable<Subnet> results = subnetApiForRegion(region).list();
+      assertTrue(Iterables.isEmpty(results));
+      
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(region, "Action=DescribeSubnets");
+   }
+
+   private AWSSubnetApi subnetApi() {
+      return api().getAWSSubnetApi().get();
+   }
+   
+   private AWSSubnetApi subnetApiForRegion(String region) {
+      return api().getAWSSubnetApiForRegion(region).get();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a9cc10c4/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/VPCApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/VPCApiLiveTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/VPCApiLiveTest.java
index 06c4873..7ee0d31 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/VPCApiLiveTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/VPCApiLiveTest.java
@@ -24,6 +24,7 @@ import org.jclouds.aws.ec2.AWSEC2Api;
 import org.jclouds.aws.ec2.domain.VPC;
 import org.jclouds.aws.ec2.options.CreateVpcOptions;
 import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
+import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -48,6 +49,18 @@ public class VPCApiLiveTest extends 
BaseComputeServiceContextLiveTest {
       client = view.unwrapApi(AWSEC2Api.class).getVPCApi().get();
    }
 
+   @Override
+   @AfterClass(groups = { "integration", "live" })
+   public void tearDownContext() {
+      try {
+         if (vpc != null) {
+            client.deleteVpc(null, vpc.id());
+         }
+      } finally {
+         super.tearDownContext();
+      }
+   }
+
    @Test
    public void testCreate() {
       vpc = client.createVpc(null, "10.0.0.0/16", CreateVpcOptions.NONE);
@@ -69,7 +82,9 @@ public class VPCApiLiveTest extends 
BaseComputeServiceContextLiveTest {
    @Test(dependsOnMethods = {"testList", "testGet"}, alwaysRun = true)
    public void testDelete() {
       if (vpc != null) {
-         assertTrue(client.deleteVpc(null, vpc.id()));
+         String vpcId = vpc.id();
+         vpc = null;
+         assertTrue(client.deleteVpc(null, vpcId));
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a9cc10c4/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/internal/BaseAWSEC2ApiMockTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/internal/BaseAWSEC2ApiMockTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/internal/BaseAWSEC2ApiMockTest.java
index 796cf69..060e577 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/internal/BaseAWSEC2ApiMockTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/internal/BaseAWSEC2ApiMockTest.java
@@ -116,7 +116,7 @@ public class BaseAWSEC2ApiMockTest {
       }
    }
 
-   @BeforeMethod
+   @BeforeMethod(alwaysRun = true)
    public void start() throws IOException {
       MockWebServer server = new MockWebServer();
       server.play();

Reply via email to