package com.github.dockerjava.core; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.core.Is.is; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; import java.io.File; import java.lang.reflect.Field; import java.net.URI; import java.net.URISyntaxException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.apache.commons.lang.SerializationUtils; import org.testng.annotations.Test; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; import com.google.common.io.Resources; public class DefaultDockerClientConfigTest { public static final DefaultDockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DefaultDockerClientConfig newExampleConfig() { String dockerCertPath = dockerCertPath(); return new DefaultDockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", new LocalDirectorySSLConfig(dockerCertPath)); } private static String homeDir() { return "target/test-classes/someHomeDir"; } private static String dockerCertPath() { return homeDir() + "/.docker"; } @Test public void equals() throws Exception { assertEquals(EXAMPLE_CONFIG, newExampleConfig()); } @Test public void environmentDockerHost() throws Exception { // given docker host in env Map<String, String> env = new HashMap<String, String>(); env.put(DefaultDockerClientConfig.DOCKER_HOST, "tcp://baz:8768"); // and it looks to be SSL disabled env.remove("DOCKER_CERT_PATH"); // given default cert path Properties systemProperties = new Properties(); systemProperties.setProperty("user.name", "someUserName"); systemProperties.setProperty("user.home", homeDir()); // when you build a config DefaultDockerClientConfig config = buildConfig(env, systemProperties); assertEquals(config.getDockerHost(), URI.create("tcp://baz:8768")); } @Test public void environment() throws Exception { // given a default config in env properties Map<String, String> env = new HashMap<String, String>(); env.put(DefaultDockerClientConfig.DOCKER_HOST, "tcp://foo"); env.put(DefaultDockerClientConfig.API_VERSION, "apiVersion"); env.put(DefaultDockerClientConfig.REGISTRY_USERNAME, "registryUsername"); env.put(DefaultDockerClientConfig.REGISTRY_PASSWORD, "registryPassword"); env.put(DefaultDockerClientConfig.REGISTRY_EMAIL, "registryEmail"); env.put(DefaultDockerClientConfig.REGISTRY_URL, "registryUrl"); env.put(DefaultDockerClientConfig.DOCKER_CONFIG, "dockerConfig"); env.put(DefaultDockerClientConfig.DOCKER_CERT_PATH, dockerCertPath()); env.put(DefaultDockerClientConfig.DOCKER_TLS_VERIFY, "1"); // when you build a config DefaultDockerClientConfig config = buildConfig(env, new Properties()); // then we get the example object assertEquals(config, EXAMPLE_CONFIG); } private DefaultDockerClientConfig buildConfig(Map<String, String> env, Properties systemProperties) { return DefaultDockerClientConfig.createDefaultConfigBuilder(env, systemProperties).build(); } @Test public void defaults() throws Exception { // given default cert path Properties systemProperties = new Properties(); systemProperties.setProperty("user.name", "someUserName"); systemProperties.setProperty("user.home", homeDir()); // when you build config DefaultDockerClientConfig config = buildConfig(Collections.<String, String> emptyMap(), systemProperties); // then the cert path is as expected assertEquals(config.getDockerHost(), URI.create("unix:///var/run/docker.sock")); assertEquals(config.getRegistryUsername(), "someUserName"); assertEquals(config.getRegistryUrl(), AuthConfig.DEFAULT_SERVER_ADDRESS); assertEquals(config.getApiVersion(), RemoteApiVersion.unknown()); assertEquals(config.getDockerConfig(), homeDir() + "/.docker"); assertNull(config.getSSLConfig()); } @Test public void systemProperties() throws Exception { // given system properties based on the example Properties systemProperties = new Properties(); systemProperties.put(DefaultDockerClientConfig.DOCKER_HOST, "tcp://foo"); systemProperties.put(DefaultDockerClientConfig.API_VERSION, "apiVersion"); systemProperties.put(DefaultDockerClientConfig.REGISTRY_USERNAME, "registryUsername"); systemProperties.put(DefaultDockerClientConfig.REGISTRY_PASSWORD, "registryPassword"); systemProperties.put(DefaultDockerClientConfig.REGISTRY_EMAIL, "registryEmail"); systemProperties.put(DefaultDockerClientConfig.REGISTRY_URL, "registryUrl"); systemProperties.put(DefaultDockerClientConfig.DOCKER_CONFIG, "dockerConfig"); systemProperties.put(DefaultDockerClientConfig.DOCKER_CERT_PATH, dockerCertPath()); systemProperties.put(DefaultDockerClientConfig.DOCKER_TLS_VERIFY, "1"); // when you build new config DefaultDockerClientConfig config = buildConfig(Collections.<String, String> emptyMap(), systemProperties); // then it is the same as the example assertEquals(config, EXAMPLE_CONFIG); } @Test public void serializableTest() { final byte[] serialized = SerializationUtils.serialize(EXAMPLE_CONFIG); final DefaultDockerClientConfig deserialized = (DefaultDockerClientConfig) SerializationUtils.deserialize(serialized); assertThat("Deserialized object mush match source object", deserialized, equalTo(EXAMPLE_CONFIG)); } @Test() public void testSslContextEmpty() throws Exception { new DefaultDockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); } @Test() public void testTlsVerifyAndCertPath() throws Exception { new DefaultDockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", new LocalDirectorySSLConfig(dockerCertPath())); } @Test(expectedExceptions = DockerClientException.class) public void testWrongHostScheme() throws Exception { new DefaultDockerClientConfig(URI.create("http://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); } @Test() public void testTcpHostScheme() throws Exception { new DefaultDockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); } @Test() public void testUnixHostScheme() throws Exception { new DefaultDockerClientConfig(URI.create("unix://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); } @Test public void withDockerTlsVerify() throws Exception { DefaultDockerClientConfig.Builder builder = new DefaultDockerClientConfig.Builder(); Field field = builder.getClass().getDeclaredField("dockerTlsVerify"); field.setAccessible(true); builder.withDockerTlsVerify(""); assertThat((Boolean) field.get(builder), is(false)); builder.withDockerTlsVerify("false"); assertThat((Boolean) field.get(builder), is(false)); builder.withDockerTlsVerify("FALSE"); assertThat((Boolean) field.get(builder), is(false)); builder.withDockerTlsVerify("true"); assertThat((Boolean) field.get(builder), is(true)); builder.withDockerTlsVerify("TRUE"); assertThat((Boolean) field.get(builder), is(true)); builder.withDockerTlsVerify("0"); assertThat((Boolean) field.get(builder), is(false)); builder.withDockerTlsVerify("1"); assertThat((Boolean) field.get(builder), is(true)); } @Test public void testGetAuthConfigurationsFromDockerCfg() throws URISyntaxException { File cfgFile = new File(Resources.getResource("com.github.dockerjava.core/registry.v1").toURI()); DefaultDockerClientConfig clientConfig = new DefaultDockerClientConfig(URI.create( "unix://foo"), cfgFile.getAbsolutePath(), "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); AuthConfigurations authConfigurations = clientConfig.getAuthConfigurations(); assertThat(authConfigurations, notNullValue()); assertThat(authConfigurations.getConfigs().get("https://test.docker.io/v1/"), notNullValue()); AuthConfig authConfig = authConfigurations.getConfigs().get("https://test.docker.io/v1/"); assertThat(authConfig.getUsername(), equalTo("user")); assertThat(authConfig.getPassword(), equalTo("password")); } @Test public void testGetAuthConfigurationsFromConfigJson() throws URISyntaxException { File cfgFile = new File(Resources.getResource("com.github.dockerjava.core/registry.v2").toURI()); DefaultDockerClientConfig clientConfig = new DefaultDockerClientConfig(URI.create( "unix://foo"), cfgFile.getAbsolutePath(), "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); AuthConfigurations authConfigurations = clientConfig.getAuthConfigurations(); assertThat(authConfigurations, notNullValue()); assertThat(authConfigurations.getConfigs().get("https://test.docker.io/v2/"), notNullValue()); AuthConfig authConfig = authConfigurations.getConfigs().get("https://test.docker.io/v2/"); assertThat(authConfig.getUsername(), equalTo("user")); assertThat(authConfig.getPassword(), equalTo("password")); } }