GH-652 Improve error messaging and function exist check

FunctionRSocketUtils looks up function by a bean name hen it attempts  to determine if there is a remote routing. That is not correct since bean name may not exist if function was manually registered. Also, the error message 'Must only contain one output redirect' was not clear as it was not showing the actual function name for propper debugging

Resolves #651
This commit is contained in:
Oleg Zhurakousky
2021-02-22 12:19:57 +01:00
parent 54eedc6713
commit 0abce5a2b8
4 changed files with 83 additions and 25 deletions

View File

@@ -139,9 +139,6 @@ public class RSocketAutoConfigurationRoutingTests {
}
}
@EnableAutoConfiguration
@Configuration
public static class SampleFunctionConfiguration {

View File

@@ -47,6 +47,56 @@ import org.springframework.util.SocketUtils;
* @since 3.1
*/
public class RSocketAutoConfigurationTests {
@Test
public void testNonExistingFunctionInRoute() {
int port = SocketUtils.findAvailableTcpPort();
try (
ConfigurableApplicationContext applicationContext =
new SpringApplicationBuilder(SampleFunctionConfiguration.class)
.web(WebApplicationType.NONE)
.run("--logging.level.org.springframework.cloud.function=DEBUG",
"--spring.rsocket.server.port=" + port);
) {
RSocketRequester.Builder rsocketRequesterBuilder =
applicationContext.getBean(RSocketRequester.Builder.class);
rsocketRequesterBuilder.tcp("localhost", port)
.route("foo")
.data("\"hello\"")
.retrieveMono(String.class)
.as(StepVerifier::create)
.expectError()
.verify();
}
}
@Test
public void testNonExistingFunctionInRouteSingleFunctionInCatalog() {
int port = SocketUtils.findAvailableTcpPort();
try (
ConfigurableApplicationContext applicationContext =
new SpringApplicationBuilder(SingleFunctionConfiguration.class)
.web(WebApplicationType.NONE)
.run("--logging.level.org.springframework.cloud.function=DEBUG",
"--spring.rsocket.server.port=" + port);
) {
RSocketRequester.Builder rsocketRequesterBuilder =
applicationContext.getBean(RSocketRequester.Builder.class);
rsocketRequesterBuilder.tcp("localhost", port)
.route("blah")
.data("\"hello\"")
.retrieveMono(String.class)
.as(StepVerifier::create)
.expectNext("hello")
.expectComplete()
.verify();
}
}
@Test
public void testImperativeFunctionAsRequestReplyWithDefinition() {
int port = SocketUtils.findAvailableTcpPort();
@@ -535,4 +585,13 @@ public class RSocketAutoConfigurationTests {
}
@EnableAutoConfiguration
@Configuration
public static class SingleFunctionConfiguration {
@Bean
public Function<String, String> echo() {
return v -> v;
}
}
}