Skip to content

Commit 6c569d0

Browse files
committed
[Java] Extend arbitrary varData encodings.
We now explore more of the "schema space", as we generate lengths of different encodings. It surfaces an issue, reported in aeron-io#955, which was fixed in another outstanding PR's commit: 3885a63.
1 parent 64205f2 commit 6c569d0

File tree

3 files changed

+81
-54
lines changed

3 files changed

+81
-54
lines changed

sbe-tool/src/propertyTest/java/uk/co/real_logic/sbe/properties/arbitraries/SbeArbitraries.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,18 @@ private static Arbitrary<EnumTypeSchema> enumTypeSchema()
150150
private static Arbitrary<SetSchema> setTypeSchema()
151151
{
152152
return Arbitraries.oneOf(
153-
Arbitraries.integers().between(0, 7).set().map(choices -> new SetSchema("uint8", choices)),
154-
Arbitraries.integers().between(0, 15).set().map(choices -> new SetSchema("uint16", choices)),
155-
Arbitraries.integers().between(0, 31).set().map(choices -> new SetSchema("uint32", choices)),
156-
Arbitraries.integers().between(0, 63).set().map(choices -> new SetSchema("uint64", choices))
153+
Arbitraries.integers().between(0, 7).set()
154+
.ofMaxSize(8)
155+
.map(choices -> new SetSchema("uint8", choices)),
156+
Arbitraries.integers().between(0, 15).set()
157+
.ofMaxSize(16)
158+
.map(choices -> new SetSchema("uint16", choices)),
159+
Arbitraries.integers().between(0, 31).set()
160+
.ofMaxSize(32)
161+
.map(choices -> new SetSchema("uint32", choices)),
162+
Arbitraries.integers().between(0, 63).set()
163+
.ofMaxSize(64)
164+
.map(choices -> new SetSchema("uint64", choices))
157165
);
158166
}
159167

@@ -213,14 +221,19 @@ private static Arbitrary<Encoding.Presence> presence()
213221

214222
private static Arbitrary<VarDataSchema> varDataSchema()
215223
{
216-
return Arbitraries.of(VarDataSchema.Encoding.values())
217-
.map(VarDataSchema::new);
224+
return Combinators.combine(
225+
Arbitraries.of(VarDataSchema.Encoding.values()),
226+
Arbitraries.of(
227+
PrimitiveType.UINT8,
228+
PrimitiveType.UINT16,
229+
PrimitiveType.UINT32
230+
)
231+
).as(VarDataSchema::new);
218232
}
219233

