/*-
* -\-\-
* 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.command;
import static com.spotify.helios.common.descriptors.PortMapping.UDP;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.Futures;
import com.spotify.helios.client.HeliosClient;
import com.spotify.helios.common.Json;
import com.spotify.helios.common.descriptors.Job;
import com.spotify.helios.common.descriptors.JobId;
import com.spotify.helios.common.descriptors.PortMapping;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Collections;
import java.util.Date;
import java.util.Map;
import java.util.TimeZone;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.Namespace;
import net.sourceforge.argparse4j.inf.Subparser;
import org.junit.Before;
import org.junit.Test;
public class JobInspectCommandTest {
private static final String JOB_NAME = "foo";
private static final String JOB_VERSION = "2-bbb";
private static final String JOB_NAME_VERSION = JOB_NAME + ":" + JOB_VERSION;
private static final Job JOB = Job.newBuilder()
.setName(JOB_NAME)
.setVersion(JOB_VERSION)
.setCreated((long) 0)
.setExpires(new Date(0))
.setSecondsToWaitBeforeKill(10)
.setAddCapabilities(ImmutableSet.of("cap1", "cap2"))
.setDropCapabilities(ImmutableSet.of("cap3", "cap4"))
.setPorts(ImmutableMap.of(
"foo", PortMapping.builder()
.ip("127.0.0.1")
.internalPort(80)
.externalPort(8080)
.protocol(UDP)
.build(),
"bar", PortMapping.builder()
.ip("0.0.0.0")
.internalPort(123)
.externalPort(456)
.build()
))
.build();
private final Namespace options = mock(Namespace.class);
private final HeliosClient client = mock(HeliosClient.class);
private final ByteArrayOutputStream baos = new ByteArrayOutputStream();
private final PrintStream out = new PrintStream(baos);
private JobInspectCommand command;
private final Map<JobId, Job> jobs = ImmutableMap.of(
new JobId(JOB_NAME, JOB_VERSION), JOB
);
@Before
public void setUp() {
// use a real, dummy Subparser impl to avoid having to mock out every single call
final ArgumentParser parser = ArgumentParsers.newArgumentParser("test");
final Subparser subparser = parser.addSubparsers().addParser("inspect");
command = new JobInspectCommand(subparser, TimeZone.getTimeZone("UTC"));
when(client.jobs(JOB_NAME_VERSION)).thenReturn(Futures.immediateFuture(jobs));
}
@Test
public void test() throws Exception {
when(options.getString("job")).thenReturn(JOB_NAME_VERSION);
final int ret = command.run(options, client, out, false, null);
assertEquals(0, ret);
final String output = baos.toString();
assertThat(output, containsString("Created: Thu, 1 Jan 1970 00:00:00 +0000"));
assertThat(output, containsString("Expires: Thu, 1 Jan 1970 00:00:00 +0000"));
assertThat(output, containsString("Time to wait before kill (seconds): 10"));
assertThat(output, containsString("Add capabilities: cap1, cap2"));
assertThat(output, containsString("Drop capabilities: cap3, cap4"));
assertThat(output, containsString("Ports: bar=0.0.0.0:123:456/tcp"));
assertThat(output, containsString("foo=127.0.0.1:80:8080/udp"));
}
@Test
public void testJson() throws Exception {
when(options.getString("job")).thenReturn(JOB_NAME_VERSION);
final int ret = command.run(options, client, out, true, null);
assertEquals(0, ret);
final String output = baos.toString();
final Job job = Json.read(output, Job.class);
assertEquals(JOB, job);
}
}