Track down (now obvious) signed comparison of tag value issue

This commit is contained in:
Stuart Stock
2017-02-06 12:46:31 -06:00
parent 7ba858d3dd
commit e5f5d466b6
3 changed files with 13 additions and 7 deletions

View File

@ -13,7 +13,9 @@ import static nearenough.util.Preconditions.checkNotNull;
public final class RtMessageBuilder { public final class RtMessageBuilder {
private final Map<RtTag, byte[]> map = new TreeMap<>(Comparator.comparing(RtTag::valueLE)); private final Map<RtTag, byte[]> map = new TreeMap<>(
Comparator.comparing(RtTag::valueLE, Integer::compareUnsigned)
);
private ByteBufAllocator allocator = ByteBufAllocator.DEFAULT; private ByteBufAllocator allocator = ByteBufAllocator.DEFAULT;
private boolean shouldAddPadding = false; private boolean shouldAddPadding = false;

View File

@ -78,14 +78,14 @@ public enum RtTag {
} }
/** /**
* @return The on-the-wire representation of this tag. * @return The <b>unsigned</b> on-the-wire representation of this tag.
*/ */
public int wireEncoding() { public int wireEncoding() {
return wireEncoding; return wireEncoding;
} }
/** /**
* @return The little-endian representation of this tag. * @return The <b>unsigned</b> little-endian representation of this tag.
*/ */
public int valueLE() { public int valueLE() {
return valueLE; return valueLE;

View File

@ -57,22 +57,26 @@ public final class RtMessageBuilderTest {
byte[] value = {6, 7, 8, 9}; byte[] value = {6, 7, 8, 9};
RtMessage msg = RtMessage.builder() RtMessage msg = RtMessage.builder()
.add(RtTag.INDX, value) .add(RtTag.NONC, value)
.addPadding(true) .addPadding(true)
.build(); .build();
assertThat(msg.numTags(), equalTo(2)); assertThat(msg.numTags(), equalTo(2));
assertArrayEquals(msg.get(RtTag.INDX), value); assertArrayEquals(msg.get(RtTag.NONC), value);
// 4 numTags // 4 numTags
// 4 single offset // 4 single offset
// 8 two tags (PAD and INDX) // 8 two tags (NONC and PAD)
// 4 INDX value length // 4 NONC value length
// -- // --
// 20 bytes // 20 bytes
// //
// 1024 - 20 = 1004 length of PAD value // 1024 - 20 = 1004 length of PAD value
assertThat(msg.get(RtTag.PAD).length, equalTo(1004)); assertThat(msg.get(RtTag.PAD).length, equalTo(1004));
ArrayList<RtTag> tags = new ArrayList<>(msg.mapping().keySet());
assertThat(tags.get(0), equalTo(RtTag.NONC));
assertThat(tags.get(1), equalTo(RtTag.PAD));
} }
@Test @Test