/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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;
import static com.google.common.base.Suppliers.ofInstance;
import static org.testng.Assert.assertEquals;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.jclouds.concurrent.config.ExecutorServiceModule;
import org.jclouds.domain.Credentials;
import org.jclouds.events.config.EventBusModule;
import org.jclouds.http.IntegrationTestAsyncClient;
import org.jclouds.http.IntegrationTestClient;
import org.jclouds.http.config.ConfiguresHttpCommandExecutorService;
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
import org.jclouds.location.Provider;
import org.jclouds.logging.config.LoggingModule;
import org.jclouds.logging.config.NullLoggingModule;
import org.jclouds.logging.jdk.config.JDKLoggingModule;
import org.jclouds.providers.AnonymousProviderMetadata;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.annotations.ApiVersion;
import org.jclouds.rest.config.CredentialStoreModule;
import org.testng.annotations.Test;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.inject.AbstractModule;
import com.google.inject.Binder;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of modules configured in ContextBuilder
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName="ContextBuilderTest")
public class ContextBuilderTest {
@ConfiguresHttpCommandExecutorService
static class HttpModule extends AbstractModule {
protected void configure() {
}
}
private ContextBuilder testContextBuilder() {
return ContextBuilder.newBuilder(AnonymousProviderMetadata.forClientMappedToAsyncClientOnEndpoint(
IntegrationTestClient.class, IntegrationTestAsyncClient.class, "http://localhost"));
}
@Test
public void testVariablesReplaceOnEndpoint() {
ContextBuilder withVariablesToReplace = testContextBuilder().endpoint("http://${jclouds.identity}.service.com")
.credentials("foo", "bar");
URI endpoint = withVariablesToReplace.buildInjector().getInstance(
Key.get(new TypeLiteral<Supplier<URI>>(){}, Provider.class)).get();
assertEquals(endpoint, URI.create("http://foo.service.com"));
}
@Test
public void testContextName() {
ContextBuilder withNoName = testContextBuilder().endpoint("http://${jclouds.identity}.service.com").name("mytest")
.credentials("foo", "bar");
Context context = withNoName.build();
assertEquals(context.getName(), "mytest");
}
@Test
public void testProviderMetadataBoundWithCorrectEndpoint() {
ContextBuilder withVariablesToReplace = testContextBuilder().endpoint("http://${jclouds.identity}.service.com")
.credentials("foo", "bar");
String endpoint = withVariablesToReplace.buildInjector().getInstance(ProviderMetadata.class).getEndpoint();
assertEquals(endpoint, "http://foo.service.com");
}
@Test
public void testProviderMetadataWithEmptyIsoCodePropertyHasEmptySet() {
Properties overrides = new Properties();
overrides.setProperty(Constants.PROPERTY_ISO3166_CODES, "");
ContextBuilder withVariablesToReplace = testContextBuilder().overrides(overrides).credentials("foo", "bar");
Set<String> codes = withVariablesToReplace.buildInjector().getInstance(ProviderMetadata.class).getIso3166Codes();
assertEquals(codes, ImmutableSet.<String> of());
}
@Test
public void testProviderMetadataWithCredentialsSetViaProperty() {
Properties overrides = new Properties();
overrides.setProperty(Constants.PROPERTY_IDENTITY, "foo");
overrides.setProperty(Constants.PROPERTY_CREDENTIAL, "BAR");
ContextBuilder withCredsInProps = testContextBuilder().overrides(overrides);
Credentials creds = withCredsInProps.buildInjector()
.getInstance(Key.get(new TypeLiteral<Supplier<Credentials>>() {
}, Provider.class)).get();
assertEquals(creds, new Credentials("foo", "BAR"));
}
@Test
public void testProviderMetadataWithCredentialsSetSupplier() {
ContextBuilder withCredsSupplier = testContextBuilder().credentialsSupplier(
ofInstance(new Credentials("foo", "BAR")));
Credentials creds = withCredsSupplier.buildInjector()
.getInstance(Key.get(new TypeLiteral<Supplier<Credentials>>() {
}, Provider.class)).get();
assertEquals(creds, new Credentials("foo", "BAR"));
}
@Test
public void testProviderMetadataWithVersionSetViaProperty() {
Properties overrides = new Properties();
overrides.setProperty(Constants.PROPERTY_API_VERSION, "1.1");
ContextBuilder withVersionInProps = testContextBuilder().overrides(overrides);
String version = withVersionInProps.buildInjector().getInstance(Key.get(String.class, ApiVersion.class));
assertEquals(version, "1.1");
}
@Test
public void testAddHttpModuleIfNotPresent() {
List<Module> modules = Lists.newArrayList();
HttpModule module = new HttpModule();
modules.add(module);
ContextBuilder.addHttpModuleIfNeededAndNotPresent(modules);
assertEquals(modules.size(), 1);
assertEquals(modules.remove(0), module);
}
@Test
public void testAddLoggingModuleIfNotPresent() {
List<Module> modules = Lists.newArrayList();
LoggingModule module = new NullLoggingModule();
modules.add(module);
ContextBuilder.addLoggingModuleIfNotPresent(modules);
assertEquals(modules.size(), 1);
assertEquals(modules.remove(0), module);
}
@Test
public void testAddEventBusModuleIfNotPresent() {
List<Module> modules = Lists.newArrayList();
EventBusModule module = new EventBusModule();
modules.add(module);
ContextBuilder.addEventBusIfNotPresent(modules);
assertEquals(modules.size(), 1);
assertEquals(modules.remove(0), module);
}
@Test
public void testAddExecutorServiceModuleIfNotPresent() {
List<Module> modules = Lists.newArrayList();
ExecutorServiceModule module = new ExecutorServiceModule();
modules.add(module);
ContextBuilder.addExecutorServiceIfNotPresent(modules);
assertEquals(modules.size(), 1);
assertEquals(modules.remove(0), module);
}
@Test
public void testAddCredentialStoreModuleIfNotPresent() {
List<Module> modules = Lists.newArrayList();
CredentialStoreModule module = new CredentialStoreModule();
modules.add(module);
ContextBuilder.addCredentialStoreIfNotPresent(modules);
assertEquals(modules.size(), 1);
assertEquals(modules.remove(0), module);
}
@Test
public void testAddNone() {
List<Module> modules = Lists.newArrayList();
LoggingModule loggingModule = new NullLoggingModule();
modules.add(loggingModule);
HttpModule httpModule = new HttpModule();
modules.add(httpModule);
ContextBuilder.addHttpModuleIfNeededAndNotPresent(modules);
ContextBuilder.addLoggingModuleIfNotPresent(modules);
assertEquals(modules.size(), 2);
assertEquals(modules.remove(0), loggingModule);
assertEquals(modules.remove(0), httpModule);
}
@ConfiguresRestClient
static class ConfiguresClientModule implements Module {
public void configure(Binder arg0) {
}
}
@Test
public void testAddBothWhenDefault() {
List<Module> modules = Lists.newArrayList();
ContextBuilder.addHttpModuleIfNeededAndNotPresent(modules);
ContextBuilder.addLoggingModuleIfNotPresent(modules);
assertEquals(modules.size(), 2);
assert modules.remove(0) instanceof JavaUrlHttpCommandExecutorServiceModule;
assert modules.remove(0) instanceof JDKLoggingModule;
}
@Test
public void testAddBothWhenLive() {
List<Module> modules = Lists.newArrayList();
ContextBuilder.addHttpModuleIfNeededAndNotPresent(modules);
ContextBuilder.addLoggingModuleIfNotPresent(modules);
assertEquals(modules.size(), 2);
assert modules.remove(0) instanceof JavaUrlHttpCommandExecutorServiceModule;
assert modules.remove(0) instanceof JDKLoggingModule;
}
public void testBuilder() {
Module module1 = new AbstractModule() {
protected void configure() {
}
};
Module module2 = new AbstractModule() {
protected void configure() {
}
};
ContextBuilder builder = testContextBuilder();
builder.modules(Arrays.asList(module1, module2));
}
}