From cbf50fa3099186e8dac3002e1d2b9bd215a3af63 Mon Sep 17 00:00:00 2001 From: John Blum Date: Wed, 8 Apr 2020 13:06:19 -0700 Subject: [PATCH] DATAGEODE-302 - Add 'nullSafeStream(:Stream)' utility method to StreamUtils. --- .../data/gemfire/util/StreamUtils.java | 13 ++- .../data/gemfire/util/StreamUtilsTests.java | 18 +++- .../gemfire/util/StreamUtilsUnitTests.java | 95 +++++++++++++++++++ 3 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 spring-data-geode/src/test/java/org/springframework/data/gemfire/util/StreamUtilsUnitTests.java diff --git a/spring-data-geode/src/main/java/org/springframework/data/gemfire/util/StreamUtils.java b/spring-data-geode/src/main/java/org/springframework/data/gemfire/util/StreamUtils.java index 72579a83..53be9ca6 100644 --- a/spring-data-geode/src/main/java/org/springframework/data/gemfire/util/StreamUtils.java +++ b/spring-data-geode/src/main/java/org/springframework/data/gemfire/util/StreamUtils.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.data.gemfire.util; import static org.springframework.data.gemfire.util.ArrayUtils.nullSafeArray; @@ -48,4 +47,16 @@ public abstract class StreamUtils { return concatenatedStream; } + + /** + * Utility method used to guard against {@literal null} {@link Stream Streams}. + * + * @param {@link Class type} of the {@link Object elements} in the {@link Stream}. + * @param stream {@link Stream} to evaluate. + * @return the given {@link Stream} if not {@literal null} or an {@link Stream#empty() empty} {@link Stream}. + * @see java.util.stream.Stream + */ + public static Stream nullSafeStream(Stream stream) { + return stream != null ? stream : Stream.empty(); + } } diff --git a/spring-data-geode/src/test/java/org/springframework/data/gemfire/util/StreamUtilsTests.java b/spring-data-geode/src/test/java/org/springframework/data/gemfire/util/StreamUtilsTests.java index 4478bd3c..befcf409 100644 --- a/spring-data-geode/src/test/java/org/springframework/data/gemfire/util/StreamUtilsTests.java +++ b/spring-data-geode/src/test/java/org/springframework/data/gemfire/util/StreamUtilsTests.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.data.gemfire.util; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -24,11 +24,12 @@ import java.util.stream.Stream; import org.junit.Test; /** - * Unit tests for {@link StreamUtils}. + * Unit Tests for {@link StreamUtils}. * * @author John Blum * @see java.util.stream.Stream * @see org.junit.Test + * @see org.mockito.Mockito * @see org.springframework.data.gemfire.util.StreamUtils * @since 2.0.0 */ @@ -74,4 +75,17 @@ public class StreamUtilsTests { assertThat(stream).isNotNull(); assertThat(stream.collect(Collectors.toList())).containsExactly(1, 2, 3, 4, 5, 6, 7, 8, 9); } + + @Test + public void nullSafeStreamWithStream() { + + Stream mockStream = mock(Stream.class); + + assertThat(StreamUtils.nullSafeStream(mockStream)).isSameAs(mockStream); + } + + @Test + public void nullSafeStreamWithNull() { + assertThat(StreamUtils.nullSafeStream(null)).isEqualTo(Stream.empty()); + } } diff --git a/spring-data-geode/src/test/java/org/springframework/data/gemfire/util/StreamUtilsUnitTests.java b/spring-data-geode/src/test/java/org/springframework/data/gemfire/util/StreamUtilsUnitTests.java new file mode 100644 index 00000000..4a08c81d --- /dev/null +++ b/spring-data-geode/src/test/java/org/springframework/data/gemfire/util/StreamUtilsUnitTests.java @@ -0,0 +1,95 @@ +/* + * Copyright 2017-2020 the original author or authors. + * + * Licensed 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 + * + * https://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 org.springframework.data.gemfire.util; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.Test; + +/** + * Unit Tests for {@link StreamUtils}. + * + * @author John Blum + * @see java.util.stream.Stream + * @see org.junit.Test + * @see org.mockito.Mockito + * @see org.springframework.data.gemfire.util.StreamUtils + * @since 2.0.0 + */ +public class StreamUtilsUnitTests { + + @Test + @SuppressWarnings("unchecked") + public void concatNoStreams() { + + Stream stream = StreamUtils.concat(); + + assertThat(stream).isNotNull(); + assertThat(stream.count()).isEqualTo(0); + } + + @Test + @SuppressWarnings("unchecked") + public void concatOneStream() { + + Stream stream = StreamUtils.concat(Stream.of(1, 2, 3)); + + assertThat(stream).isNotNull(); + assertThat(stream.collect(Collectors.toList())).containsExactly(1, 2, 3); + } + + @Test + @SuppressWarnings("unchecked") + public void concatTwoStreams() { + + Stream stream = StreamUtils.concat(Stream.of(1, 2, 3), Stream.of(4, 5, 6)); + + assertThat(stream).isNotNull(); + assertThat(stream.collect(Collectors.toList())).containsExactly(1, 2, 3, 4, 5, 6); + } + + @Test + @SuppressWarnings("unchecked") + public void concatThreeStreams() { + + Stream stream = + StreamUtils.concat(Stream.of(1, 2, 3), Stream.of(4, 5, 6), Stream.of(7, 8, 9)); + + assertThat(stream).isNotNull(); + assertThat(stream.collect(Collectors.toList())).containsExactly(1, 2, 3, 4, 5, 6, 7, 8, 9); + } + + @Test + public void nullSafeStreamWithStream() { + + Stream mockStream = mock(Stream.class); + + assertThat(StreamUtils.nullSafeStream(mockStream)).isSameAs(mockStream); + } + + @Test + public void nullSafeStreamWithNull() { + + Stream stream = StreamUtils.nullSafeStream(null); + + assertThat(stream).isNotNull(); + assertThat(stream.count()).isZero(); + } +}