From 7f4a6fd94ca7cea49a31c11b84da8b5923fe6577 Mon Sep 17 00:00:00 2001 From: Julien Hoarau Date: Tue, 8 Nov 2016 08:21:38 +1100 Subject: [PATCH] #1341 SingleDeferredResult should uses RESULT_NONE from DeferredResult instead of having its own empty result. --- .../netflix/rx/SingleDeferredResult.java | 11 ++- .../netflix/rx/SingleDeferredResultTests.java | 73 +++++++++++++++++++ 2 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/SingleDeferredResultTests.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/rx/SingleDeferredResult.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/rx/SingleDeferredResult.java index 232a053e..6a538252 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/rx/SingleDeferredResult.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/rx/SingleDeferredResult.java @@ -29,18 +29,21 @@ import rx.Single; */ class SingleDeferredResult extends DeferredResult { - private static final Object EMPTY_RESULT = new Object(); - public SingleDeferredResult(Single single) { - this(null, EMPTY_RESULT, single); + initSingle(single); } public SingleDeferredResult(long timeout, Single single) { - this(timeout, EMPTY_RESULT, single); + super(timeout); + initSingle(single); } public SingleDeferredResult(Long timeout, Object timeoutResult, Single single) { super(timeout, timeoutResult); + initSingle(single); + } + + private void initSingle(Single single) { Assert.notNull(single, "single can not be null"); new DeferredResultSubscriber<>(single.toObservable(), this); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/SingleDeferredResultTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/SingleDeferredResultTests.java new file mode 100644 index 00000000..4f4db036 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/SingleDeferredResultTests.java @@ -0,0 +1,73 @@ +/* + * Copyright 2013-2017 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 + * + * 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 org.springframework.cloud.netflix.rx; + +import java.lang.reflect.Field; + +import org.assertj.core.api.Assertions; +import org.junit.Before; +import org.junit.Test; +import org.springframework.web.context.request.async.DeferredResult; + +import static org.springframework.util.ReflectionUtils.findField; +import static org.springframework.util.ReflectionUtils.getField; +import static org.springframework.util.ReflectionUtils.makeAccessible; + +import rx.Single; + +/** + * @author Spencer Gibb + */ +public class SingleDeferredResultTests { + + private Object resultNone; + private Field timeoutResultField; + + @Before + public void init() { + Field resultNoneField = findField(DeferredResult.class, "RESULT_NONE"); + makeAccessible(resultNoneField); + resultNone = getField(resultNoneField, null); + + timeoutResultField = findField(DeferredResult.class, "timeoutResult"); + makeAccessible(timeoutResultField); + } + + @Test + public void testDefaultTimeoutResult() { + Object timeoutResult = getField(timeoutResultField, new SingleDeferredResult<>(Single.just(""))); + + Assertions.assertThat(timeoutResult).as("timeoutResult was not the default").isSameAs(resultNone); + } + + @Test + public void testDefaultTimeoutResultWithTimeout() { + Object timeoutResult = getField(timeoutResultField, new SingleDeferredResult<>(1L, Single.just(""))); + + Assertions.assertThat(timeoutResult).as("timeoutResult was not the default").isSameAs(resultNone); + } + + @Test + public void testCustomTimeoutResultWithTimeout() { + Object customTimeoutResult = new Object(); + Object timeoutResult = getField(timeoutResultField, new SingleDeferredResult<>(1L, customTimeoutResult, Single.just(""))); + + Assertions.assertThat(timeoutResult).as("timeoutResult was not the custom one").isSameAs(customTimeoutResult); + } + +}