13
13
* See the License for the specific language governing permissions and
14
14
* limitations under the License.
15
15
*/
16
-
17
16
package uk .co .real_logic .sbe .properties ;
18
17
19
18
import net .jqwik .api .*;
19
+ import uk .co .real_logic .sbe .generation .common .PrecedenceChecks ;
20
20
import uk .co .real_logic .sbe .generation .cpp .CppDtoGenerator ;
21
21
import uk .co .real_logic .sbe .generation .cpp .CppGenerator ;
22
22
import uk .co .real_logic .sbe .generation .cpp .NamespaceOutputManager ;
23
23
import uk .co .real_logic .sbe .generation .csharp .CSharpDtoGenerator ;
24
24
import uk .co .real_logic .sbe .generation .csharp .CSharpGenerator ;
25
25
import uk .co .real_logic .sbe .generation .csharp .CSharpNamespaceOutputManager ;
26
+ import uk .co .real_logic .sbe .generation .java .JavaDtoGenerator ;
27
+ import uk .co .real_logic .sbe .generation .java .JavaGenerator ;
28
+ import uk .co .real_logic .sbe .ir .generated .MessageHeaderDecoder ;
26
29
import uk .co .real_logic .sbe .properties .arbitraries .SbeArbitraries ;
30
+ import uk .co .real_logic .sbe .properties .utils .InMemoryOutputManager ;
31
+ import org .agrona .DirectBuffer ;
32
+ import org .agrona .ExpandableArrayBuffer ;
27
33
import org .agrona .IoUtil ;
34
+ import org .agrona .MutableDirectBuffer ;
35
+ import org .agrona .concurrent .UnsafeBuffer ;
28
36
import org .agrona .io .DirectBufferInputStream ;
29
37
30
38
import java .io .IOException ;
31
39
import java .io .InputStream ;
32
40
import java .io .OutputStream ;
41
+ import java .lang .reflect .InvocationTargetException ;
42
+ import java .lang .reflect .Method ;
43
+ import java .net .URLClassLoader ;
33
44
import java .nio .charset .StandardCharsets ;
34
45
import java .nio .file .Files ;
35
46
import java .nio .file .Path ;
36
47
import java .util .Arrays ;
37
48
49
+ import static uk .co .real_logic .sbe .SbeTool .JAVA_DEFAULT_DECODING_BUFFER_TYPE ;
50
+ import static uk .co .real_logic .sbe .SbeTool .JAVA_DEFAULT_ENCODING_BUFFER_TYPE ;
51
+
38
52
@ SuppressWarnings ("ReadWriteStringCanBeUsed" )
39
53
public class DtosPropertyTest
40
54
{
@@ -44,6 +58,101 @@ public class DtosPropertyTest
44
58
private static final String CPP_EXECUTABLE = System .getProperty ("sbe.tests.cpp.executable" , "g++" );
45
59
private static final boolean KEEP_DIR_ON_FAILURE = Boolean .parseBoolean (
46
60
System .getProperty ("sbe.tests.keep.dir.on.failure" , "true" ));
61
+ private final ExpandableArrayBuffer outputBuffer = new ExpandableArrayBuffer ();
62
+
63
+ // @Test
64
+ // void oneRun() throws IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException,
65
+ // IllegalAccessException
66
+ // {
67
+ // javaDtoEncodeShouldBeTheInverseOfDtoDecode(encodedMessage().sample());
68
+ // }
69
+
70
+ @ Property
71
+ @ Disabled
72
+ void javaDtoEncodeShouldBeTheInverseOfDtoDecode (
73
+ @ ForAll ("encodedMessage" ) final SbeArbitraries .EncodedMessage encodedMessage
74
+ ) throws IOException , ClassNotFoundException , NoSuchMethodException , InvocationTargetException ,
75
+ IllegalAccessException
76
+ {
77
+ final String packageName = encodedMessage .ir ().applicableNamespace ();
78
+ final InMemoryOutputManager outputManager = new InMemoryOutputManager (packageName );
79
+
80
+ boolean success = false ;
81
+
82
+ try
83
+ {
84
+ try
85
+ {
86
+ new JavaGenerator (
87
+ encodedMessage .ir (),
88
+ JAVA_DEFAULT_ENCODING_BUFFER_TYPE ,
89
+ JAVA_DEFAULT_DECODING_BUFFER_TYPE ,
90
+ false ,
91
+ false ,
92
+ false ,
93
+ false ,
94
+ PrecedenceChecks .newInstance (new PrecedenceChecks .Context ()),
95
+ outputManager )
96
+ .generate ();
97
+
98
+ new JavaDtoGenerator (encodedMessage .ir (), outputManager )
99
+ .generate ();
100
+ }
101
+ catch (final Exception generationException )
102
+ {
103
+ throw new AssertionError (
104
+ "Code generation failed.\n \n " +
105
+ "SCHEMA:\n " + encodedMessage .schema (),
106
+ generationException );
107
+ }
108
+
109
+ try (URLClassLoader generatedClassLoader = outputManager .compileGeneratedSources ())
110
+ {
111
+ final Class <?> dtoClass =
112
+ generatedClassLoader .loadClass (packageName + ".TestMessageDto" );
113
+
114
+ final Method decodeFrom =
115
+ dtoClass .getMethod ("decodeFrom" , DirectBuffer .class , int .class , short .class , short .class );
116
+
117
+ final Method encodeWith =
118
+ dtoClass .getMethod ("encodeWithHeaderWith" , dtoClass , MutableDirectBuffer .class , int .class );
119
+
120
+ final int inputLength = encodedMessage .length ();
121
+ final ExpandableArrayBuffer inputBuffer = encodedMessage .buffer ();
122
+ final MessageHeaderDecoder header = new MessageHeaderDecoder ().wrap (inputBuffer , 0 );
123
+ final short blockLength = (short )header .blockLength ();
124
+ final short actingVersion = (short )header .version ();
125
+ final Object dto = decodeFrom .invoke (null ,
126
+ encodedMessage .buffer (), MessageHeaderDecoder .ENCODED_LENGTH , blockLength , actingVersion );
127
+ outputBuffer .setMemory (0 , outputBuffer .capacity (), (byte )0 );
128
+ final int outputLength = (int )encodeWith .invoke (null , dto , outputBuffer , 0 );
129
+ if (!areEqual (inputBuffer , inputLength , outputBuffer , outputLength ))
130
+ {
131
+ throw new AssertionError (
132
+ "Input and output differ\n \n " +
133
+ "SCHEMA:\n " + encodedMessage .schema ());
134
+ }
135
+
136
+ success = true ;
137
+ }
138
+ }
139
+ finally
140
+ {
141
+ if (!success )
142
+ {
143
+ outputManager .dumpSources ();
144
+ }
145
+ }
146
+ }
147
+
148
+ private boolean areEqual (
149
+ final ExpandableArrayBuffer inputBuffer ,
150
+ final int inputLength ,
151
+ final ExpandableArrayBuffer outputBuffer ,
152
+ final int outputLength )
153
+ {
154
+ return new UnsafeBuffer (inputBuffer , 0 , inputLength ).equals (new UnsafeBuffer (outputBuffer , 0 , outputLength ));
155
+ }
47
156
48
157
@ Property
49
158
void csharpDtoEncodeShouldBeTheInverseOfDtoDecode (
@@ -274,4 +383,5 @@ private static void copyResourceToFile(
274
383
throw new RuntimeException (e );
275
384
}
276
385
}
386
+
277
387
}
0 commit comments