diff --git a/src/main/java/net/ripe/rpki/rsyncit/rrdp/RrdpFetcher.java b/src/main/java/net/ripe/rpki/rsyncit/rrdp/RrdpFetcher.java
index 89409ae..bc1c721 100644
--- a/src/main/java/net/ripe/rpki/rsyncit/rrdp/RrdpFetcher.java
+++ b/src/main/java/net/ripe/rpki/rsyncit/rrdp/RrdpFetcher.java
@@ -1,5 +1,6 @@
package net.ripe.rpki.rsyncit.rrdp;
+import com.google.common.annotations.VisibleForTesting;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.ripe.rpki.commons.crypto.cms.RpkiSignedObject;
@@ -335,7 +336,8 @@ private static void checkResult(String objectUri, ValidationResult result) {
* This MAY help for the corner case of objects having second-accuracy timestamps
* and the timestatmp in seconds being the same for multiple objects.
*/
- private Instant incorporateHashInTimestamp(Instant t, byte[] hash) {
+ @VisibleForTesting
+ public static Instant incorporateHashInTimestamp(Instant t, byte[] hash) {
final BigInteger ms = new BigInteger(hash).mod(BigInteger.valueOf(1000_000_000L));
return t.truncatedTo(ChronoUnit.SECONDS).plusNanos(ms.longValue());
}
diff --git a/src/test/java/net/ripe/rpki/rsyncit/rrdp/RrdpFetcherTest.java b/src/test/java/net/ripe/rpki/rsyncit/rrdp/RrdpFetcherTest.java
index dcdec39..9d54f4b 100644
--- a/src/test/java/net/ripe/rpki/rsyncit/rrdp/RrdpFetcherTest.java
+++ b/src/test/java/net/ripe/rpki/rsyncit/rrdp/RrdpFetcherTest.java
@@ -15,6 +15,7 @@
import java.time.Instant;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertThrows;
class RrdpFetcherTest {
@@ -43,8 +44,9 @@ public void testNormalFlow() throws NotificationStructureException, XPathExpress
@Test
public void testEmptyNotificationXml() {
- NotificationStructureException exception = assertThrows(NotificationStructureException.class, () -> tryFetch("", null));
- assertThat(exception.getMessage()).isEqualTo("Empty notification file.");
+ assertThatThrownBy(() -> tryFetch("", null))
+ .isInstanceOf(NotificationStructureException.class)
+ .hasMessage("Empty notification file.");
}
@Test
@@ -57,8 +59,9 @@ public void testNotificationXmlWithoutSnapshotTag() {
final String notificationXml = """
""";
- NotificationStructureException exception = assertThrows(NotificationStructureException.class, () -> tryFetch(notificationXml, null));
- assertThat(exception.getMessage()).isEqualTo("No snapshot tag in the notification file.");
+ assertThatThrownBy(() -> tryFetch(notificationXml, null))
+ .isInstanceOf(NotificationStructureException.class)
+ .hasMessage("No snapshot tag in the notification file.");
}
@Test
@@ -68,8 +71,9 @@ public void testNotificationXmlTwoSnapshotTags() {
""";
- NotificationStructureException exception = assertThrows(NotificationStructureException.class, () -> tryFetch(notificationXml, null));
- assertThat(exception.getMessage()).isEqualTo("More than one snapshot tag in the notification file.");
+ assertThatThrownBy(() -> tryFetch(notificationXml, null))
+ .isInstanceOf(NotificationStructureException.class)
+ .hasMessage("More than one snapshot tag in the notification file.");
}
@Test
@@ -87,9 +91,10 @@ public void testSnapshotWrongHash() throws NotificationStructureException, XPath
""";
- SnapshotStructureException exception = assertThrows(SnapshotStructureException.class, () -> tryFetch(notificationXml, snapshotXml));
- assertThat(exception.getMessage()).isEqualTo(
- "Structure of snapshot at https://rrdp.paas.rpki.ripe.net/1c33ba5d-4e16-448d-9a22-b12599ef1cba/29861/5d1d7670842dd277/snapshot.xml " +
+ assertThatThrownBy(() -> tryFetch(notificationXml, snapshotXml))
+ .isInstanceOf(SnapshotStructureException.class)
+ .hasMessage(
+ "Structure of snapshot at https://rrdp.paas.rpki.ripe.net/1c33ba5d-4e16-448d-9a22-b12599ef1cba/29861/5d1d7670842dd277/snapshot.xml " +
"did not match expected structure: with len(content) = 400 had " +
"sha256(content) = 25ffe0eb76860c269e6abdd16ec4eb991008e66de32173b6d3411ab3f6dcf058, " +
"expected 770c21936e8129499d4f08698b0f08eadf3610a6624004a179e216d568ac04f5");
@@ -102,8 +107,9 @@ public void testEmptySnapshot() {
""";
- SnapshotStructureException exception = assertThrows(SnapshotStructureException.class, () -> tryFetch(notificationXml, ""));
- assertThat(exception.getMessage()).isEqualTo("Structure of snapshot at https:/host/snapshot.xml did not match expected structure: Empty snapshot");
+ assertThatThrownBy(() -> tryFetch(notificationXml, ""))
+ .isInstanceOf(SnapshotStructureException.class)
+ .hasMessage("Structure of snapshot at https:/host/snapshot.xml did not match expected structure: Empty snapshot");
}
@Test
@@ -120,7 +126,7 @@ public void testBrokenSnapshot() {
""", Sha256.asString(snapshotXml));
- SAXParseException exception = assertThrows(SAXParseException.class, () -> tryFetch(notificationXml, snapshotXml));
+ assertThrows(SAXParseException.class, () -> tryFetch(notificationXml, snapshotXml));
}
private RrdpFetcher.FetchResult tryFetch(String notificationXml, String snapshotXml) throws NotificationStructureException, XPathExpressionException, IOException, ParserConfigurationException, SAXException {
@@ -128,5 +134,4 @@ private RrdpFetcher.FetchResult tryFetch(String notificationXml, String snapshot
return fetcher.processNotificationXml(notificationXml.getBytes(StandardCharsets.UTF_8),
url -> new RrdpFetcher.Downloaded(snapshotXml.getBytes(StandardCharsets.UTF_8), Instant.now()));
}
-
}
\ No newline at end of file