/*-
* -\-\-
* docker-client
* --
* Copyright (C) 2016 Spotify AB
* --
* Licensed 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 com.spotify.docker.client;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.spotify.docker.client.DockerHost.SystemDelegate;
import java.net.URI;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
public class DockerHostTest {
private SystemDelegate systemDelegate;
@Before
public void before() {
systemDelegate = mock(SystemDelegate.class);
}
@AfterClass
public static void afterClass() {
DockerHost.restoreSystemDelegate();
}
@Test
public void testDefaultDockerEndpoint() throws Exception {
when(systemDelegate.getProperty("os.name")).thenReturn("linux", "mac", "other");
DockerHost.setSystemDelegate(systemDelegate);
assertThat(DockerHost.defaultDockerEndpoint(), equalTo("unix:///var/run/docker.sock"));
assertThat(DockerHost.defaultDockerEndpoint(), equalTo("unix:///var/run/docker.sock"));
assertThat(DockerHost.defaultDockerEndpoint(), equalTo("localhost:2375"));
}
@Test
public void testEndpointFromEnv() throws Exception {
when(systemDelegate.getenv("DOCKER_HOST")).thenReturn("foo", (String) null);
when(systemDelegate.getProperty("os.name")).thenReturn("linux");
DockerHost.setSystemDelegate(systemDelegate);
assertThat(DockerHost.endpointFromEnv(), equalTo("foo"));
assertThat(DockerHost.endpointFromEnv(), equalTo("unix:///var/run/docker.sock"));
}
@Test
public void testDefaultUnixEndpoint() throws Exception {
assertThat(DockerHost.defaultUnixEndpoint(), equalTo("unix:///var/run/docker.sock"));
}
@Test
public void testDefaultAddress() throws Exception {
assertThat(DockerHost.defaultAddress(), equalTo("localhost"));
}
@Test
public void testDefaultPort() throws Exception {
assertThat(DockerHost.defaultPort(), equalTo(2375));
}
@Test
public void testPortFromEnv() throws Exception {
when(systemDelegate.getenv("DOCKER_PORT")).thenReturn("1234", (String) null);
DockerHost.setSystemDelegate(systemDelegate);
assertThat(DockerHost.portFromEnv(), equalTo(1234));
assertThat(DockerHost.portFromEnv(), equalTo(2375));
}
@Test
public void testDefaultCertPath() throws Exception {
when(systemDelegate.getProperty("user.home")).thenReturn("foobar");
DockerHost.setSystemDelegate(systemDelegate);
assertThat(DockerHost.defaultCertPath(), equalTo("foobar/.docker"));
}
@Test
public void testCertPathFromEnv() throws Exception {
when(systemDelegate.getenv("DOCKER_CERT_PATH")).thenReturn("foo", (String) null);
when(systemDelegate.getProperty("user.home")).thenReturn("bar");
DockerHost.setSystemDelegate(systemDelegate);
assertThat(DockerHost.certPathFromEnv(), equalTo("foo"));
assertThat(DockerHost.certPathFromEnv(), nullValue());
}
@Test
public void testFromUnixSocket() throws Exception {
final String unixSocket = "unix:///var/run/docker.sock";
final String certPath = "/path/to/cert";
final URI unixSocketUri = new URI(unixSocket);
final DockerHost dockerHost = DockerHost.from(unixSocket, certPath);
assertThat(dockerHost.host(), equalTo(unixSocket));
assertThat(dockerHost.uri(), equalTo(unixSocketUri));
assertThat(dockerHost.bindUri(), equalTo(unixSocketUri));
assertThat(dockerHost.port(), equalTo(0));
assertThat(dockerHost.address(), equalTo("localhost"));
assertThat(dockerHost.dockerCertPath(), equalTo(certPath));
}
@Test
public void testFromTcpSocketNoCert() throws Exception {
final String tcpSocket = "tcp://127.0.0.1:2375";
final DockerHost dockerHost = DockerHost.from(tcpSocket, null);
assertThat(dockerHost.host(), equalTo("127.0.0.1:2375"));
assertThat(dockerHost.uri(), equalTo(new URI("http://127.0.0.1:2375")));
assertThat(dockerHost.bindUri(), equalTo(new URI(tcpSocket)));
assertThat(dockerHost.port(), equalTo(2375));
assertThat(dockerHost.address(), equalTo("127.0.0.1"));
assertThat(dockerHost.dockerCertPath(), nullValue());
}
@Test
public void testFromTcpSocketWithCert() throws Exception {
final String tcpSocket = "tcp://127.0.0.1:2375";
final String certPath = "/path/to/cert";
final DockerHost dockerHost = DockerHost.from(tcpSocket, certPath);
assertThat(dockerHost.host(), equalTo("127.0.0.1:2375"));
assertThat(dockerHost.uri(), equalTo(new URI("https://127.0.0.1:2375")));
assertThat(dockerHost.bindUri(), equalTo(new URI(tcpSocket)));
assertThat(dockerHost.port(), equalTo(2375));
assertThat(dockerHost.address(), equalTo("127.0.0.1"));
assertThat(dockerHost.dockerCertPath(), equalTo(certPath));
}
@Test
public void testFromEnv() throws Exception {
when(systemDelegate.getProperty("os.name")).thenReturn("linux");
DockerHost.setSystemDelegate(systemDelegate);
final String dockerHostEnvVar = DockerHost.defaultDockerEndpoint();
final boolean isUnixSocket = dockerHostEnvVar.startsWith("unix://");
final URI dockerHostUri = new URI(dockerHostEnvVar);
final String dockerHostAndPort;
final URI dockerHostHttpUri;
final URI dockerTcpUri;
final int dockerHostPort;
final String dockerHostHost;
if (isUnixSocket) {
dockerHostAndPort = dockerHostEnvVar;
dockerHostHttpUri = dockerHostUri;
dockerTcpUri = dockerHostUri;
dockerHostPort = 0;
dockerHostHost = "localhost";
} else {
dockerHostAndPort = dockerHostUri.getHost() + ":" + dockerHostUri.getPort();
dockerHostHttpUri = new URI("http://" + dockerHostAndPort);
dockerTcpUri = new URI("tcp://" + dockerHostAndPort);
dockerHostPort = dockerHostUri.getPort();
dockerHostHost = dockerHostUri.getHost();
}
final DockerHost dockerHost = DockerHost.fromEnv();
assertThat(dockerHost.host(), equalTo(dockerHostAndPort));
assertThat(dockerHost.uri(), equalTo(dockerHostHttpUri));
assertThat(dockerHost.bindUri(), equalTo(dockerTcpUri));
assertThat(dockerHost.port(), equalTo(dockerHostPort));
assertThat(dockerHost.address(), equalTo(dockerHostHost));
assertThat(dockerHost.dockerCertPath(), nullValue());
}
}