http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/WindowsLoginCredentialsFromEncryptedDataTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/WindowsLoginCredentialsFromEncryptedDataTest.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/WindowsLoginCredentialsFromEncryptedDataTest.java
new file mode 100644
index 0000000..3859f53
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/WindowsLoginCredentialsFromEncryptedDataTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.ec2.compute.functions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+
+import org.jclouds.date.DateService;
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.domain.LoginCredentials;
+import org.jclouds.ec2.compute.domain.PasswordDataAndPrivateKey;
+import org.jclouds.ec2.domain.PasswordData;
+import org.jclouds.encryption.internal.JCECrypto;
+import org.testng.annotations.Test;
+
+public class WindowsLoginCredentialsFromEncryptedDataTest {
+
+   private static final String PRIVATE_KEY = "-----BEGIN RSA PRIVATE 
KEY-----\n" +
+      
"MIIEowIBAAKCAQEAmN6GOSMnyGNWN19ETBh11tJB5OGs3Dps8kPWqAhF9RyL/mKwkW26vH+h/5Z5\n"
 +
+      
"cA5T80pK72kNnXObFaMHNoX3lavrc6yXF+8F3f1tlFX2Z+iB1pYXz1oBPqT6oOmc2XzcsJuJRakd\n"
 +
+      
"zwRwHDaqljpaW7+TZlxhMa1DmUkD/HHMxDCK8jbUIZDc6BZSrnj2uPwHwW737NRE4aC3fcu4LMwf\n"
 +
+      
"b2VotbNGNiAnNmrb/vtIIGkFE8NYEMpiz0WYTWX4eVKpJImv1PR6G1fMLSvudJs0ARObuLDvuonn\n"
 +
+      
"SCFFdkibrwMKYbHVGGh6FoY1Vy0sqI55dgQU1kSNouiDgOGxgx+TIwIDAQABAoIBAHCS/nk5QGS7\n"
 +
+      
"cpRYXa1EHhNSxx/MaUXM6MoH1x3q6cm1egqdlrWh/vAtdZkIsOkqQ/xX65Me493dcomegwNN6KOZ\n"
 +
+      
"9Uw7/xCq/sEZjga8vzaJ7IOgCGy0NVJyn/a70rv+zW5pO8/G2KLI+95rC3iSBFSoYd3xjcnNdIh/\n"
 +
+      
"UqYnD8oxYpKmf7418pMPsBrkglkFlbVBPiDXdpoSziqSN6uWQG4Yh0WR87aElhM9JJW50Hh6h7g5\n"
 +
+      
"OvgCBzS8G+KXCjqimk108+/ed5Nl6VhPAf79yCVZUueKBhaf2r0Kkyxg7M/Y+LJwcoUusIP7Cv7G\n"
 +
+      
"xyzG2vi21prWRCm2sVCUDyQy5qECgYEA92jGVAaB3OGEUIXn7eVE3U3FQH37XcJMGsHqBIzDG13p\n"
 +
+      
"C97HdN21rwRkz+G2eAsIxA+p9BsO7dSmtKC60kl6iMRgltS3W7xoC37N9BtjhpciHcLg8c70oyDx\n"
 +
+      
"qHiLKuDi90mZ1FPmWupO4FJnGEB3evHUKZSpTrVVMzt+tyEn/psCgYEAni1hrYoMkQgN3sEC3CKB\n"
 +
+      
"0jQkrOMvY219B8Tdf9LXSuP6z9POagDBDhkeT3xn8rAOmOfVGHYdO0CvPqmAkmXhf+g+OREdecQa\n"
 +
+      
"uY0FmvcTt+Dx0c6pRZmm5AhvUVXFXqONsSg79iviXbUy5Hik0k5HTs5E6B4obrh5W+xfMTUXghkC\n"
 +
+      
"gYBn92uAW8uumkYT4HF6EuJBbTD6zPYYjFGW3O4OQ2ip02jfSBrhDVoP1fTXNq6K+3gPi9WLcuNv\n"
 +
+      
"JfF37iMTwzTuzDcaqwDyV9YRHpRFhEzqfhAkGYSVmLZM5scmWKGCv0YhTJiMFUWz5sqGkZopIs4S\n"
 +
+      
"qBTT9FjBbooDIXk6U4CPCQKBgFdVBxEhnz6UC9RpDIMuKi88yuMJrChhUx7u+ryQVH3s0ZXdg6HT\n"
 +
+      
"OMPn6mxIa7v6qJSTq3wN+qW0WQ1n2Kz7wz0zpOctI/EO7RJ1YhrlP+XONLV6PMtIwnQ0lAF8MbTG\n"
 +
+      
"6HxfknugTyMd4DN0yMu0nHpOOI1P2VMIVzkBkK1CevBBAoGBALROGR7a+eijHdp0/A0chfUoBmud\n"
 +
+      
"/TsUt+0g/vf1p69rMt6DqEGMgMtp2jIRnwvLElS7gVqnCTEclxNU/0rCXR+V7ImJm8J4f0ff8m0Y\n"
 +
+      "Fir9nfCYStszo25NvLFfynS9d/aoBuvqGJaiQyNXiyBJ4MaxxFYagzAWTnDX+kzTlkZ2\n" 
+
+      "-----END RSA PRIVATE KEY-----";
+   private static final String ENCRYPTED_PASSWORD = 
"gO1oMoIjjIifv2iqcfIKiQD7ziOTVXsuaBJFEQrZdb8uJH/LsAiJXZeGKEeXlHl/oMoR3HEIoYuHxl+p5iHdrpP889RmxWBDGOWC5iTUzK6CRa5mFmF1I5Lpt7v2YeVoQWihSM8B19BEdBdY1svQp9nyhPB4AqLDrY28x/OrmRh/qYq953i6Y4Z8c76OHqqGcUYM4ePysRlcizSgQjdkEDmKC10Ak3OFRRx3/LqYsFIMiOHeg47APg+UANNTyRiTIia5FDhSeHJzaeYCBRQ7UYH0z2rg4cX3YjOz/MoznjHiaaN4MO+5N3v84VawnqwKOvlwPyI2bmz0+9Tr6DKzqA==";
+
+   protected final DateService dateService = new SimpleDateFormatDateService();
+
+   @Test
+   public void testApply() throws Exception {
+      WindowsLoginCredentialsFromEncryptedData f = new 
WindowsLoginCredentialsFromEncryptedData(new JCECrypto());
+
+      PasswordData passwordData = PasswordData.builder()
+                                              .instanceId("i-2574e22a")
+                                              
.timestamp(dateService.iso8601DateParse("2012-07-30T07:27:23.000+0000"))
+                                              
.passwordData(ENCRYPTED_PASSWORD).build();
+
+      LoginCredentials credentials = f.apply(new 
PasswordDataAndPrivateKey(passwordData, PRIVATE_KEY));
+
+      assertEquals(credentials.getUser(), "Administrator");
+      assertEquals(credentials.getOptionalPassword().get(), "u4.y9mb;nR.");
+      assertFalse(credentials.getOptionalPrivateKey().isPresent());
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/BaseEC2ComputeServiceContextExpectTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/BaseEC2ComputeServiceContextExpectTest.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/BaseEC2ComputeServiceContextExpectTest.java
new file mode 100644
index 0000000..cc9790b
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/BaseEC2ComputeServiceContextExpectTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.ec2.compute.internal;
+
+import java.util.Properties;
+
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.ec2.internal.BaseEC2ApiExpectTest;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+
+import com.google.common.base.Function;
+import com.google.inject.Module;
+
+public abstract class BaseEC2ComputeServiceContextExpectTest<T> extends 
BaseEC2ApiExpectTest<T> implements
+         Function<ComputeServiceContext, T> {
+
+   @Override
+   public T createClient(Function<HttpRequest, HttpResponse> fn, Module 
module, Properties props) {
+      return apply(createComputeServiceContext(fn, module, props));
+   }
+
+   private ComputeServiceContext 
createComputeServiceContext(Function<HttpRequest, HttpResponse> fn, Module 
module,
+            Properties props) {
+      return createInjector(fn, module, 
props).getInstance(ComputeServiceContext.class);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/BaseEC2ComputeServiceExpectTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/BaseEC2ComputeServiceExpectTest.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/BaseEC2ComputeServiceExpectTest.java
new file mode 100644
index 0000000..4178e74
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/BaseEC2ComputeServiceExpectTest.java
@@ -0,0 +1,296 @@
+/*
+ * 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.ec2.compute.internal;
+
+import static 
org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS;
+
+import javax.ws.rs.core.MediaType;
+import java.util.Properties;
+
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.testng.annotations.BeforeClass;
+
+public abstract class BaseEC2ComputeServiceExpectTest extends 
BaseEC2ComputeServiceContextExpectTest<ComputeService> {
+   protected String region;
+
+   @Override
+   protected Properties setupProperties() {
+      Properties properties = super.setupProperties();
+      properties.setProperty(PROPERTY_REGIONS, region);
+      properties.setProperty(provider + ".template", 
"osDescriptionMatches=.*fedora.*");
+      return properties;
+   }
+
+   protected HttpRequest describeAvailabilityZonesRequest;
+   protected HttpResponse describeAvailabilityZonesResponse;
+   protected HttpRequest describeImagesRequest;
+   protected HttpResponse describeImagesResponse;
+   protected HttpRequest createKeyPairRequest;
+   protected HttpResponse createKeyPairResponse;
+   protected HttpRequest createSecurityGroupRequest;
+   protected HttpResponse createSecurityGroupResponse;
+   protected HttpRequest describeSecurityGroupRequest;
+   protected HttpResponse describeSecurityGroupResponse;
+   protected HttpRequest authorizeSecurityGroupIngressRequest22;
+   protected HttpResponse authorizeSecurityGroupIngressResponse;
+   protected HttpRequest authorizeSecurityGroupIngressRequestGroup;
+   protected HttpRequest runInstancesRequest;
+   protected HttpResponse runInstancesResponse;
+   protected HttpRequest runThreeInstancesRequest;
+   protected HttpRequest runThreeToFourInstancesRequest;
+   protected HttpResponse runThreeInstancesResponse;
+   protected HttpRequest describeInstanceRequest;
+   protected HttpResponse describeInstanceResponse;
+   protected HttpRequest describeInstanceMultiIdsRequest;
+   protected HttpResponse describeInstanceMultiIdsResponse;
+   protected HttpRequest describeInstanceThreeIdsRequest;
+   protected HttpResponse describeInstanceThreeIdsResponse;
+   protected HttpRequest describeImageRequest;
+   protected HttpRequest createTagsRequest;
+   protected HttpResponse createTagsResponse;
+
+   public BaseEC2ComputeServiceExpectTest() {
+      region = "us-east-1";
+   }
+   
+   @BeforeClass
+   @Override
+   protected void setupDefaultRequests() {
+      super.setupDefaultRequests();
+      describeAvailabilityZonesRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", 
"DescribeAvailabilityZones").build());
+      
+      describeAvailabilityZonesResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 "/availabilityZones-" + region + ".xml", 
MediaType.APPLICATION_XML)).build();
+      describeImagesRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", "DescribeImages").build());
+      
+      describeImagesResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 "/describe_images.xml", 
MediaType.APPLICATION_XML)).build();
+      
+      createKeyPairRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", "CreateKeyPair")
+                          .addFormParam("KeyName", "jclouds#test#0").build());
+
+      createKeyPairResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 "/create_keypair.xml", 
MediaType.APPLICATION_XML)).build();
+      
+      createSecurityGroupRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", "CreateSecurityGroup")
+                          .addFormParam("GroupDescription", "jclouds#test")
+                          .addFormParam("GroupName", "jclouds#test").build());
+
+      createSecurityGroupResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 "/created_securitygroup.xml", 
MediaType.APPLICATION_XML)).build();
+
+      describeSecurityGroupRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", "DescribeSecurityGroups")
+                          .addFormParam("GroupName.1", 
"jclouds#test").build());
+      
+      describeSecurityGroupResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 "/new_securitygroup.xml", 
MediaType.APPLICATION_XML)).build();
+      
+      authorizeSecurityGroupIngressRequest22 = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", 
"AuthorizeSecurityGroupIngress")
+                          .addFormParam("CidrIp", "0.0.0.0/0")
+                          .addFormParam("FromPort", "22")
+                          .addFormParam("ToPort", "22")
+                          .addFormParam("GroupName", "jclouds#test")
+                          .addFormParam("IpProtocol", "tcp").build());
+      
+      authorizeSecurityGroupIngressRequestGroup = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", 
"AuthorizeSecurityGroupIngress")
+                          .addFormParam("SourceSecurityGroupName", 
"jclouds#test")
+                          .addFormParam("SourceSecurityGroupOwnerId", 
"993194456877")
+                          .addFormParam("GroupName", "jclouds#test").build());
+      
+      authorizeSecurityGroupIngressResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 
"/authorize_securitygroup_ingress_response.xml", 
MediaType.APPLICATION_XML)).build();
+      
+      runInstancesRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", "RunInstances")
+                          .addFormParam("ImageId", "ami-be3adfd7")
+                          .addFormParam("InstanceType", "m1.small")
+                          .addFormParam("KeyName", "jclouds#test#0")
+                          .addFormParam("MaxCount", "1")
+                          .addFormParam("MinCount", "1")
+                          .addFormParam("SecurityGroup.1", 
"jclouds#test").build());
+      
+      runInstancesResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 "/new_instance.xml", 
MediaType.APPLICATION_XML)).build();
+
+      runThreeInstancesRequest =
+              formSigner.filter(HttpRequest.builder()
+                      .method("POST")
+                      .endpoint("https://ec2."; + region + ".amazonaws.com/")
+                      .addHeader("Host", "ec2." + region + ".amazonaws.com")
+                      .addFormParam("Action", "RunInstances")
+                      .addFormParam("ImageId", "ami-be3adfd7")
+                      .addFormParam("InstanceType", "m1.small")
+                      .addFormParam("KeyName", "jclouds#test#0")
+                      .addFormParam("MaxCount", "3")
+                      .addFormParam("MinCount", "3")
+                      .addFormParam("SecurityGroup.1", 
"jclouds#test").build());
+
+      runThreeToFourInstancesRequest =
+              formSigner.filter(HttpRequest.builder()
+                      .method("POST")
+                      .endpoint("https://ec2."; + region + ".amazonaws.com/")
+                      .addHeader("Host", "ec2." + region + ".amazonaws.com")
+                      .addFormParam("Action", "RunInstances")
+                      .addFormParam("ImageId", "ami-be3adfd7")
+                      .addFormParam("InstanceType", "m1.small")
+                      .addFormParam("KeyName", "jclouds#test#0")
+                      .addFormParam("MaxCount", "4")
+                      .addFormParam("MinCount", "3")
+                      .addFormParam("SecurityGroup.1", 
"jclouds#test").build());
+
+      runThreeInstancesResponse =
+              HttpResponse.builder().statusCode(200)
+                      .payload(payloadFromResourceWithContentType(
+                              "/run_instances_three.xml", 
MediaType.APPLICATION_XML)).build();
+
+      describeInstanceRequest =
+               formSigner.filter(HttpRequest.builder()
+                       .method("POST")
+                       .endpoint("https://ec2."; + region + ".amazonaws.com/")
+                       .addHeader("Host", "ec2." + region + ".amazonaws.com")
+                       .addFormParam("Action", "DescribeInstances")
+                       .addFormParam("InstanceId.1", "i-2baa5550").build());
+      
+      describeInstanceResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 "/describe_instances_running-1.xml", 
MediaType.APPLICATION_XML)).build();
+
+      describeInstanceMultiIdsRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("Action", "DescribeInstances")
+                          .addFormParam("InstanceId.1", "i-2baa5550")
+                          .addFormParam("InstanceId.2", "i-abcd1234").build());
+      
+      describeInstanceMultiIdsResponse = 
+               HttpResponse.builder().statusCode(200)
+                           .payload(payloadFromResourceWithContentType(
+                                 "/describe_instances_multiple.xml", 
MediaType.APPLICATION_XML)).build();
+
+      describeInstanceThreeIdsRequest =
+              formSigner.filter(HttpRequest.builder()
+                      .method("POST")
+                      .endpoint("https://ec2."; + region + ".amazonaws.com/")
+                      .addHeader("Host", "ec2." + region + ".amazonaws.com")
+                      .addFormParam("Action", "DescribeInstances")
+                      .addFormParam("InstanceId.1", "i-2ba64342")
+                      .addFormParam("InstanceId.2", "i-2bc64242")
+                      .addFormParam("InstanceId.3", "i-2be64332").build());
+
+      describeInstanceThreeIdsResponse =
+              HttpResponse.builder().statusCode(200)
+                      .payload(payloadFromResourceWithContentType(
+                              "/describe_instances_multiple.xml", 
MediaType.APPLICATION_XML)).build();
+
+      //TODO: duplicate.. shouldn't need this
+      describeImageRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2."; + region + 
".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + 
".amazonaws.com")
+                          .addFormParam("ImageId.1", "ami-aecd60c7")
+                          .addFormParam("Action", "DescribeImages").build());
+
+      createTagsRequest =
+              formSigner.filter(HttpRequest.builder()
+                      .method("POST")
+                      .endpoint("https://ec2.us-east-1.amazonaws.com/";)
+                      .addHeader("Host", "ec2.us-east-1.amazonaws.com")
+                      .payload(
+                              payloadFromStringWithContentType(
+                                      "Action=CreateTags" +
+                                              "&ResourceId.1=i-2baa5550" +
+                                              
"&Signature=Trp5e5%2BMqeBeBZbLYa9s9gxahQ9nkx6ETfsGl82IV8Y%3D" +
+                                              "&SignatureMethod=HmacSHA256" +
+                                              "&SignatureVersion=2" +
+                                              "&Tag.1.Key=Name" +
+                                              "&Tag.1.Value=test-2baa5550" +
+                                              
"&Timestamp=2012-04-16T15%3A54%3A08.897Z" +
+                                              "&Version=2010-08-31" +
+                                              "&AWSAccessKeyId=identity",
+                                      "application/x-www-form-urlencoded"))
+                      .build());
+
+      createTagsResponse = HttpResponse.builder().statusCode(200).build();
+
+   }
+
+   @Override
+   public ComputeService apply(ComputeServiceContext input) {
+      return input.getComputeService();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
new file mode 100644
index 0000000..9c7de8d
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
@@ -0,0 +1,230 @@
+/*
+ * 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.ec2.compute.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.c1_medium;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.fail;
+
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import javax.inject.Provider;
+
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.OperatingSystem;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
+import org.jclouds.compute.domain.internal.TemplateBuilderImplTest;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
+import org.jclouds.compute.suppliers.ImageCacheSupplier;
+import org.jclouds.domain.Location;
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.ec2.compute.functions.ImagesToRegionAndIdMap;
+import org.jclouds.ec2.compute.options.EC2TemplateOptions;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Functions;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+@Test(groups = "unit", singleThreaded = true)
+public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest {
+
+   @Override
+   protected TemplateOptions provideTemplateOptions() {
+      return new EC2TemplateOptions();
+   }
+
+   @Override
+   protected EC2TemplateBuilderImpl createTemplateBuilder(final Image 
knownImage,
+         @Memoized Supplier<Set<? extends Location>> locations, @Memoized 
final Supplier<Set<? extends Image>> images,
+         @Memoized Supplier<Set<? extends Hardware>> sizes, Location 
defaultLocation,
+         Provider<TemplateOptions> optionsProvider, Provider<TemplateBuilder> 
templateBuilderProvider, GetImageStrategy getImageStrategy) {
+
+      LoadingCache<RegionAndName, ? extends Image> imageMap;
+      if (knownImage != null) {
+         final RegionAndName knownRegionAndName = new 
RegionAndName(knownImage.getLocation().getId(), knownImage.getProviderId());
+
+         imageMap = CacheBuilder.newBuilder().build(new 
CacheLoader<RegionAndName, Image>() {
+            @Override
+            public Image load(RegionAndName from) {
+               return from.equals(knownRegionAndName) ? knownImage : null;
+            }
+
+         });
+         
+      } else {
+         imageMap = 
CacheBuilder.newBuilder().build(CacheLoader.from(Functions.forMap(
+                  ImagesToRegionAndIdMap.imagesToMap(images.get()))));
+      }
+
+      return new EC2TemplateBuilderImpl(locations, new 
ImageCacheSupplier(images, 60), sizes, Suppliers.ofInstance(defaultLocation),
+            optionsProvider, templateBuilderProvider, getImageStrategy, 
Suppliers.<LoadingCache<RegionAndName, ? extends Image>>ofInstance(imageMap));
+   }
+
+   @Override
+   protected String getProviderFormatId(String uniqueLabel) {
+       return "us-east-1/" + uniqueLabel;
+   }
+
+   @Override
+   @Test
+   public void 
testHardwareWithImageIdPredicateOnlyAcceptsImageWhenLocationNull() {
+      // not possible to have null region in ec2
+   }
+   
+   @SuppressWarnings("unchecked")
+   @Test
+   public void testParseOnDemand() {
+
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends 
Location>> ofInstance(ImmutableSet
+            .<Location> of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> 
ofInstance(Sets
+            .<Image> newLinkedHashSet());
+      Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends 
Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(c1_medium().build()));
+
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
+      TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      Image knownImage = createMock(Image.class);
+      OperatingSystem os = createMock(OperatingSystem.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(defaultOptions);
+
+      expect(knownImage.getId()).andReturn("us-east-1/ami").atLeastOnce();
+      expect(knownImage.getLocation()).andReturn(region).atLeastOnce();
+      expect(knownImage.getName()).andReturn(null).atLeastOnce();
+      expect(knownImage.getDescription()).andReturn(null).atLeastOnce();
+      expect(knownImage.getVersion()).andReturn(null).atLeastOnce();
+      expect(knownImage.getProviderId()).andReturn("ami").atLeastOnce();
+
+      expect(knownImage.getOperatingSystem()).andReturn(os).atLeastOnce();
+
+      expect(os.getName()).andReturn(null).atLeastOnce();
+      expect(os.getVersion()).andReturn(null).atLeastOnce();
+      expect(os.getFamily()).andReturn(null).atLeastOnce();
+      expect(os.getDescription()).andReturn(null).atLeastOnce();
+      expect(os.getArch()).andReturn("paravirtual").atLeastOnce();
+      expect(os.is64Bit()).andReturn(false).atLeastOnce();
+
+      replay(knownImage, os, defaultOptions, optionsProvider, 
templateBuilderProvider, getImageStrategy);
+
+      TemplateBuilderImpl template = createTemplateBuilder(knownImage, 
locations, images, sizes, region,
+            optionsProvider, templateBuilderProvider, getImageStrategy);
+
+      assertEquals(template.imageId("us-east-1/ami").build().getImage(), 
knownImage);
+
+      verify(knownImage, os, defaultOptions, optionsProvider, 
templateBuilderProvider, getImageStrategy);
+   }
+
+   @SuppressWarnings("unchecked")
+   @Test
+   public void testParseOnDemandWithoutRegionEncodedIntoId() {
+
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends 
Location>> ofInstance(ImmutableSet
+            .<Location> of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> 
ofInstance(ImmutableSet.<Image> of());
+      Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends 
Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(c1_medium().build()));
+
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
+      TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      Image knownImage = createMock(Image.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+      expect(knownImage.getId()).andReturn("region/ami").anyTimes();
+      expect(knownImage.getProviderId()).andReturn("ami").anyTimes();
+      expect(knownImage.getLocation()).andReturn(region).anyTimes();
+
+      expect(optionsProvider.get()).andReturn(defaultOptions);
+
+      replay(knownImage,  defaultOptions, optionsProvider, 
templateBuilderProvider, getImageStrategy);
+
+      TemplateBuilderImpl template = createTemplateBuilder(knownImage, 
locations, images, sizes, region,
+            optionsProvider, templateBuilderProvider, getImageStrategy);
+      try {
+         template.imageId("ami").build();
+         fail("Expected IllegalArgumentException");
+      } catch (IllegalArgumentException e) {
+
+      }
+
+      verify(knownImage,  defaultOptions, optionsProvider, 
templateBuilderProvider, getImageStrategy);
+   }
+
+   @SuppressWarnings("unchecked")
+   @Test(expectedExceptions = NoSuchElementException.class)
+   public void testParseOnDemandNotFound() {
+
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends 
Location>> ofInstance(ImmutableSet
+            .<Location> of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> 
ofInstance(ImmutableSet.<Image> of());
+      Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends 
Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(c1_medium().build()));
+
+      Location defaultLocation = createMock(Location.class);
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
+      TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+      Image knownImage = createMock(Image.class);
+      expect(knownImage.getId()).andReturn("region/ami").anyTimes();
+      expect(knownImage.getProviderId()).andReturn("ami").anyTimes();
+      expect(knownImage.getLocation()).andReturn(region).anyTimes();
+
+      expect(defaultLocation.getId()).andReturn("region");
+      expect(optionsProvider.get()).andReturn(defaultOptions);
+
+      replay(knownImage,  defaultOptions, defaultLocation, optionsProvider, 
templateBuilderProvider, getImageStrategy);
+
+      TemplateBuilderImpl template = createTemplateBuilder(knownImage, 
locations, images, sizes, defaultLocation,
+            optionsProvider, templateBuilderProvider, getImageStrategy);
+
+      assertEquals(template.imageId("region/bad").build().getImage(), 
knownImage);
+
+      verify(knownImage,  defaultOptions, defaultLocation, optionsProvider, 
templateBuilderProvider, getImageStrategy);
+   }
+
+   // The EC2 provider already overrides the getImage method so this test is 
not useful for EC2
+   @Override
+   @Test(enabled = false)
+   public void testFindImageWithIdDefaultToGetImageStrategy() {
+
+   }
+
+   // The EC2 provider already overrides the getImage method so this test is 
not useful for EC2
+   @Override
+   public void 
testFindImageWithIdDefaultToGetImageStrategyAndPopulatesTheCache() {
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/CreateSecurityGroupIfNeededTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/CreateSecurityGroupIfNeededTest.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/CreateSecurityGroupIfNeededTest.java
new file mode 100644
index 0000000..98ee834
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/CreateSecurityGroupIfNeededTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.ec2.compute.loaders;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.testng.Assert.assertEquals;
+
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
+import org.jclouds.ec2.domain.SecurityGroup;
+import org.jclouds.ec2.domain.UserIdGroupPair;
+import org.jclouds.ec2.features.SecurityGroupApi;
+import org.jclouds.net.domain.IpProtocol;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableSet;
+
+@Test(groups = "unit", singleThreaded = true, testName = 
"CreateSecurityGroupIfNeeded")
+public class CreateSecurityGroupIfNeededTest {
+
+   @SuppressWarnings("unchecked")
+   @Test
+   public void testWhenPort22AndToItselfAuthorizesIngressTwice() throws 
ExecutionException {
+
+      SecurityGroupApi client = createMock(SecurityGroupApi.class);
+      Predicate<RegionAndName> tester = Predicates.alwaysTrue();
+
+      SecurityGroup group = createNiceMock(SecurityGroup.class);
+      Set<SecurityGroup> groups = ImmutableSet.<SecurityGroup> of(group);
+
+      client.createSecurityGroupInRegion("region", "group", "group");
+      client.authorizeSecurityGroupIngressInRegion("region", "group", 
IpProtocol.TCP, 22, 22, "0.0.0.0/0");
+      expect(client.describeSecurityGroupsInRegion("region", 
"group")).andReturn(Set.class.cast(groups));
+      expect(group.getOwnerId()).andReturn("ownerId");
+      client.authorizeSecurityGroupIngressInRegion("region", "group", new 
UserIdGroupPair("ownerId", "group"));
+
+      replay(client);
+      replay(group);
+
+      CreateSecurityGroupIfNeeded function = new 
CreateSecurityGroupIfNeeded(client, tester);
+
+      assertEquals("group", function.load(new 
RegionNameAndIngressRules("region", "group", new int[] { 22 }, true)));
+
+      verify(client);
+      verify(group);
+
+   }
+
+   @Test
+   public void testIllegalStateExceptionCreatingGroupJustReturns() throws 
ExecutionException {
+
+      SecurityGroupApi client = createMock(SecurityGroupApi.class);
+      Predicate<RegionAndName> tester = Predicates.alwaysTrue();
+
+      client.createSecurityGroupInRegion("region", "group", "group");
+      expectLastCall().andThrow(new IllegalStateException());
+
+      replay(client);
+
+      CreateSecurityGroupIfNeeded function = new 
CreateSecurityGroupIfNeeded(client, tester);
+
+      assertEquals("group", function.load(new 
RegionNameAndIngressRules("region", "group", new int[] { 22 }, true)));
+
+      verify(client);
+
+   }
+
+   @Test(expectedExceptions = RuntimeException.class)
+   public void testWhenEventualConsistencyExpiresIllegalStateException() 
throws ExecutionException {
+
+      SecurityGroupApi client = createMock(SecurityGroupApi.class);
+      Predicate<RegionAndName> tester = Predicates.alwaysFalse();
+
+      client.createSecurityGroupInRegion("region", "group", "group");
+
+      replay(client);
+
+      CreateSecurityGroupIfNeeded function = new 
CreateSecurityGroupIfNeeded(client, tester);
+      function.load(new RegionNameAndIngressRules("region", "group", new int[] 
{ 22 }, true));
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java
new file mode 100644
index 0000000..fde64ca
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.ec2.compute.loaders;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
+import org.jclouds.ec2.features.ElasticIPAddressApi;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableSet;
+
+@Test(groups = "unit", singleThreaded = true, testName = 
"LoadPublicIpForInstanceOrNullTest")
+public class LoadPublicIpForInstanceOrNullTest {
+
+   @Test
+   public void testReturnsPublicIpOnMatch() throws Exception {
+      EC2Api client = createMock(EC2Api.class);
+      ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
+
+      expect(client.getElasticIPAddressApi()).andReturn((Optional) 
Optional.of(ipClient)).atLeastOnce();
+      expect(ipClient.describeAddressesInRegion("region")).andReturn(
+               ImmutableSet.<PublicIpInstanceIdPair> of(new 
PublicIpInstanceIdPair("region", "1.1.1.1", "i-blah")))
+               .atLeastOnce();
+
+      replay(client);
+      replay(ipClient);
+
+      LoadPublicIpForInstanceOrNull parser = new 
LoadPublicIpForInstanceOrNull(client);
+
+      assertEquals(parser.load(new RegionAndName("region", "i-blah")), 
"1.1.1.1");
+
+      verify(client);
+      verify(ipClient);
+   }
+
+   @Test
+   public void testReturnsNullWhenNotFound() throws Exception {
+      EC2Api client = createMock(EC2Api.class);
+      ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
+
+      expect(client.getElasticIPAddressApi()).andReturn((Optional) 
Optional.of(ipClient)).atLeastOnce();
+
+      
expect(ipClient.describeAddressesInRegion("region")).andReturn(ImmutableSet.<PublicIpInstanceIdPair>
 of())
+               .atLeastOnce();
+
+      replay(client);
+      replay(ipClient);
+
+      LoadPublicIpForInstanceOrNull parser = new 
LoadPublicIpForInstanceOrNull(client);
+
+      assertEquals(parser.load(new RegionAndName("region", "i-blah")), null);
+
+      verify(client);
+      verify(ipClient);
+
+   }
+
+   @Test
+   public void testReturnsNullWhenNotAssigned() throws Exception {
+      EC2Api client = createMock(EC2Api.class);
+      ElasticIPAddressApi ipClient = createMock(ElasticIPAddressApi.class);
+
+      expect(client.getElasticIPAddressApi()).andReturn((Optional) 
Optional.of(ipClient)).atLeastOnce();
+
+      expect(ipClient.describeAddressesInRegion("region")).andReturn(
+               ImmutableSet.<PublicIpInstanceIdPair> of(new 
PublicIpInstanceIdPair("region", "1.1.1.1", null)))
+               .atLeastOnce();
+
+      replay(client);
+      replay(ipClient);
+
+      LoadPublicIpForInstanceOrNull parser = new 
LoadPublicIpForInstanceOrNull(client);
+
+      assertEquals(parser.load(new RegionAndName("region", "i-blah")), null);
+
+      verify(client);
+      verify(ipClient);
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/RegionAndIdToImageTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/RegionAndIdToImageTest.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/RegionAndIdToImageTest.java
new file mode 100644
index 0000000..86ff871
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/loaders/RegionAndIdToImageTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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.ec2.compute.loaders;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.imageIds;
+import static org.testng.Assert.assertEquals;
+
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+
+import org.jclouds.compute.domain.Image;
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.ec2.compute.functions.EC2ImageParser;
+import org.jclouds.ec2.features.AMIApi;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableSet;
+
+@Test(groups = "unit")
+public class RegionAndIdToImageTest {
+
+   @SuppressWarnings("unchecked")
+   @Test
+   public void testApply() throws ExecutionException {
+
+      EC2ImageParser parser = createMock(EC2ImageParser.class);
+      EC2Api caller = createMock(EC2Api.class);
+      AMIApi client = createMock(AMIApi.class);
+
+      org.jclouds.ec2.domain.Image ec2Image = 
createMock(org.jclouds.ec2.domain.Image.class);
+      Image image = createNiceMock(Image.class);
+      Set<? extends org.jclouds.ec2.domain.Image> images = 
ImmutableSet.<org.jclouds.ec2.domain.Image> of(ec2Image);
+
+      expect(caller.getAMIApi()).andReturn((Optional) 
Optional.of(client)).atLeastOnce();
+      expect(client.describeImagesInRegion("region", 
imageIds("ami"))).andReturn(Set.class.cast(images));
+      expect(parser.apply(ec2Image)).andReturn(image);
+
+      replay(caller);
+      replay(image);
+      replay(parser);
+      replay(client);
+
+      RegionAndIdToImage function = new RegionAndIdToImage(parser, caller);
+
+      assertEquals(function.load(new RegionAndName("region", "ami")), image);
+
+      verify(caller);
+      verify(image);
+      verify(image);
+      verify(client);
+
+   }
+
+   @SuppressWarnings("unchecked")
+   @Test(expectedExceptions = ExecutionException.class)
+   public void testApplyNotFoundMakesExecutionException() throws 
ExecutionException {
+
+      EC2ImageParser parser = createMock(EC2ImageParser.class);
+      EC2Api caller = createMock(EC2Api.class);
+      AMIApi client = createMock(AMIApi.class);
+
+      org.jclouds.ec2.domain.Image ec2Image = 
createMock(org.jclouds.ec2.domain.Image.class);
+      Image image = createNiceMock(Image.class);
+      Set<? extends org.jclouds.ec2.domain.Image> images = 
ImmutableSet.<org.jclouds.ec2.domain.Image> of(ec2Image);
+
+      expect(caller.getAMIApi()).andReturn((Optional) 
Optional.of(client)).atLeastOnce();
+      expect(client.describeImagesInRegion("region", 
imageIds("ami"))).andReturn(Set.class.cast(images));
+      expect(parser.apply(ec2Image)).andThrow(new ResourceNotFoundException());
+
+      replay(caller);
+      replay(image);
+      replay(parser);
+      replay(client);
+
+      RegionAndIdToImage function = new RegionAndIdToImage(parser, caller);
+
+      assertEquals(function.load(new RegionAndName("region", "ami")), null);
+
+      verify(caller);
+      verify(image);
+      verify(parser);
+      verify(client);
+
+   }
+
+   @SuppressWarnings("unchecked")
+   @Test(expectedExceptions = ExecutionException.class)
+   public void testApplyNoSuchElementExceptionMakesExecutionException() throws 
ExecutionException {
+
+      EC2ImageParser parser = createMock(EC2ImageParser.class);
+      EC2Api caller = createMock(EC2Api.class);
+      AMIApi client = createMock(AMIApi.class);
+
+      org.jclouds.ec2.domain.Image ec2Image = 
createMock(org.jclouds.ec2.domain.Image.class);
+      Image image = createNiceMock(Image.class);
+      Set<? extends org.jclouds.ec2.domain.Image> images = 
ImmutableSet.<org.jclouds.ec2.domain.Image> of(ec2Image);
+
+      expect(caller.getAMIApi()).andReturn((Optional) 
Optional.of(client)).atLeastOnce();
+      expect(client.describeImagesInRegion("region", 
imageIds("ami"))).andReturn(Set.class.cast(images));
+      expect(parser.apply(ec2Image)).andThrow(new NoSuchElementException());
+
+      replay(caller);
+      replay(image);
+      replay(parser);
+      replay(client);
+
+      RegionAndIdToImage function = new RegionAndIdToImage(parser, caller);
+
+      assertEquals(function.load(new RegionAndName("region", "ami")), null);
+
+      verify(caller);
+      verify(image);
+      verify(parser);
+      verify(client);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/options/EC2TemplateOptionsTest.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/options/EC2TemplateOptionsTest.java
 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/options/EC2TemplateOptionsTest.java
new file mode 100644
index 0000000..a3f6cde
--- /dev/null
+++ 
b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/options/EC2TemplateOptionsTest.java
@@ -0,0 +1,325 @@
+/*
+ * 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.ec2.compute.options;
+
+import static 
org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.authorizePublicKey;
+import static 
org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.blockOnPort;
+import static 
org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.inboundPorts;
+import static 
org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.installPrivateKey;
+import static 
org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.keyPair;
+import static 
org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.noKeyPair;
+import static 
org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.securityGroups;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+
+import java.io.IOException;
+
+import com.google.common.collect.ImmutableSet;
+import org.jclouds.compute.options.TemplateOptions;
+import org.testng.annotations.Test;
+
+/**
+ * Tests possible uses of EC2TemplateOptions and EC2TemplateOptions.Builder.*
+ */
+public class EC2TemplateOptionsTest {
+
+   public void testAs() {
+      TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.as(EC2TemplateOptions.class), options);
+   }
+
+   @Test(expectedExceptions = NullPointerException.class, 
expectedExceptionsMessageRegExp = "all security groups must be non-empty")
+   public void testsecurityGroupsIterableBadFormat() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.securityGroups(ImmutableSet.of("group1", ""));
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class)
+   public void testsecurityGroupsIterableEmptyNotOk() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.securityGroups(ImmutableSet.<String> of());
+   }
+
+   @Test
+   public void testsecurityGroupsIterable() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.securityGroups(ImmutableSet.of("group1", "group2"));
+      assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
+
+   }
+
+   @Test
+   public void testsecurityGroupsIterableStatic() {
+      EC2TemplateOptions options = securityGroups(ImmutableSet.of("group1", 
"group2"));
+      assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
+   }
+
+   @Test(expectedExceptions = NullPointerException.class, 
expectedExceptionsMessageRegExp = "all security groups must be non-empty")
+   public void testsecurityGroupsVarArgsBadFormat() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.securityGroups("mygroup", "");
+   }
+
+   @Test
+   public void testsecurityGroupsVarArgs() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.securityGroups("group1", "group2");
+      assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
+
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class)
+   public void testsecurityGroupsVarArgsEmptyNotOk() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.securityGroups();
+   }
+
+   @Test
+   public void testDefaultGroupsVarArgsEmpty() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.getGroups(), ImmutableSet.of());
+   }
+
+   @Test
+   public void testsecurityGroupsVarArgsStatic() {
+      EC2TemplateOptions options = securityGroups("group1", "group2");
+      assertEquals(options.getGroups(), ImmutableSet.of("group1", "group2"));
+   }
+
+   @Test(expectedExceptions = NullPointerException.class, 
expectedExceptionsMessageRegExp = "use noKeyPair option to request boot without 
a keypair")
+   public void testkeyPairBadFormat() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.keyPair("");
+   }
+
+   @Test(expectedExceptions = IllegalStateException.class)
+   public void testkeyPairAndNoKeyPair() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.keyPair("mykeypair");
+      options.noKeyPair();
+   }
+
+   @Test(expectedExceptions = IllegalStateException.class)
+   public void testNoKeyPairAndKeyPair() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.noKeyPair();
+      options.keyPair("mykeypair");
+   }
+
+   @Test
+   public void testkeyPair() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.keyPair("mykeypair");
+      assertEquals(options.getKeyPair(), "mykeypair");
+   }
+
+   @Test
+   public void testNullkeyPair() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.getKeyPair(), null);
+   }
+
+   @Test
+   public void testkeyPairStatic() {
+      EC2TemplateOptions options = keyPair("mykeypair");
+      assertEquals(options.getKeyPair(), "mykeypair");
+   }
+
+   @Test(expectedExceptions = NullPointerException.class)
+   public void testkeyPairNPE() {
+      keyPair(null);
+   }
+
+   @Test
+   public void testnoKeyPair() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.noKeyPair();
+      assertEquals(options.getKeyPair(), null);
+      assert !options.shouldAutomaticallyCreateKeyPair();
+   }
+
+   @Test
+   public void testFalsenoKeyPair() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.getKeyPair(), null);
+      assert options.shouldAutomaticallyCreateKeyPair();
+   }
+
+   @Test
+   public void testnoKeyPairStatic() {
+      EC2TemplateOptions options = noKeyPair();
+      assertEquals(options.getKeyPair(), null);
+      assert !options.shouldAutomaticallyCreateKeyPair();
+   }
+
+   // superclass tests
+   @Test(expectedExceptions = IllegalArgumentException.class)
+   public void testinstallPrivateKeyBadFormat() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.installPrivateKey("whompy");
+   }
+
+   @Test
+   public void testinstallPrivateKey() throws IOException {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.installPrivateKey("-----BEGIN RSA PRIVATE KEY-----");
+      assertEquals(options.getPrivateKey(), "-----BEGIN RSA PRIVATE KEY-----");
+   }
+
+   @Test
+   public void testNullinstallPrivateKey() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.getPrivateKey(), null);
+   }
+
+   @Test
+   public void testinstallPrivateKeyStatic() throws IOException {
+      EC2TemplateOptions options = installPrivateKey("-----BEGIN RSA PRIVATE 
KEY-----");
+      assertEquals(options.getPrivateKey(), "-----BEGIN RSA PRIVATE KEY-----");
+   }
+
+   @Test(expectedExceptions = NullPointerException.class)
+   public void testinstallPrivateKeyNPE() {
+      installPrivateKey(null);
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class)
+   public void testauthorizePublicKeyBadFormat() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.authorizePublicKey("whompy");
+   }
+
+   @Test
+   public void testauthorizePublicKey() throws IOException {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.authorizePublicKey("ssh-rsa");
+      assertEquals(options.getPublicKey(), "ssh-rsa");
+   }
+
+   @Test
+   public void testNullauthorizePublicKey() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.getPublicKey(), null);
+   }
+
+   @Test
+   public void testauthorizePublicKeyStatic() throws IOException {
+      EC2TemplateOptions options = authorizePublicKey("ssh-rsa");
+      assertEquals(options.getPublicKey(), "ssh-rsa");
+   }
+
+   @Test(expectedExceptions = NullPointerException.class)
+   public void testauthorizePublicKeyNPE() {
+      authorizePublicKey(null);
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class)
+   public void testblockOnPortBadFormat() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.blockOnPort(-1, -1);
+   }
+
+   @Test
+   public void testblockOnPort() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.blockOnPort(22, 30);
+      assertEquals(options.getPort(), 22);
+      assertEquals(options.getSeconds(), 30);
+
+   }
+
+   @Test
+   public void testNullblockOnPort() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.getPort(), -1);
+      assertEquals(options.getSeconds(), -1);
+   }
+
+   @Test
+   public void testblockOnPortStatic() {
+      EC2TemplateOptions options = blockOnPort(22, 30);
+      assertEquals(options.getPort(), 22);
+      assertEquals(options.getSeconds(), 30);
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class)
+   public void testinboundPortsBadFormat() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.inboundPorts(-1, -1);
+   }
+
+   @Test
+   public void testinboundPorts() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.inboundPorts(22, 30);
+      assertEquals(options.getInboundPorts()[0], 22);
+      assertEquals(options.getInboundPorts()[1], 30);
+
+   }
+
+   @Test
+   public void testDefaultOpen22() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.getInboundPorts()[0], 22);
+   }
+
+   @Test
+   public void testinboundPortsStatic() {
+      EC2TemplateOptions options = inboundPorts(22, 30);
+      assertEquals(options.getInboundPorts()[0], 22);
+      assertEquals(options.getInboundPorts()[1], 30);
+   }
+
+   @Test
+   public void testMaxCountDefault() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertEquals(options.getMaxCount(), 0);
+   }
+
+   @Test
+   public void testMaxCount() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.maxCount(2);
+      assertEquals(options.getMaxCount(), 2);
+   }
+
+   @Test
+   public void testMaxCountNull() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.maxCount(null);
+      assertEquals(options.getMaxCount(), 0);
+   }
+
+   @Test
+   public void testClientTokenDefault() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      assertNull(options.getClientToken());
+   }
+
+   @Test
+   public void testClientToken() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.clientToken("some-token");
+      assertEquals(options.getClientToken(), "some-token");
+   }
+
+   @Test(expectedExceptions = NullPointerException.class)
+   public void testClientTokenNPE() {
+      EC2TemplateOptions options = new EC2TemplateOptions();
+      options.clientToken(null);
+   }
+}

Reply via email to