/*
# Licensed Materials - Property of IBM
# Copyright IBM Corp. 2016
*/
package com.ibm.streamsx.topology.test.api;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Before;
import org.junit.Test;
import com.ibm.streamsx.topology.TStream;
import com.ibm.streamsx.topology.Topology;
import com.ibm.streamsx.topology.function.Consumer;
import com.ibm.streamsx.topology.function.Function;
import com.ibm.streamsx.topology.function.Predicate;
import com.ibm.streamsx.topology.function.Supplier;
import com.ibm.streamsx.topology.function.UnaryOperator;
import com.ibm.streamsx.topology.test.TestTopology;
public class AutoClosableTest extends TestTopology {
@Before
public void onlyInEmbedded() {
assumeTrue(isMainRun());
}
/**
* Test close is called for various transformations.
* @throws Exception
*/
@Test
public void testCloseIsCalled() throws Exception {
Topology topology = newTopology();
TStream<String> stream = topology.source(new CloseSupplier());
stream = stream.filter(new ClosePredicate()) ;
stream = stream.modify(new CloseUnary()) ;
stream = stream.multiTransform(new CloseMultiTransform()) ;
stream = stream.last().aggregate(new CloseAggregate());
stream.sink(new CloseConsumer());
this.getTesterContext().submit(topology).get();
assertTrue(CloseSupplier.seenClose.get());
assertTrue(ClosePredicate.seenClose.get());
assertTrue(CloseUnary.seenClose.get());
assertTrue(CloseMultiTransform.seenClose.get());
assertTrue(CloseAggregate.seenClose.get());
assertTrue(CloseConsumer.seenClose.get());
}
public static class CloseSupplier implements Supplier<Iterable<String>>, AutoCloseable {
private static final long serialVersionUID = 1L;
public final static AtomicBoolean seenClose = new AtomicBoolean();
@Override
public void close() {
seenClose.set(true);
}
@Override
public Iterable<String> get() {
return Collections.singleton("42!");
}
}
public static class CloseConsumer implements Consumer<String>, AutoCloseable {
private static final long serialVersionUID = 1L;
public final static AtomicBoolean seenClose = new AtomicBoolean();
@Override
public void close() {
seenClose.set(true);
}
@Override
public void accept(String v) {
}
}
public static class ClosePredicate implements Predicate<String>, AutoCloseable {
private static final long serialVersionUID = 1L;
public final static AtomicBoolean seenClose = new AtomicBoolean();
@Override
public void close() {
seenClose.set(true);
}
@Override
public boolean test(String v) {
return true;
}
}
public static class CloseUnary implements UnaryOperator<String>, AutoCloseable {
private static final long serialVersionUID = 1L;
public final static AtomicBoolean seenClose = new AtomicBoolean();
@Override
public void close() {
seenClose.set(true);
}
@Override
public String apply(String v) {
return v;
}
}
public static class CloseMultiTransform implements Function<String,Iterable<String>>, AutoCloseable {
private static final long serialVersionUID = 1L;
public final static AtomicBoolean seenClose = new AtomicBoolean();
@Override
public void close() {
seenClose.set(true);
}
@Override
public Iterable<String> apply(String v) {
return Collections.singleton(v);
}
}
public static class CloseAggregate implements Function<List<String>,String>, AutoCloseable {
private static final long serialVersionUID = 1L;
public final static AtomicBoolean seenClose = new AtomicBoolean();
@Override
public void close() {
seenClose.set(true);
}
@Override
public String apply(List<String> v) {
return v.get(0);
}
}
}