Skip to content

Commit 1c80149

Browse files
authored
Merge pull request #565 from ZachBray/feature/throw-on-max-group-size-exceeded
[C#] Check max group size not exceeded #564
2 parents abdc9d3 + f520ad6 commit 1c80149

File tree

2 files changed

+67
-4
lines changed

2 files changed

+67
-4
lines changed

csharp/sbe-tests/Issue564Tests.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using Baseline;
3+
using Microsoft.VisualStudio.TestTools.UnitTesting;
4+
using Org.SbeTool.Sbe.Dll;
5+
6+
namespace Org.SbeTool.Sbe.Tests
7+
{
8+
[TestClass]
9+
public class Issue564Tests
10+
{
11+
[TestMethod]
12+
public void ShouldFailToEncodeGroupsThatExceedTheMaximumRepresentableSize()
13+
{
14+
// Arrange
15+
var expectedSize = 1024 + (8 + 8 + 8 + 20) * ushort.MaxValue;
16+
var buffer = new DirectBuffer(new byte[expectedSize]);
17+
var car = new Car();
18+
car.WrapForEncode(buffer, 0);
19+
car.SerialNumber = 1234;
20+
car.ModelYear = 2013;
21+
car.Available = BooleanType.T;
22+
car.Code = Model.A;
23+
for (int i = 0, size = Car.SomeNumbersLength; i < size; i++)
24+
{
25+
car.SetSomeNumbers(i, (uint)i);
26+
}
27+
car.SetVehicleCode(System.Text.Encoding.ASCII.GetBytes("abcdef"), 0);
28+
car.Extras = OptionalExtras.CruiseControl | OptionalExtras.SportsPack;
29+
30+
car.Engine.Capacity = 2000;
31+
car.Engine.NumCylinders = 4;
32+
car.Engine.SetManufacturerCode(System.Text.Encoding.ASCII.GetBytes("123"), 0);
33+
car.Engine.Efficiency = 35;
34+
car.Engine.BoosterEnabled = BooleanType.T;
35+
car.Engine.Booster.BoostType = BoostType.NITROUS;
36+
car.Engine.Booster.HorsePower = 200;
37+
38+
// Act + Assert
39+
Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
40+
{
41+
int countUnrepresentableByGroupSizeEncoding = 1 + ushort.MaxValue;
42+
var fuelFigures = car.FuelFiguresCount(countUnrepresentableByGroupSizeEncoding);
43+
for (int i = 0; i < countUnrepresentableByGroupSizeEncoding; i++)
44+
{
45+
fuelFigures.Next();
46+
fuelFigures.Speed = 30;
47+
fuelFigures.Mpg = 35.9f;
48+
var description = System.Text.Encoding.ASCII.GetBytes($"i={i}");
49+
fuelFigures.SetUsageDescription(description, 0, description.Length);
50+
}
51+
});
52+
}
53+
}
54+
}

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/csharp/CSharpGenerator.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,23 +197,32 @@ private void generateGroupClassHeader(
197197

198198
final int blockLength = tokens.get(index).encodedLength();
199199
final String typeForBlockLength = cSharpTypeName(tokens.get(index + 2).encoding().primitiveType());
200-
final String typeForNumInGroup = cSharpTypeName(tokens.get(index + 3).encoding().primitiveType());
200+
final Token numInGroupToken = tokens.get(index + 3);
201+
final String typeForNumInGroup = cSharpTypeName(numInGroupToken.encoding().primitiveType());
201202

202203
sb.append(String.format("\n" +
203204
indent + INDENT + "public void WrapForEncode(%1$s parentMessage, DirectBuffer buffer, int count)\n" +
204205
indent + INDENT + "{\n" +
206+
indent + INDENT + INDENT + "if (count < %2$d || count > %3$d)\n" +
207+
indent + INDENT + INDENT + "{\n" +
208+
indent + INDENT + INDENT + INDENT + "throw new ArgumentOutOfRangeException(\"count\",\n" +
209+
indent + INDENT + INDENT + INDENT + INDENT + "\"Outside allowed range: count=\" + count +\n" +
210+
indent + INDENT + INDENT + INDENT + INDENT + "\", min=%2$d, max=%3$d\");\n" +
211+
indent + INDENT + INDENT + "}\n\n" +
205212
indent + INDENT + INDENT + "_parentMessage = parentMessage;\n" +
206213
indent + INDENT + INDENT + "_buffer = buffer;\n" +
207214
indent + INDENT + INDENT + "_dimensions.Wrap(buffer, parentMessage.Limit, _actingVersion);\n" +
208-
indent + INDENT + INDENT + "_dimensions.BlockLength = (%2$s)%3$d;\n" +
209-
indent + INDENT + INDENT + "_dimensions.NumInGroup = (%4$s)count;\n" +
215+
indent + INDENT + INDENT + "_dimensions.BlockLength = (%4$s)%5$d;\n" +
216+
indent + INDENT + INDENT + "_dimensions.NumInGroup = (%6$s)count;\n" +
210217
indent + INDENT + INDENT + "_index = -1;\n" +
211218
indent + INDENT + INDENT + "_count = count;\n" +
212-
indent + INDENT + INDENT + "_blockLength = %3$d;\n" +
219+
indent + INDENT + INDENT + "_blockLength = %5$d;\n" +
213220
indent + INDENT + INDENT + "_actingVersion = SchemaVersion;\n" +
214221
indent + INDENT + INDENT + "parentMessage.Limit = parentMessage.Limit + SbeHeaderSize;\n" +
215222
indent + INDENT + "}\n",
216223
parentMessageClassName,
224+
numInGroupToken.encoding().applicableMinValue().longValue(),
225+
numInGroupToken.encoding().applicableMaxValue().longValue(),
217226
typeForBlockLength,
218227
blockLength,
219228
typeForNumInGroup));

0 commit comments

Comments
 (0)