17
17
package io .r2dbc .postgresql .message .backend ;
18
18
19
19
import io .netty .buffer .ByteBuf ;
20
+ import io .netty .util .ReferenceCountUtil ;
20
21
import org .assertj .core .api .AbstractObjectAssert ;
21
22
import org .assertj .core .api .ObjectAssert ;
22
23
import org .springframework .util .ReflectionUtils ;
23
24
24
25
import java .lang .reflect .Method ;
26
+ import java .util .ArrayList ;
27
+ import java .util .List ;
25
28
import java .util .Objects ;
26
29
import java .util .function .Function ;
27
30
32
35
*/
33
36
final class BackendMessageAssert extends AbstractObjectAssert <BackendMessageAssert , Class <? extends BackendMessage >> {
34
37
38
+ private Cleaner cleaner = new Cleaner ();
39
+
35
40
private BackendMessageAssert (Class <? extends BackendMessage > actual ) {
36
41
super (actual , BackendMessageAssert .class );
37
42
}
@@ -40,6 +45,11 @@ static BackendMessageAssert assertThat(Class<? extends BackendMessage> actual) {
40
45
return new BackendMessageAssert (actual );
41
46
}
42
47
48
+ BackendMessageAssert cleaner (Cleaner cleaner ) {
49
+ this .cleaner = cleaner ;
50
+ return this ;
51
+ }
52
+
43
53
@ SuppressWarnings ("unchecked" )
44
54
<T extends BackendMessage > ObjectAssert <T > decoded (Function <ByteBuf , ByteBuf > decoded ) {
45
55
Method method = ReflectionUtils .findMethod (this .actual , "decode" , ByteBuf .class );
@@ -51,7 +61,28 @@ <T extends BackendMessage> ObjectAssert<T> decoded(Function<ByteBuf, ByteBuf> de
51
61
ReflectionUtils .makeAccessible (method );
52
62
T actual = (T ) ReflectionUtils .invokeMethod (method , null , decoded .apply (TEST .buffer ()));
53
63
54
- return new ObjectAssert <>(actual );
64
+ return new ObjectAssert <>(this .cleaner .capture (actual ));
65
+ }
66
+
67
+ public Cleaner cleaner () {
68
+ return this .cleaner ;
69
+ }
70
+
71
+ static class Cleaner {
72
+
73
+ private final List <Object > objects = new ArrayList <>();
74
+
75
+ public void clean () {
76
+ this .objects .forEach (ReferenceCountUtil ::release );
77
+ this .objects .clear ();
78
+ }
79
+
80
+ public <T > T capture (T object ) {
81
+ this .objects .add (object );
82
+
83
+ return object ;
84
+ }
85
+
55
86
}
56
87
57
88
}
0 commit comments