/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 io.dstream; import static org.junit.Assert.assertEquals; import java.util.List; import java.util.Map.Entry; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.Test; import io.dstream.DStream; import io.dstream.DStreamExecutionGraph; import io.dstream.DStream.DStream2; import io.dstream.utils.Tuples.Tuple2; public class DStreamOperationsCollectorTests { private String streamName = DStreamOperationsCollectorTests.class.getSimpleName(); @Test(expected=IllegalArgumentException.class) public void failNullElementType() throws Exception { DStream.ofType(null, "failNullElementType"); } @Test(expected=IllegalArgumentException.class) public void failNoName() throws Exception { DStream.ofType(Object.class, ""); } @Test public void validateConstruction() throws Exception { DStream<Object> pipeline = DStream.ofType(Object.class, "validateConstruction"); assertEquals("validateConstruction", pipeline.getName()); } @Test public void validateToString() throws Exception { DStream<Object> stream = DStream.ofType(Object.class, "validateToString").filter(s -> true).map(s -> s); assertEquals("validateToString:[filter, map]", stream.toString()); } @Test public void validateRawStreamExecution() throws Exception { DStream<Object> stream = DStream.ofType(Object.class, "validateRawStreamExecution"); Future<Stream<Stream<Object>>> resultFuture = stream.executeAs(this.streamName); Stream<Stream<Object>> result = resultFuture.get(); List<Stream<Object>> resultStreams = result.collect(Collectors.toList()); assertEquals(1, resultStreams.size()); List<Object> partitionStreams = resultStreams.get(0).collect(Collectors.toList()); assertEquals(1, partitionStreams.size()); DStreamExecutionGraph chainAccessor = (DStreamExecutionGraph) partitionStreams.get(0); assertEquals(2, chainAccessor.getOperations().size()); assertEquals("extract", chainAccessor.getOperations().get(0).getLastOperationName()); assertEquals("load", chainAccessor.getOperations().get(1).getLastOperationName()); result.close(); } @Test public void validateStreamInstanceIndependence() throws Exception { DStream<Object> streamA = DStream.ofType(Object.class, "validateStreamInstanceIndependence"); DStream<Object> streamB = streamA.filter(s -> true).map(s -> s).flatMap(s -> Stream.of(s)); Future<Stream<Stream<Object>>> resultFutureA = streamA.executeAs(this.streamName); Future<Stream<Stream<Object>>> resultFutureB = streamB.executeAs(this.streamName); //A Stream<Stream<Object>> resultA = resultFutureA.get(1000, TimeUnit.MILLISECONDS); List<Stream<Object>> resultStreamsA = resultA.collect(Collectors.toList()); assertEquals(1, resultStreamsA.size()); List<Object> partitionStreamsA = resultStreamsA.get(0).collect(Collectors.toList()); assertEquals(1, partitionStreamsA.size()); DStreamExecutionGraph contextA = (DStreamExecutionGraph) partitionStreamsA.get(0); assertEquals(2, contextA.getOperations().size()); assertEquals("extract", contextA.getOperations().get(0).getLastOperationName()); assertEquals("load", contextA.getOperations().get(1).getLastOperationName()); resultA.close(); //B Stream<Stream<Object>> resultB = resultFutureB.get(1000, TimeUnit.MILLISECONDS); List<Stream<Object>> resultStreamsB = resultB.collect(Collectors.toList()); assertEquals(1, resultStreamsB.size()); List<Object> partitionStreamsB = resultStreamsB.get(0).collect(Collectors.toList()); assertEquals(1, partitionStreamsB.size()); DStreamExecutionGraph contextB = (DStreamExecutionGraph) partitionStreamsB.get(0); assertEquals(2, contextB.getOperations().size()); assertEquals("flatMap", contextB.getOperations().get(0).getLastOperationName()); assertEquals("load", contextB.getOperations().get(1).getLastOperationName()); resultB.close(); } @Test public void validateStreamJoin() throws Exception { DStream<Object> streamA = DStream.ofType(Object.class, "validateStreamJoin"); DStream<Object> streamB = streamA.filter(s -> true).map(s -> s).flatMap(s -> Stream.of(s)); DStream2<Object, Object> joinedStream = streamA.join(streamB).on(s -> true); Future<Stream<Stream<Tuple2<Object, Object>>>> resultFuture = joinedStream.executeAs(this.streamName); Stream<Stream<Tuple2<Object, Object>>> result = resultFuture.get(1000, TimeUnit.MILLISECONDS); List<Stream<Tuple2<Object, Object>>> resultStreams = result.collect(Collectors.toList()); assertEquals(1, resultStreams.size()); List<Object> partitionStreams = resultStreams.get(0).collect(Collectors.toList()); assertEquals(1, partitionStreams.size()); DStreamExecutionGraph context = (DStreamExecutionGraph) partitionStreams.get(0); assertEquals(2, context.getOperations().size()); assertEquals("extract", context.getOperations().get(0).getLastOperationName()); assertEquals("join", context.getOperations().get(1).getLastOperationName()); result.close(); } @Test public void validateStreamJoinWithContinuation() throws Exception { DStream<Object> streamA = DStream.ofType(Object.class, "validateStreamJoinWithContinuation"); DStream<Object> streamB = streamA.filter(s -> true).map(s -> s).flatMap(s -> Stream.of(s)); DStream<Tuple2<Object, Object>> joinedStream = streamA.join(streamB).on(s -> true).map(s -> s); Future<Stream<Stream<Tuple2<Object, Object>>>> resultFuture = joinedStream.executeAs(this.streamName); Stream<Stream<Tuple2<Object, Object>>> result = resultFuture.get(1000, TimeUnit.MILLISECONDS); List<Stream<Tuple2<Object, Object>>> resultStreams = result.collect(Collectors.toList()); assertEquals(1, resultStreams.size()); List<Object> partitionStreams = resultStreams.get(0).collect(Collectors.toList()); assertEquals(1, partitionStreams.size()); DStreamExecutionGraph context = (DStreamExecutionGraph) partitionStreams.get(0); assertEquals(2, context.getOperations().size()); assertEquals("extract", context.getOperations().get(0).getLastOperationName()); assertEquals("join", context.getOperations().get(1).getLastOperationName()); result.close(); } @Test public void validateGrouping() throws Exception { DStream<Object> stream = DStream.ofType(Object.class, "validatePartitioning"); DStream<Object> partitioned = stream.classify(s -> s); Future<Stream<Stream<Object>>> resultFuture = partitioned.executeAs(this.streamName); Stream<Stream<Object>> result = resultFuture.get(1000, TimeUnit.MILLISECONDS); List<Stream<Object>> resultStreams = result.collect(Collectors.toList()); assertEquals(1, resultStreams.size()); List<Object> partitionStreams = resultStreams.get(0).collect(Collectors.toList()); assertEquals(1, partitionStreams.size()); DStreamExecutionGraph context = (DStreamExecutionGraph) partitionStreams.get(0); assertEquals(2, context.getOperations().size()); assertEquals("classify", context.getOperations().get(0).getLastOperationName()); assertEquals("load", context.getOperations().get(1).getLastOperationName()); } @Test public void validateGroupingAfterJoin() throws Exception { DStream<Object> streamA = DStream.ofType(Object.class, "validatePartitioningAfterJoin"); DStream<Object> streamB = streamA.filter(s -> true).map(s -> s).flatMap(s -> Stream.of(s)); DStream<Tuple2<Object, Object>> joinedStream = streamA.join(streamB).on(s -> true).map(s -> s); DStream<Entry<Tuple2<Object, Object>, List<Integer>>> partitionedReduced = joinedStream .classify(s -> s) .aggregateValues(s -> s, s -> 1); Future<Stream<Stream<Entry<Tuple2<Object, Object>, List<Integer>>>>> resultFuture = partitionedReduced.executeAs(this.streamName); Stream<Stream<Entry<Tuple2<Object, Object>, List<Integer>>>> result = resultFuture.get(1000, TimeUnit.MILLISECONDS); List<Stream<Entry<Tuple2<Object, Object>, List<Integer>>>> resultStreams = result.collect(Collectors.toList()); assertEquals(1, resultStreams.size()); List<Object> partitionStreams = resultStreams.get(0).collect(Collectors.toList()); assertEquals(1, partitionStreams.size()); DStreamExecutionGraph context = (DStreamExecutionGraph) partitionStreams.get(0); assertEquals(4, context.getOperations().size()); assertEquals("extract", context.getOperations().get(0).getLastOperationName()); assertEquals("classify", context.getOperations().get(1).getLastOperationName()); assertEquals("mapKeyValues", context.getOperations().get(2).getLastOperationName()); assertEquals("aggregateValues", context.getOperations().get(3).getLastOperationName()); } }