17
17
package org .springframework .cloud .sleuth .instrument .messaging ;
18
18
19
19
import java .util .Collections ;
20
+ import java .util .List ;
21
+ import java .util .function .Function ;
20
22
import java .util .function .Supplier ;
21
23
22
24
import com .fasterxml .jackson .databind .ObjectMapper ;
23
25
import org .junit .jupiter .api .Test ;
26
+ import org .mockito .Answers ;
27
+ import org .mockito .BDDMockito ;
24
28
25
29
import org .springframework .cloud .function .context .FunctionRegistration ;
26
30
import org .springframework .cloud .function .context .FunctionType ;
29
33
import org .springframework .cloud .function .context .config .JsonMessageConverter ;
30
34
import org .springframework .cloud .function .json .JacksonMapper ;
31
35
import org .springframework .cloud .sleuth .Span ;
36
+ import org .springframework .cloud .sleuth .TraceContext ;
37
+ import org .springframework .cloud .sleuth .Span .Builder ;
38
+ import org .springframework .cloud .sleuth .propagation .Propagator ;
39
+ import org .springframework .cloud .sleuth .propagation .Propagator .Getter ;
40
+ import org .springframework .cloud .sleuth .propagation .Propagator .Setter ;
32
41
import org .springframework .cloud .sleuth .tracer .SimpleTracer ;
33
42
import org .springframework .core .convert .support .DefaultConversionService ;
43
+ import org .springframework .integration .support .MessageBuilder ;
34
44
import org .springframework .messaging .Message ;
35
45
import org .springframework .messaging .converter .CompositeMessageConverter ;
36
46
import org .springframework .mock .env .MockEnvironment ;
39
49
import static org .assertj .core .api .BDDAssertions .then ;
40
50
41
51
class TraceFunctionAroundWrapperTests {
42
-
43
- @ Test
44
- void test_tracing_with_supplier () {
45
- CompositeMessageConverter messageConverter = new CompositeMessageConverter (
46
- Collections .singletonList (new JsonMessageConverter (new JacksonMapper (new ObjectMapper ()))));
47
-
48
- SimpleTracer tracer = new SimpleTracer ();
49
- TraceFunctionAroundWrapper wrapper = new TraceFunctionAroundWrapper (null , tracer , null , null , null ) {
52
+
53
+ CompositeMessageConverter messageConverter = new CompositeMessageConverter (
54
+ Collections .singletonList (new JsonMessageConverter (new JacksonMapper (new ObjectMapper ()))));
55
+
56
+ SimpleFunctionRegistry catalog = new SimpleFunctionRegistry (new DefaultConversionService (), messageConverter ,
57
+ new JacksonMapper (new ObjectMapper ()));
58
+
59
+ SimpleTracer tracer = new SimpleTracer ();
60
+
61
+ MockEnvironment mockEnvironment = mockEnvironment ();
62
+
63
+ TraceFunctionAroundWrapper wrapper = new TraceFunctionAroundWrapper (mockEnvironment , tracer , testPropagator (),
64
+ new MessageHeaderPropagatorSetter (), new MessageHeaderPropagatorGetter ()) {
65
+ @ Override
66
+ MessageAndSpan getMessageAndSpans (Message <?> resultMessage , String name , Span spanFromMessage ) {
67
+ return new MessageAndSpan (resultMessage , spanFromMessage );
68
+ }
69
+ };
70
+
71
+ /**
72
+ * @return
73
+ */
74
+ private Propagator testPropagator () {
75
+ return new Propagator () {
76
+
50
77
@ Override
51
- MessageAndSpan getMessageAndSpans (Message <?> resultMessage , String name , Span spanFromMessage ) {
52
- return new MessageAndSpan (resultMessage , spanFromMessage );
78
+ public <C > void inject (TraceContext context , C carrier , Setter <C > setter ) {
79
+ setter .set (carrier , "superHeader" , "test" );
80
+ }
81
+
82
+ @ Override
83
+ public List <String > fields () {
84
+ return Collections .singletonList ("superHeader" );
85
+ }
86
+
87
+ @ Override
88
+ public <C > Builder extract (C carrier , Getter <C > getter ) {
89
+ Builder builder = BDDMockito .mock (Builder .class , Answers .RETURNS_SELF );
90
+ BDDMockito .given (builder .start ()).willReturn (tracer .nextSpan ());
91
+ return builder ;
53
92
}
54
93
};
55
-
94
+ }
95
+
96
+ @ Test
97
+ void test_tracing_with_supplier () {
56
98
FunctionRegistration <Greeter > registration = new FunctionRegistration <>(new Greeter (), "greeter" )
57
99
.type (FunctionType .of (Greeter .class ));
58
- SimpleFunctionRegistry catalog = new SimpleFunctionRegistry (new DefaultConversionService (), messageConverter ,
59
- new JacksonMapper (new ObjectMapper ()));
60
100
catalog .register (registration );
61
101
FunctionInvocationWrapper function = catalog .lookup ("greeter" );
102
+
62
103
Message <?> result = (Message <?>) wrapper .apply (null , function );
104
+
63
105
assertThat (result .getPayload ()).isEqualTo ("hello" );
64
106
assertThat (tracer .getOnlySpan ().name ).isEqualTo ("greeter" );
65
107
}
108
+
109
+ @ Test
110
+ void test_tracing_with_function () {
111
+ FunctionRegistration <GreeterFunction > registration = new FunctionRegistration <>(new GreeterFunction (), "greeter" )
112
+ .type (FunctionType .of (GreeterFunction .class ));
113
+ catalog .register (registration );
114
+ FunctionInvocationWrapper function = catalog .lookup ("greeter" );
115
+
116
+ Message <?> result = (Message <?>) wrapper .apply (MessageBuilder
117
+ .withPayload ("hello" ).setHeader ("superHeader" , "someValue" ).build (), function );
118
+
119
+ assertThat (result .getPayload ()).isEqualTo ("HELLO" );
120
+ assertThat (tracer .getOnlySpan ().name ).isEqualTo ("greeter" );
121
+ }
66
122
67
123
@ Test
68
124
void should_clear_cache_on_refresh () {
@@ -104,6 +160,13 @@ void should_point_to_proper_destination_when_working_with_remapped_functions() {
104
160
105
161
assertThat (wrapper .outputDestination ("marcin" )).isEqualTo ("bob" );
106
162
}
163
+
164
+ private MockEnvironment mockEnvironment () {
165
+ MockEnvironment mockEnvironment = new MockEnvironment ();
166
+ mockEnvironment .setProperty ("spring.cloud.stream.bindings.greeter-in-0.destination" , "oleg" );
167
+ mockEnvironment .setProperty ("spring.cloud.stream.bindings.greeter-out-0.destination" , "bob" );
168
+ return mockEnvironment ;
169
+ }
107
170
108
171
private static class Greeter implements Supplier <String > {
109
172
@@ -113,5 +176,14 @@ public String get() {
113
176
}
114
177
115
178
}
179
+
180
+ private static class GreeterFunction implements Function <String , String > {
181
+
182
+ @ Override
183
+ public String apply (String in ) {
184
+ return in .toUpperCase ();
185
+ }
186
+
187
+ }
116
188
117
189
}
0 commit comments