package com.spotify.heroic;
import com.google.common.base.Charsets;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.spotify.heroic.common.Series;
import com.spotify.heroic.dagger.CoreComponent;
import com.spotify.heroic.ingestion.Ingestion;
import com.spotify.heroic.ingestion.IngestionComponent;
import com.spotify.heroic.ingestion.IngestionManager;
import com.spotify.heroic.shell.ShellIO;
import eu.toolchain.async.AsyncFuture;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static com.spotify.heroic.test.Data.points;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
public class TaskIT extends AbstractLocalClusterIT {
private final Series s1 = Series.of("key1", ImmutableMap.of("shared", "a", "diff", "a"));
private final Series s2 = Series.of("key1", ImmutableMap.of("shared", "a", "diff", "b"));
private ShellTasks tasks;
private PrintWriter out;
private ShellIO io;
@Override
protected List<URI> instanceUris() {
return ImmutableList.of(URI.create("jvm://a"));
}
@Before
public void setup() {
tasks = instances.get(0).inject(CoreComponent::tasks);
io = mock(ShellIO.class);
out = mock(PrintWriter.class);
doReturn(out).when(io).out();
}
@Override
protected AsyncFuture<Void> prepareEnvironment() {
final List<IngestionManager> ingestion = instances
.stream()
.map(i -> i.inject(IngestionComponent::ingestionManager))
.collect(Collectors.toList());
final List<AsyncFuture<Ingestion>> writes = new ArrayList<>();
final IngestionManager m1 = ingestion.get(0);
writes.add(m1
.useDefaultGroup()
.write(new Ingestion.Request(s1, points().p(10, 1D).p(30, 2D).build())));
return async.collectAndDiscard(writes);
}
@Test
public void readFile() throws Exception {
final InputStream in = new ByteArrayInputStream("foo\nbar\n".getBytes(Charsets.UTF_8));
doReturn(in).when(io).newInputStream(any(Path.class), eq(StandardOpenOption.READ));
run("test-read-file");
final InOrder order = inOrder(out);
order.verify(out).println("Read: 0");
order.verify(out).println("Read: 1");
order.verify(out, never()).println(any(String.class));
}
@Test
public void print() {
run("test-print", "--count", "2");
final InOrder order = inOrder(out);
order.verify(out).println("Count: 00000000");
order.verify(out).println("Count: 00000001");
order.verify(out, never()).println(any(String.class));
}
@Test
public void pause() {
run("pause");
final InOrder order = inOrder(out);
order.verify(out).println("Pausing Consumers");
order.verify(out, never()).println(any(String.class));
}
@Test
public void resume() {
run("resume");
final InOrder order = inOrder(out);
order.verify(out).println("Resuming Consumers");
order.verify(out, never()).println(any(String.class));
}
@Test
public void parseQuery() {
run("parse-query", "*");
final InOrder order = inOrder(out);
order.verify(out).println(any(String.class));
order.verify(out, never()).println(any(String.class));
}
@Test
public void parseQueryEval() {
run("parse-query", "--eval", "*");
final InOrder order = inOrder(out);
order.verify(out).println(any(String.class));
order.verify(out, never()).println(any(String.class));
}
@Test
public void ingestionFilter() {
run("ingestion-filter");
run("ingestion-filter", "role=lol");
run("ingestion-filter");
final InOrder order = inOrder(out);
order.verify(out).println("Current ingestion filter: [true]");
order.verify(out).println("Updating ingestion filter to: [=, role, lol]");
order.verify(out).println("Current ingestion filter: [=, role, lol]");
order.verify(out, never()).println(any(String.class));
}
@Test
public void refresh() {
run("refresh");
final InOrder order = inOrder(out);
order.verify(out, never()).println(any(String.class));
}
private void run(final String... command) {
try {
tasks.evaluate(ImmutableList.copyOf(command), io).get();
} catch (final Exception e) {
throw Throwables.propagate(e);
}
}
}