/*-
* -\-\-
* Helios Tools
* --
* 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.helios.cli;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class CliParserTest {
@Rule
public final TemporaryFolder temporaryFolder = new TemporaryFolder();
private static final String SUBCOMMAND = "jobs";
private static final String[] ENDPOINTS = {
"http://master-a1.nyc.com:80",
"http://master-a2.nyc.com:80",
"http://master-a3.nyc.com:80",
};
private static final String[] DOMAINS = {"foo", "bar", "baz"};
private static final String SERVICE = "foo-service";
private static final String SRV = "helios";
private final ImmutableList<String> singleEndpointArgs = ImmutableList.of(
SUBCOMMAND, "--master", ENDPOINTS[0], SERVICE
);
private static String[] toArray(List<String> args, String... additionalArgs) {
final List<String> newArgs = Lists.newArrayList(args);
Collections.addAll(newArgs, additionalArgs);
return newArgs.toArray(new String[newArgs.size()]);
}
@Test
public void testComputeTargetsSingleEndpoint() throws Exception {
final CliParser cliParser = new CliParser(toArray(singleEndpointArgs));
final List<Target> targets = cliParser.getTargets();
// We expect the specified master endpoint target
final List<Target> expectedTargets =
ImmutableList.of(Target.from(URI.create(ENDPOINTS[0])));
assertEquals(expectedTargets, targets);
}
@Test
public void testComputeTargetsMultipleEndpoints() throws Exception {
final List<String> argsList = Lists.newArrayList(
SUBCOMMAND, "-d", Joiner.on(",").join(DOMAINS));
for (final String endpoint : ENDPOINTS) {
argsList.add("--master");
argsList.add(endpoint);
}
argsList.add(SERVICE);
final CliParser cliParser = new CliParser(toArray(argsList));
final List<Target> targets = cliParser.getTargets();
// We expect only the specified master endpoint targets since they take precedence over domains
final List<Target> expectedTargets = Lists.newArrayListWithExpectedSize(ENDPOINTS.length);
for (final String endpoint : ENDPOINTS) {
expectedTargets.add(Target.from(URI.create(endpoint)));
}
assertEquals(expectedTargets, targets);
}
@Test
public void testComputeTargetsSingleDomain() throws Exception {
final String[] args = {SUBCOMMAND, "-d", DOMAINS[0], SERVICE};
final CliParser cliParser = new CliParser(args);
final List<Target> targets = cliParser.getTargets();
// We expect the specified domain
final List<Target> expectedTargets = Target.from(SRV, ImmutableList.of(DOMAINS[0]));
assertEquals(expectedTargets, targets);
}
@Test
public void testComputeTargetsMultiDomain() throws Exception {
final String[] args = {SUBCOMMAND, "-d", Joiner.on(",").join(DOMAINS), SERVICE};
final CliParser cliParser = new CliParser(args);
final List<Target> targets = cliParser.getTargets();
// We expect the specified domains
final List<Target> expectedTargets = Target.from(SRV, Lists.newArrayList(DOMAINS));
assertEquals(expectedTargets, targets);
}
@Test
public void testComputeTargetsMultipleEndpointsFromConfig() throws Exception {
final String[] args = {SUBCOMMAND, SERVICE};
// Create a "~/.helios/config" file, which is the path CliConfig reads by default
final File configDir = temporaryFolder.newFolder(CliConfig.getConfigDirName());
final File configFile = new File(configDir.getAbsolutePath() + File.separator
+ CliConfig.getConfigFileName());
// Write configuration to that file
try (final FileOutputStream outFile = new FileOutputStream(configFile)) {
final ByteBuffer byteBuffer = Charsets.UTF_8.encode(
"{\"masterEndpoints\":[\"" + ENDPOINTS[0] + "\", \"" + ENDPOINTS[1] + "\", \""
+ ENDPOINTS[2] + "\"], \"domains\":[\"" + DOMAINS[0] + "\"]}");
outFile.write(byteBuffer.array(), 0, byteBuffer.remaining());
// Set user's home directory to this temporary folder
System.setProperty("user.home", temporaryFolder.getRoot().getAbsolutePath());
final CliParser cliParser = new CliParser(args);
final List<Target> targets = cliParser.getTargets();
// We expect only the specified master endpoint targets since they take precedence over
// domains
final List<Target> expectedTargets = ImmutableList.of(
Target.from(URI.create(ENDPOINTS[0])),
Target.from(URI.create(ENDPOINTS[1])),
Target.from(URI.create(ENDPOINTS[2]))
);
assertEquals(expectedTargets, targets);
}
}
@Test
public void testComputeTargetsMultipleDomainsFromConfig() throws Exception {
final String[] args = {SUBCOMMAND, SERVICE};
// Create a "~/.helios/config" file, which is the path CliConfig reads by default
final File configDir = temporaryFolder.newFolder(CliConfig.getConfigDirName());
final File configFile = new File(configDir.getAbsolutePath() + File.separator
+ CliConfig.getConfigFileName());
// Write configuration to that file
try (final FileOutputStream outFile = new FileOutputStream(configFile)) {
final ByteBuffer byteBuffer = Charsets.UTF_8.encode(
"{\"domains\":[\"" + DOMAINS[0] + "\", \"" + DOMAINS[1] + "\", \"" + DOMAINS[2] + "\"]}");
outFile.write(byteBuffer.array(), 0, byteBuffer.remaining());
// Set user's home directory to this temporary folder
System.setProperty("user.home", temporaryFolder.getRoot().getAbsolutePath());
final CliParser cliParser = new CliParser(args);
final List<Target> targets = cliParser.getTargets();
// We expect the specified domains
final List<Target> expectedTargets = Target.from(
SRV, ImmutableList.of(DOMAINS[0], DOMAINS[1], DOMAINS[2]));
assertEquals(expectedTargets, targets);
}
}
@Test
public void testInsecureHttpsDisabledByDefault() throws Exception {
final CliParser parser = new CliParser(toArray(singleEndpointArgs));
assertFalse("GlobalArg 'insecure' should default to false",
parser.getNamespace().getBoolean("insecure"));
}
@Test
public void testInsecureHttpsEnable() throws Exception {
final CliParser parser = new CliParser(toArray(singleEndpointArgs, "--insecure"));
assertTrue(parser.getNamespace().getBoolean("insecure"));
}
}