/*
# Licensed Materials - Property of IBM
# Copyright IBM Corp. 2015
*/
package com.ibm.streamsx.topology.test.api;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.junit.Ignore;
import org.junit.Test;
import com.ibm.streamsx.topology.TStream;
import com.ibm.streamsx.topology.Topology;
import com.ibm.streamsx.topology.function.Function;
import com.ibm.streamsx.topology.function.Supplier;
import com.ibm.streamsx.topology.logic.Value;
import com.ibm.streamsx.topology.streams.StringStreams;
import com.ibm.streamsx.topology.test.TestTopology;
import com.ibm.streamsx.topology.tester.Condition;
public class TopologySourceTest extends TestTopology {
@Test (expected = NullPointerException.class)
public void testConstantsNullData() throws Exception {
assumeTrue(isMainRun());
Topology t = newTopology("testConstantsNullData");
t.constants(null); // throw NPE
}
@Test (expected = IllegalArgumentException.class)
public void testLimitedSourceNNegCount() throws Exception {
assumeTrue(isMainRun());
Topology t = newTopology("testLimitedSourceNNegCount");
t.limitedSourceN(new FunctionalSource(), -1); // throw IAE
}
@Test (expected = IllegalArgumentException.class)
public void testLimitedSourceNegCount() throws Exception {
assumeTrue(isMainRun());
Topology t = newTopology("testLimitedSourceNegCount");
t.limitedSource(new Value<String>("s"), -1); // throw IAE
}
@Test
public void testLimitedSource() throws Exception {
Topology topology = newTopology("testLimitedSource");
TStream<String> ts = topology.limitedSource(new SupplierSource(), 4);
Condition<List<String>> c = topology.getTester().stringContents(ts, "A0", "A1", "A2",
"A3");
complete(topology.getTester(), c, 10, TimeUnit.SECONDS);
assertTrue(c.toString(), c.valid());
}
private static class SupplierSource implements Supplier<String> {
private static final long serialVersionUID = 1L;
private transient int i;
@Override
public String get() {
return "A" + i++;
}
}
@Test
public void testLimitedSourceN() throws Exception {
Topology topology = newTopology("testLimitedSourceN");
TStream<String> ts = topology.limitedSourceN(new FunctionalSource(), 3);
Condition<List<String>> c = topology.getTester().stringContents(ts, "B3", "B4", "B5");
complete(topology.getTester(), c, 10, TimeUnit.SECONDS);
assertTrue(c.toString(), c.valid());
}
private static class FunctionalSource implements Function<Long, String> {
private static final long serialVersionUID = 1L;
@Override
public String apply(Long i) {
return "B" + (i + 3);
}
}
@Test
public void testPeriodicSource() throws Exception {
Topology topology = newTopology();
TStream<Long> timestamps = topology.periodicSource(new PeriodicSourceTester(), 500, TimeUnit.MILLISECONDS);
TStream<String> st = StringStreams.toString(timestamps);
Condition<Long> c = topology.getTester().atLeastTupleCount(st, 20);
Condition<List<String>> tuples = topology.getTester().stringContents(st, "notused");
long start = System.currentTimeMillis();
complete(topology.getTester(), c, 30, TimeUnit.SECONDS);
Long lastTime = null;
for (String t : tuples.getResult()) {
long time = Long.parseLong(t);
assertTrue(time >= start);
if (lastTime != null) {
assertTrue(time >= lastTime);
long diff = time - lastTime;
assertTrue("Source get time difference:" + diff, diff > 450);
}
lastTime = time;
}
}
public static class PeriodicSourceTester implements Supplier<Long> {
private static final long serialVersionUID = 1L;
@Override
public Long get() {
return System.currentTimeMillis();
}
}
@Test
public void testPeriodicMultiSource() throws Exception {
Topology topology = newTopology();
TStream<String> ms = topology.periodicMultiSource(new PeriodicMultiSourceTester(),
500, TimeUnit.MILLISECONDS);
Condition<Long> ending = topology.getTester().atLeastTupleCount(ms, 60);
Condition<List<String>> tuples = topology.getTester().stringContents(ms, "notused");
long start = System.currentTimeMillis();
complete(topology.getTester(), ending, 30, TimeUnit.SECONDS);
String prevTuple = null;
Long lastTime = null;
for (String t : tuples.getResult()) {
if (prevTuple == null) {
assertTrue(t.startsWith("A"));
prevTuple = t;
continue;
}
char c = (char) (prevTuple.charAt(0) + 1);
if (c == 'D')
c = 'A';
assertTrue(c == t.charAt(0));
prevTuple = t;
long time = Long.parseLong(t.substring(1));
assertTrue(time >= start);
if (lastTime != null) {
assertTrue(time >= lastTime);
if (t.startsWith("A")) {
long diff = time - lastTime;
assertTrue(Long.toString(diff), diff > 450);
}
}
lastTime = time;
}
}
public static class PeriodicMultiSourceTester implements Supplier<Iterable<String>> {
private static final long serialVersionUID = 1L;
@Override
public Iterable<String> get() {
long now = System.currentTimeMillis();
return Arrays.asList("A"+now, "B"+now, "C"+now);
}
}
@Test(expected=ExecutionException.class)
public void testExceptionSource() throws Exception {
assumeTrue(isEmbedded());
Topology topology = newTopology();
TStream<String> ts = topology.limitedSource(new ExceptionSource(), 4);
Condition<List<String>> c = topology.getTester().stringContents(ts, "A0");
complete(topology.getTester(), c, 10, TimeUnit.SECONDS);
}
@Test(expected=ExecutionException.class)
@Ignore("Test for issue #213")
public void testExceptionPeriodicSource() throws Exception {
assumeTrue(isEmbedded());
Topology topology = newTopology();
TStream<String> ts = topology.periodicSource(new ExceptionSource(), 1, TimeUnit.MILLISECONDS);
Condition<List<String>> c = topology.getTester().stringContents(ts, "A0");
complete(topology.getTester(), c, 10, TimeUnit.SECONDS);
}
private static class ExceptionSource implements Supplier<String> {
private static final long serialVersionUID = 1L;
@Override
public String get() {
throw new RuntimeException("ExceptionSource testing");
}
}
}