ConfigFileRegistryAuthSupplierTest.java

/*-
 * -\-\-
 * docker-client
 * --
 * Copyright (C) 2016 - 2017 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.auth;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.google.common.collect.ImmutableMap;
import com.spotify.docker.client.DockerConfigReader;
import com.spotify.docker.client.messages.RegistryAuth;
import com.spotify.docker.client.messages.RegistryConfigs;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class ConfigFileRegistryAuthSupplierTest {

  private final DockerConfigReader reader = mock(DockerConfigReader.class);

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  private File configFile;

  private ConfigFileRegistryAuthSupplier supplier;

  @Before
  public void setUp() throws Exception {
    configFile = tempFolder.newFile();

    supplier = new ConfigFileRegistryAuthSupplier(reader, configFile.toPath());
  }

  @Test
  public void testAuthFor_ConfigFileDoesNotExist() throws Exception {
    assertTrue("unable to delete file", configFile.delete());

    // sanity check
    assertFalse("cannot continue this test if the file " + configFile + " actually exists",
        configFile.exists());

    assertThat(supplier.authFor("foo.example.net/bar:1.2.3"), is(nullValue()));
  }

  @Test
  public void testAuthFor_ConfigFileEmptyFile() throws Exception {
    assertEquals("file is not empty", 0, Files.readAllBytes(configFile.toPath()).length);

    assertThat(supplier.authFor("foo.example.net/bar:1.2.3"), is(nullValue()));
  }

  @Test
  public void testAuthFor_Success() throws Exception {
    final RegistryAuth auth = RegistryAuth.builder()
        .username("abc123")
        .build();

    when(reader.authForRegistry(configFile.toPath(), "foo.example.net")).thenReturn(auth);

    assertThat(supplier.authFor("foo.example.net/bar:1.2.3"), is(equalTo(auth)));
  }

  @Test
  public void testAuthForSwarm_Unimplemented() throws Exception {
    assertThat(supplier.authForSwarm(), is(nullValue()));

    // force future implementors of this method to write a test
    verify(reader, never()).authForAllRegistries(any(Path.class));
  }

  @Test
  public void testAuthForBuild_ConfigFileDoesNotExist() throws Exception {
    assertTrue("unable to delete file", configFile.delete());

    // sanity check
    assertFalse("cannot continue this test if the file " + configFile + " actually exists",
        configFile.exists());

    assertThat(supplier.authForBuild(), is(nullValue()));
  }

  @Test
  public void testAuthForBuild_ConfigFileEmptyFile() throws Exception {
    assertEquals("file is not empty", 0, Files.readAllBytes(configFile.toPath()).length);

    assertThat(supplier.authForBuild(), is(nullValue()));
  }

  @Test
  public void testAuthForBuild_Success() throws Exception {
    final RegistryConfigs configs = RegistryConfigs.create(ImmutableMap.of(
        "server1",
        RegistryAuth.builder()
            .serverAddress("server1")
            .username("user1")
            .password("pass1")
            .build()
    ));

    when(reader.authForAllRegistries(configFile.toPath())).thenReturn(configs);

    assertThat(supplier.authForBuild(), is(equalTo(configs)));
  }
}