220234
public static Arbitrary<MessageSchema> messageSchema()
221235
{
222236
return Combinators.combine(
223-
224237
withDuplicates(
225238
3,
226239
Combinators.combine(

sbe-tool/src/propertyTest/java/uk/co/real_logic/sbe/properties/schema/TestXmlSchemaWriter.java

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.agrona.collections.MutableInteger;
2121
import org.w3c.dom.Document;
2222
import org.w3c.dom.Element;
23+
import org.w3c.dom.Node;
2324

2425
import java.io.File;
2526
import java.io.StringWriter;
@@ -74,7 +75,7 @@ private static void writeTo(
7475
final Element topLevelTypes = createTypesElement(document);
7576
root.appendChild(topLevelTypes);
7677

77-
final HashMap<TypeSchema, String> typeToName = new HashMap<>();
78+
final HashMap<Object, String> typeToName = new HashMap<>();
7879

7980
final TypeSchemaConverter typeSchemaConverter = new TypeSchemaConverter(
8081
document,
@@ -88,7 +89,8 @@ private static void writeTo(
8889
topLevelTypes,
8990
typeSchemaConverter,
9091
schema.blockFields().stream().map(FieldSchema::type).collect(Collectors.toList()),
91-
schema.groups());
92+
schema.groups(),
93+
schema.varData());
9294

9395
final Element message = document.createElement("sbe:message");
9496
message.setAttribute("name", "TestMessage");
@@ -129,7 +131,7 @@ private static void writeTo(
129131

130132
private static void appendMembers(
131133
final Document document,
132-
final HashMap<TypeSchema, String> typeToName,
134+
final HashMap<Object, String> typeToName,
133135
final List<FieldSchema> blockFields,
134136
final List<GroupSchema> groups,
135137
final List<VarDataSchema> varData,
@@ -174,21 +176,10 @@ private static void appendMembers(
174176
for (final VarDataSchema data : varData)
175177
{
176178
final int id = nextMemberId.getAndIncrement();
177-
178179
final Element element = document.createElement("data");
179180
element.setAttribute("id", Integer.toString(id));
180181
element.setAttribute("name", "member" + id);
181-
switch (data.encoding())
182-
{
183-
case ASCII:
184-
element.setAttribute("type", "varStringEncoding");
185-
break;
186-
case BYTES:
187-
element.setAttribute("type", "varDataEncoding");
188-
break;
189-
default:
190-
throw new IllegalStateException("Unknown encoding: " + data.encoding());
191-
}
182+
element.setAttribute("type", requireNonNull(typeToName.get(data)));
192183
parent.appendChild(element);
193184
}
194185
}
@@ -213,27 +204,6 @@ private static Element createTypesElement(final Document document)
213204
createTypeElement(document, "numInGroup", "uint16")
214205
));
215206

216-
final Element varString = createTypeElement(document, "varData", "uint8");
217-
varString.setAttribute("length", "0");
218-
varString.setAttribute("characterEncoding", "US-ASCII");
219-
types.appendChild(createCompositeElement(
220-
document,
221-
"varStringEncoding",
222-
createTypeElement(document, "length", "uint16"),
223-
varString
224-
));
225-
226-
final Element varData = createTypeElement(document, "varData", "uint8");
227-
final Element varDataLength = createTypeElement(document, "length", "uint32");
228-
varDataLength.setAttribute("maxValue", "1000000");
229-
varData.setAttribute("length", "0");
230-
types.appendChild(createCompositeElement(
231-
document,
232-
"varDataEncoding",
233-
varDataLength,
234-
varData
235-
));
236-
237207
return types;
238208
}
239209

@@ -359,7 +329,8 @@ private static void appendTypes(
359329
final Element topLevelTypes,
360330
final TypeSchemaConverter typeSchemaConverter,
361331
final List<TypeSchema> blockFields,
362-
final List<GroupSchema> groups)
332+
final List<GroupSchema> groups,
333+
final List<VarDataSchema> varDataFields)
363334
{
364335
for (final TypeSchema field : blockFields)
365336
{
@@ -376,23 +347,29 @@ private static void appendTypes(
376347
topLevelTypes,
377348
typeSchemaConverter,
378349
group.blockFields().stream().map(FieldSchema::type).collect(Collectors.toList()),
379-
group.groups()
380-
);
350+
group.groups(),
351+
group.varData());
352+
}
353+
354+
for (final VarDataSchema varData : varDataFields)
355+
{
356+
topLevelTypes.appendChild(typeSchemaConverter.convert(varData));
381357
}
382358
}
383359

360+
@SuppressWarnings("EnhancedSwitchMigration")
384361
private static final class TypeSchemaConverter implements TypeSchemaVisitor
385362
{
386363
private final Document document;
387364
private final Element topLevelTypes;
388-
private final Map<TypeSchema, String> typeToName;
389-
private final Function<TypeSchema, String> nextName;
365+
private final Map<Object, String> typeToName;
366+
private final Function<Object, String> nextName;
390367
private Element result;
391368

392369
private TypeSchemaConverter(
393370
final Document document,
394371
final Element topLevelTypes,
395-
final Map<TypeSchema, String> typeToName)
372+
final Map<Object, String> typeToName)
396373
{
397374
this.document = document;
398375
this.topLevelTypes = topLevelTypes;
@@ -481,5 +458,31 @@ public Element convert(final TypeSchema type)
481458
type.accept(this);
482459
return requireNonNull(result);
483460
}
461+
462+
public Node convert(final VarDataSchema varData)
463+
{
464+
final Element lengthElement = createTypeElement(document, "length",
465+
varData.lengthEncoding().primitiveName());
466+
467+
if (varData.lengthEncoding().size() >= 4)
468+
{
469+
lengthElement.setAttribute("maxValue", Integer.toString(1_000_000));
470+
}
471+
472+
final Element varDataElement = createTypeElement(document, "varData", "uint8");
473+
varDataElement.setAttribute("length", "0");
474+
475+
if (varData.dataEncoding().equals(VarDataSchema.Encoding.ASCII))
476+
{
477+
varDataElement.setAttribute("characterEncoding", "US-ASCII");
478+
}
479+
480+
return createCompositeElement(
481+
document,
482+
typeToName.computeIfAbsent(varData, nextName),
483+
lengthElement,
484+
varDataElement
485+
);
486+
}
484487
}
485488
}

sbe-tool/src/propertyTest/java/uk/co/real_logic/sbe/properties/schema/VarDataSchema.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,29 @@
1616

1717
package uk.co.real_logic.sbe.properties.schema;
1818

19+
import uk.co.real_logic.sbe.PrimitiveType;
20+
1921
public final class VarDataSchema
2022
{
21-
private final Encoding encoding;
23+
private final Encoding dataEncoding;
24+
private final PrimitiveType lengthEncoding;
25+
26+
public VarDataSchema(
27+
final Encoding dataEncoding,
28+
final PrimitiveType lengthEncoding)
29+
{
30+
this.dataEncoding = dataEncoding;
31+
this.lengthEncoding = lengthEncoding;
32+
}
2233

23-
public VarDataSchema(final Encoding encoding)
34+
public Encoding dataEncoding()
2435
{
25-
this.encoding = encoding;
36+
return dataEncoding;
2637
}
2738

28-
public Encoding encoding()
39+
public PrimitiveType lengthEncoding()
2940
{
30-
return encoding;
41+
return lengthEncoding;
3142
}
3243

3344
public enum Encoding

0 commit comments

Comments
 (0)