/*
# Licensed Materials - Property of IBM
# Copyright IBM Corp. 2015
*/
package com.ibm.streamsx.topology.test.distributed;
import static org.junit.Assume.assumeTrue;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import com.ibm.streams.operator.Tuple;
import com.ibm.streamsx.topology.TStream;
import com.ibm.streamsx.topology.Topology;
import com.ibm.streamsx.topology.context.StreamsContext.Type;
import com.ibm.streamsx.topology.function.Function;
import com.ibm.streamsx.topology.spl.SPL;
import com.ibm.streamsx.topology.spl.SPLStream;
import com.ibm.streamsx.topology.spl.SPLStreams;
import com.ibm.streamsx.topology.test.TestTopology;
import com.ibm.streamsx.topology.test.spl.SPLStreamsTest;
/**
* Test publish/subscribe. These tests just use publish/subscribe
* within a single job, but the expected use case is across jobs.
*
*/
public class PublishSubscribeSPLTest extends TestTopology {
@Before
public void checkIsDistributed() {
assumeTrue(getTesterType() == Type.DISTRIBUTED_TESTER);
}
/**
* Test that with publish allow filter set to false
* a subscriber without a filter gets the full set of data.
*/
@Test
public void testSPLPublishNoFilterWithSubscribe() throws Exception {
final Topology t = new Topology();
SPLStream source = SPLStreamsTest.testTupleStream(t);
source = addStartupDelay(source);
source.publish("testSPLPublishNoFilterSFilteredSubscribe", false);
SPLStream sub = SPLStreams.subscribe(t, "testSPLPublishNoFilterSFilteredSubscribe", source.getSchema());
TStream<String> subscribe = sub.transform(new GetTupleId());
completeAndValidate(subscribe, 20, "SPL:0", "SPL:1", "SPL:2", "SPL:3");
}
/**
* Test that with publish allow filter set to false
* a subscriber without a filter gets the full set of data.
*/
@Test
public void testSPLPublishAllowFilterWithSubscribe() throws Exception {
final Topology t = new Topology();
SPLStream source = SPLStreamsTest.testTupleStream(t);
source = addStartupDelay(source);
source.publish("testSPLPublishAllowFilterWithSubscribe", true);
SPLStream sub = SPLStreams.subscribe(t, "testSPLPublishAllowFilterWithSubscribe", source.getSchema());
TStream<String> subscribe = sub.transform(new GetTupleId());
completeAndValidate(subscribe, 20, "SPL:0", "SPL:1", "SPL:2", "SPL:3");
}
public static class GetTupleId implements Function<Tuple, String> {
private static final long serialVersionUID = 1L;
@Override
public String apply(Tuple v) {
return "SPL:" + v.getString("id");
}
}
@Test
public void testSPLPublishAllowFilterWithFilteredSubscribe() throws Exception {
_testSPLPublishFilteredSubscribe(
"testSPLPublishAllowFilterWithFilteredSubscribe", true);
}
@Test
public void testSPLPublishNoFilterWithFilteredSubscribe() throws Exception {
_testSPLPublishFilteredSubscribe(
"testSPLPublishNoFilterWithFilteredSubscribe", false);
}
private void _testSPLPublishFilteredSubscribe(String topic, boolean allowFilters) throws Exception {
final Topology t = new Topology();
SPL.addToolkit(t, new File(getTestRoot(), "spl/testtk"));
SPLStream source = SPLStreamsTest.testTupleStream(t);
source = addStartupDelay(source);
source.publish(topic, allowFilters);
// Filter on the vi attribute, passing the value 321.
Map<String,Object> params = new HashMap<>();
params.put("topic", topic);
params.put("value", 43675232L);
SPLStream sub = SPL.invokeSource(t, "testspl::Int64SubscribeFilter", params, source.getSchema());
TStream<String> subscribe = sub.transform(new GetTupleId());
completeAndValidate(subscribe, 20, "SPL:1");
}
}