package com.ldbc.driver.runtime.coordination;
import com.google.common.collect.Sets;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class GlobalCompletionTimeTest {
// LocalIT = none, LocalCT = none, ExternalCT = none --> null
@Test
public void shouldReturnNullWhenNoLocalITNoLocalCTNoExternalCT() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When
// no events have been initiated or completed
// Then
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
}
// LocalIT = some, LocalCT = none, ExternalCT = none --> null
@Test
public void shouldReturnNullWhenSomeITAndNoCTAndNoExternalCT() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When
globalCompletionTimeStateManager.submitLocalInitiatedTime(1000l);
// Then
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
}
// LocalIT = none, LocalCT = some, ExternalCT = none --> Exception
@Test
public void shouldThrowExceptionWhenNoLocalITAndSomeLocalCTAndNoExternalCT() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When
boolean exceptionThrown = false;
try {
globalCompletionTimeStateManager.submitLocalCompletedTime(1000l);
} catch (CompletionTimeException e) {
exceptionThrown = true;
}
// Then
// exception should have already been thrown
assertThat(exceptionThrown, is(true));
}
// LocalIT = none, LocalCT = none, ExternalCT = some --> null
@Test
public void shouldReturnNullWhenNoLocalITAndNoLocalCTAndSomeExternalCT() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 1000l);
// Then
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
}
// LocalIT = some, LocalCT = some, ExternalCT = none --> null
@Test
public void shouldReturnNullWhenSomeLocalITAndSomeLocalCTAndNoExternalCT() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When
globalCompletionTimeStateManager.submitLocalInitiatedTime(1000l);
globalCompletionTimeStateManager.submitLocalCompletedTime(1000l);
// Then
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
}
// LocalIT = 1, LocalCT = none, ExternalCT = 2 --> null
@Test
public void shouldReturnNullWhenSomeLocalITAndNoLocalCTAndSomeExternalCT() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When
globalCompletionTimeStateManager.submitLocalInitiatedTime(1000l);
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 2000l);
// Then
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
}
// LocalIT = 1, LocalCT = 1, ExternalCT = 2 --> 1
@Test
public void shouldReturnLCTWhenLowerLCTThanExternalCT() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When/Then
globalCompletionTimeStateManager.submitLocalInitiatedTime(1000l);
globalCompletionTimeStateManager.submitLocalCompletedTime(1000l);
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 2000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
globalCompletionTimeStateManager.submitLocalInitiatedTime(2000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
}
// LocalIT = 2, LocalCT = 2, ExternalCT = --> 1
@Test
public void shouldReturnExternalCTWhenLowerLCTThanExternalCT() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When/Then
globalCompletionTimeStateManager.submitLocalInitiatedTime(2000l);
globalCompletionTimeStateManager.submitLocalCompletedTime(2000l);
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 1000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
globalCompletionTimeStateManager.submitLocalInitiatedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
}
@Test
public void shouldReturnTimeOfEarliestITThatHasHadNoMatchingCTWhenNoPeers() throws CompletionTimeException {
// Given
Set<String> noPeers = new HashSet<>();
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(noPeers);
ExternalCompletionTimeReader externalCompletionTimeReader =
new LocalCompletionTimeReaderToExternalCompletionTimeReader(localCompletionTimeStateManager);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeReader,
externalCompletionTimeStateManager);
// When/Then
// initiated [1]
// completed []
// external (-)
globalCompletionTimeStateManager.submitLocalInitiatedTime(1000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
// initiated [1]
// completed [1]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(1000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
// initiated [1,2]
// completed [1]
// external (-)
globalCompletionTimeStateManager.submitLocalInitiatedTime(2000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
// initiated [1,2]
// completed [1,2]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(2000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
// initiated [1,2,3]
// completed [1,2]
// external (-)
globalCompletionTimeStateManager.submitLocalInitiatedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4]
// completed [1,2]
// external (-)
globalCompletionTimeStateManager.submitLocalInitiatedTime(4000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5]
// completed [1,2]
// external (-)
globalCompletionTimeStateManager.submitLocalInitiatedTime(5000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5]
// completed [1,2, , ,5]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(5000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5,6,7,8,9,10]
// completed [1,2, , ,5, , , , , ]
// external (-)
globalCompletionTimeStateManager.submitLocalInitiatedTime(6000l);
globalCompletionTimeStateManager.submitLocalInitiatedTime(7000l);
globalCompletionTimeStateManager.submitLocalInitiatedTime(8000l);
globalCompletionTimeStateManager.submitLocalInitiatedTime(9000l);
globalCompletionTimeStateManager.submitLocalInitiatedTime(10000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5,6,7,8,9,10]
// completed [1,2, , ,5, , ,8, , ]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(8000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5,6,7,8,9,10]
// completed [1,2, , ,5, ,7,8, , ]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(7000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5,6,7,8,9,10]
// completed [1,2, , ,5, ,7,8,9, ]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(9000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5,6,7,8,9,10]
// completed [1,2, ,4,5, ,7,8,9, ]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(4000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5,6,7,8,9,10]
// completed [1,2,3,4,5, ,7,8,9, ]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(5000l));
// initiated [1,2,3,4,5,6,7,8,9,10]
// completed [1,2,3,4,5,6,7,8,9, ]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(6000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(9000l));
// initiated [1,2,3,4,5,6,7,8,9,10]
// completed [1,2,3,4,5,6,7,8,9,10]
// external (-)
globalCompletionTimeStateManager.submitLocalCompletedTime(10000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(9000l));
// initiated [1,2,3,4,5,6,7,8,9,10,11]
// completed [1,2,3,4,5,6,7,8,9,10, ]
// external (-)
globalCompletionTimeStateManager.submitLocalInitiatedTime(11000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(10000l));
}
@Test
public void shouldReturnTimeOfEarliestITThatHasHadNoMatchingCTWhenNoPeersWithDuplicateTimes() throws CompletionTimeException {
// Given
Set<String> noPeers = new HashSet<>();
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(noPeers);
ExternalCompletionTimeReader externalCompletionTimeReader =
new LocalCompletionTimeReaderToExternalCompletionTimeReader(localCompletionTimeStateManager);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeReader,
externalCompletionTimeStateManager);
// When/Then
// initiated [1]
// completed [1]
globalCompletionTimeStateManager.submitLocalInitiatedTime(1000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
globalCompletionTimeStateManager.submitLocalCompletedTime(1000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
// initiated [1,2]
// completed [1,2]
globalCompletionTimeStateManager.submitLocalInitiatedTime(2000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
globalCompletionTimeStateManager.submitLocalCompletedTime(2000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
// initiated [1,2,3]
// completed [1,2, ]
globalCompletionTimeStateManager.submitLocalInitiatedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3]
// completed [1,2, , ]
globalCompletionTimeStateManager.submitLocalInitiatedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3,3]
// completed [1,2, , , ]
globalCompletionTimeStateManager.submitLocalInitiatedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3,3,4]
// completed [1,2, , , , ]
globalCompletionTimeStateManager.submitLocalInitiatedTime(4000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3,3,4,5]
// completed [1,2, , , , , ]
globalCompletionTimeStateManager.submitLocalInitiatedTime(5000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3,3,4,5,6]
// completed [1,2, , , , , , ]
globalCompletionTimeStateManager.submitLocalInitiatedTime(6000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3,3,4,5,6]
// completed [1,2, , , , ,5, ]
globalCompletionTimeStateManager.submitLocalCompletedTime(5000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3,3,4,5,6]
// completed [1,2, , ,3, ,5, ]
globalCompletionTimeStateManager.submitLocalCompletedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3,3,4,5,6]
// completed [1,2, ,3,3, ,5, ]
globalCompletionTimeStateManager.submitLocalCompletedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,3,3,4,5,6]
// completed [1,2,3,3,3, ,5, ]
globalCompletionTimeStateManager.submitLocalCompletedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(3000l));
// initiated [1,2,3,3,3,4,5,6]
// completed [1,2,3,3,3,4,5, ]
globalCompletionTimeStateManager.submitLocalCompletedTime(4000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(5000l));
// initiated [1,2,3,3,3,4,5,6]
// completed [1,2,3,3,3,4,5,6]
globalCompletionTimeStateManager.submitLocalCompletedTime(6000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(5000l));
}
@Test
public void shouldReturnTimeOfEarliestITThatHasHadNoMatchingCTWithDuplicateTimes() throws CompletionTimeException {
// Given
String otherPeerId = "otherPeer";
Set<String> peerIds = Sets.newHashSet(otherPeerId);
LocalCompletionTimeStateManager localCompletionTimeStateManager = new LocalCompletionTimeStateManager();
ExternalCompletionTimeStateManager externalCompletionTimeStateManager = new ExternalCompletionTimeStateManager(peerIds);
GlobalCompletionTimeStateManager globalCompletionTimeStateManager = new GlobalCompletionTimeStateManager(
localCompletionTimeStateManager,
localCompletionTimeStateManager,
externalCompletionTimeStateManager,
externalCompletionTimeStateManager);
// When/Then
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
// initiated [1]
// completed [1]
// external (-)
globalCompletionTimeStateManager.submitLocalInitiatedTime(1000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
globalCompletionTimeStateManager.submitLocalCompletedTime(1000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
// initiated [1]
// completed [1]
// external (1)
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 1000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
// initiated [1]
// completed [1]
// external (3)
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(-1l));
// initiated [1,2]
// completed [1]
// external (3)
globalCompletionTimeStateManager.submitLocalInitiatedTime(2000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
// initiated [1,2,3]
// completed [1]
// external (3)
globalCompletionTimeStateManager.submitLocalInitiatedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
// initiated [1,2,3,4]
// completed [1]
// external (3)
globalCompletionTimeStateManager.submitLocalInitiatedTime(4000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
// initiated [1,2,3,4]
// completed [1, , ,4]
// external (3)
globalCompletionTimeStateManager.submitLocalCompletedTime(4000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(1000l));
// initiated [1,2,3,4]
// completed [1,2, ,4]
// external (3)
globalCompletionTimeStateManager.submitLocalCompletedTime(2000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5]
// completed [1,2, ,4, ]
// external (3)
globalCompletionTimeStateManager.submitLocalInitiatedTime(5000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5]
// completed [1,2, ,4, ]
// external (4)
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 4000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(2000l));
// initiated [1,2,3,4,5]
// completed [1,2,3,4, ]
// external (4)
globalCompletionTimeStateManager.submitLocalCompletedTime(3000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(4000l));
// initiated [1,2,3,4,5]
// completed [1,2,3,4,5]
// external (4)
globalCompletionTimeStateManager.submitLocalCompletedTime(5000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(4000l));
// initiated [1,2,3,4,5]
// completed [1,2,3,4,5]
// external (5)
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 5000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(4000l));
// initiated [1,2,3,4,5,6]
// completed [1,2,3,4,5]
// external (5)
globalCompletionTimeStateManager.submitLocalInitiatedTime(6000l);
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(5000l));
// initiated [1,2,3,4,5,6]
// completed [1,2,3,4,5]
// external (4) <-- SHOULD NEVER DECREASE
boolean exceptionThrown = false;
try {
globalCompletionTimeStateManager.submitPeerCompletionTime(otherPeerId, 4000l);
} catch (CompletionTimeException e) {
exceptionThrown = true;
}
assertThat(exceptionThrown, is(true));
assertThat(globalCompletionTimeStateManager.globalCompletionTimeAsMilli(), is(5000l));
}
}