only update processed parts count with unique parts

This commit is contained in:
Craig Raw 2023-05-29 15:21:37 +02:00
parent 1fe0489ceb
commit 6ee94c42ac
3 changed files with 63 additions and 2 deletions

View file

@ -16,6 +16,7 @@ import static com.sparrowwallet.hummingbird.fountain.FountainUtils.chooseFragmen
public class FountainDecoder { public class FountainDecoder {
private final Set<Integer> recievedPartIndexes = new TreeSet<>(); private final Set<Integer> recievedPartIndexes = new TreeSet<>();
private Set<Integer> lastPartIndexes; private Set<Integer> lastPartIndexes;
private final Set<Integer> processedPartHashes = new HashSet<>();
private int processedPartsCount = 0; private int processedPartsCount = 0;
private Result result; private Result result;
private long checksum; private long checksum;
@ -114,8 +115,10 @@ public class FountainDecoder {
processQueueItem(); processQueueItem();
} }
// Keep track of how many parts we've processed // Keep track of how many unique parts we've processed
processedPartsCount += 1; if(processedPartHashes.add(encoderPart.hashCode())) {
processedPartsCount++;
}
//printPartEnd(); //printPartEnd();
return true; return true;

View file

@ -181,5 +181,41 @@ public class FountainEncoder {
return new Part(seqNum.getValue().longValue(), seqLen.getValue().intValue(), messageLen.getValue().intValue(), checksum.getValue().longValue(), data.getBytes()); return new Part(seqNum.getValue().longValue(), seqLen.getValue().intValue(), messageLen.getValue().intValue(), checksum.getValue().longValue(), data.getBytes());
} }
@Override
public boolean equals(Object o) {
if(this == o) {
return true;
}
if(o == null || getClass() != o.getClass()) {
return false;
}
Part part = (Part) o;
if(seqNum != part.seqNum) {
return false;
}
if(seqLen != part.seqLen) {
return false;
}
if(messageLen != part.messageLen) {
return false;
}
if(checksum != part.checksum) {
return false;
}
return Arrays.equals(data, part.data);
}
@Override
public int hashCode() {
int result = (int) (seqNum ^ (seqNum >>> 32));
result = 31 * result + seqLen;
result = 31 * result + messageLen;
result = 31 * result + (int) (checksum ^ (checksum >>> 32));
result = 31 * result + Arrays.hashCode(data);
return result;
}
} }
} }

View file

@ -216,4 +216,26 @@ public class URTest {
Assert.assertEquals(TestUtils.bytesToHex(ur.toBytes()), "70736274ff0100520200000001adb4134883273f90371c364743e1816de7099df3895dbc95ebcd19beb83200ec0000000000ffffffff01e80300000000000016001457766b7686ca60e5221119966bdfe1d1f4b62181000000000001011f581b0000000000001600145da1bc9a730b7e9d209f15aff9c096f6bbd89d26220603ccd4532b1350e04cbaff91056bdb08bd3877b4fcb8cd70aaeda5239ce112547b180000000054000080000000800000008000000000060000000000"); Assert.assertEquals(TestUtils.bytesToHex(ur.toBytes()), "70736274ff0100520200000001adb4134883273f90371c364743e1816de7099df3895dbc95ebcd19beb83200ec0000000000ffffffff01e80300000000000016001457766b7686ca60e5221119966bdfe1d1f4b62181000000000001011f581b0000000000001600145da1bc9a730b7e9d209f15aff9c096f6bbd89d26220603ccd4532b1350e04cbaff91056bdb08bd3877b4fcb8cd70aaeda5239ce112547b180000000054000080000000800000008000000000060000000000");
Arrays.stream(fragments).forEach(part -> Assert.assertTrue(LegacyURDecoder.isLegacyURFragment(part))); Arrays.stream(fragments).forEach(part -> Assert.assertTrue(LegacyURDecoder.isLegacyURFragment(part)));
} }
@Test
public void testDuplicateDecode() {
String[] parts = new String[] {
"ur:bytes/1-9/lpadascfadaxcywenbpljkhdcahkadaemejtswhhylkepmykhhtsytsnoyoyaxaedsuttydmmhhpktpmsrjtdkgslpgh",
"ur:bytes/2-9/lpaoascfadaxcywenbpljkhdcagwdpfnsboxgwlbaawzuefywkdplrsrjynbvygabwjldapfcsgmghhkhstlrdcxaefz",
"ur:bytes/3-9/lpaxascfadaxcywenbpljkhdcahelbknlkuejnbadmssfhfrdpsbiegecpasvssovlgeykssjykklronvsjksopdzmol"
};
URDecoder urDecoder = new URDecoder();
Assert.assertEquals(0, urDecoder.getProcessedPartsCount());
urDecoder.receivePart(parts[0]);
Assert.assertEquals(1, urDecoder.getProcessedPartsCount());
urDecoder.receivePart(parts[0]);
Assert.assertEquals(1, urDecoder.getProcessedPartsCount());
urDecoder.receivePart(parts[1]);
Assert.assertEquals(2, urDecoder.getProcessedPartsCount());
urDecoder.receivePart(parts[0]);
Assert.assertEquals(2, urDecoder.getProcessedPartsCount());
urDecoder.receivePart(parts[2]);
Assert.assertEquals(3, urDecoder.getProcessedPartsCount());
}
} }