mirror of https://github.com/apache/jclouds.git
PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest
This commit is contained in:
parent
94edcbf00d
commit
03028338df
|
@ -0,0 +1,130 @@
|
|||
package org.jclouds.openstack.nova.v1_1.functions;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Set;
|
||||
|
||||
import org.jclouds.date.internal.SimpleDateFormatDateService;
|
||||
import org.jclouds.internal.ClassMethodArgsAndReturnVal;
|
||||
import org.jclouds.openstack.nova.v1_1.domain.Extension;
|
||||
import org.jclouds.openstack.nova.v1_1.extensions.ExtensionNamespaces;
|
||||
import org.jclouds.openstack.nova.v1_1.extensions.KeyPairAsyncClient;
|
||||
import org.jclouds.openstack.services.ServiceType;
|
||||
import org.jclouds.rest.annotations.Delegate;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.base.Functions;
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.google.common.cache.CacheLoader;
|
||||
import com.google.common.cache.LoadingCache;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest")
|
||||
public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest {
|
||||
|
||||
Extension keypairs = Extension.builder().alias("os-keypairs").name("Keypairs").namespace(
|
||||
URI.create("http://docs.openstack.org/ext/keypairs/api/v1.1")).updated(
|
||||
new SimpleDateFormatDateService().iso8601SecondsDateParse("2011-08-08T00:00:00+00:00")).description(
|
||||
"Keypair Support").build();
|
||||
|
||||
@org.jclouds.openstack.services.Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.KEYPAIRS)
|
||||
static interface KeyPairIPAsyncClient {
|
||||
|
||||
}
|
||||
|
||||
Extension floatingIps = Extension.builder().alias("os-floating-ips").name("Floating_ips").namespace(
|
||||
URI.create("http://docs.openstack.org/ext/floating_ips/api/v1.1")).updated(
|
||||
new SimpleDateFormatDateService().iso8601SecondsDateParse("2011-06-16T00:00:00+00:00")).description(
|
||||
"Floating IPs support").build();
|
||||
|
||||
@org.jclouds.openstack.services.Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.FLOATING_IPS)
|
||||
static interface FloatingIPAsyncClient {
|
||||
|
||||
}
|
||||
|
||||
static interface NovaAsyncClient {
|
||||
|
||||
@Delegate
|
||||
Optional<FloatingIPAsyncClient> getFloatingIPExtensionForZone(String zone);
|
||||
|
||||
@Delegate
|
||||
Optional<KeyPairAsyncClient> getKeyPairExtensionForZone(String zone);
|
||||
|
||||
}
|
||||
|
||||
ClassMethodArgsAndReturnVal getFloatingIPExtension() throws SecurityException, NoSuchMethodException {
|
||||
return ClassMethodArgsAndReturnVal.builder().clazz(FloatingIPAsyncClient.class).method(
|
||||
NovaAsyncClient.class.getDeclaredMethod("getFloatingIPExtensionForZone", String.class)).args(
|
||||
new Object[] { "expectedzone" }).returnVal("foo").build();
|
||||
}
|
||||
|
||||
ClassMethodArgsAndReturnVal getKeyPairExtension() throws SecurityException, NoSuchMethodException {
|
||||
return ClassMethodArgsAndReturnVal.builder().clazz(KeyPairAsyncClient.class).method(
|
||||
NovaAsyncClient.class.getDeclaredMethod("getKeyPairExtensionForZone", String.class)).args(
|
||||
new Object[] { "expectedzone" }).returnVal("foo").build();
|
||||
}
|
||||
|
||||
public void testPresentWhenExtensionsIncludeNamespaceFromAnnotationAbsentWhenNot() throws SecurityException, NoSuchMethodException {
|
||||
|
||||
assertEquals(whenExtensionsInclude(keypairs, floatingIps).apply(getFloatingIPExtension()), Optional.of("foo"));
|
||||
assertEquals(whenExtensionsInclude(keypairs, floatingIps).apply(getKeyPairExtension()), Optional.of("foo"));
|
||||
assertEquals(whenExtensionsInclude(keypairs).apply(getFloatingIPExtension()), Optional.absent());
|
||||
assertEquals(whenExtensionsInclude(floatingIps).apply(getKeyPairExtension()), Optional.absent());
|
||||
}
|
||||
|
||||
public void testZoneWithoutExtensionsReturnsAbsent() throws SecurityException, NoSuchMethodException {
|
||||
assertEquals(whenExtensionsInclude(floatingIps).apply(
|
||||
getFloatingIPExtension().toBuilder().args(new Object[] { "differentzone" }).build()), Optional.absent());
|
||||
assertEquals(whenExtensionsInclude(keypairs).apply(
|
||||
getKeyPairExtension().toBuilder().args(new Object[] { "differentzone" }).build()), Optional.absent());
|
||||
}
|
||||
|
||||
/**
|
||||
* It is possible that the /extensions call returned the correct extension, but that the
|
||||
* namespaces were different, for whatever reason. One way to address this is to have a multimap
|
||||
* of the authoritative namespace to alternate onces, which could be wired up with guice
|
||||
*
|
||||
*/
|
||||
@Test(enabled = false)
|
||||
public void testPresentWhenAliasForExtensionMapsToNamespace() throws SecurityException, NoSuchMethodException {
|
||||
Extension keypairsWithDifferentNamespace = keypairs.toBuilder().namespace(
|
||||
URI.create("http://docs.openstack.org/ext/arbitrarilydifferent/keypairs/api/v1.1")).build();
|
||||
|
||||
Multimap<URI, URI> aliases = ImmutableMultimap.of(keypairs.getNamespace(), keypairsWithDifferentNamespace
|
||||
.getNamespace());
|
||||
|
||||
assertEquals(whenExtensionsAndAliasesInclude(ImmutableSet.of(keypairsWithDifferentNamespace), aliases).apply(
|
||||
getFloatingIPExtension()), Optional.of("foo"));
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
private PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet whenExtensionsInclude(
|
||||
Extension... extensions) {
|
||||
return whenExtensionsAndAliasesInclude(ImmutableSet.copyOf(extensions), ImmutableMultimap.<URI, URI> of());
|
||||
}
|
||||
|
||||
private PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet whenExtensionsAndAliasesInclude(
|
||||
Set<Extension> extensions, Multimap<URI, URI> aliases) {
|
||||
LoadingCache<String, Set<Extension>> extensionsForZone = CacheBuilder.newBuilder().build(
|
||||
CacheLoader.from(Functions.forMap(ImmutableMap.of("expectedzone", extensions, "differentzone",
|
||||
ImmutableSet.<Extension> of()))));
|
||||
|
||||
PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet fn = new PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet(
|
||||
extensionsForZone);
|
||||
// TODO: change the constructor to accept aliases, or add an @Inject(optional=true) field inside the class
|
||||
// PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet fn = new
|
||||
// PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet(
|
||||
// extensionsForZone, aliases);
|
||||
return fn;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue