X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FSoneModificationDetectorTest.java;h=a45556aa155b7b8bd1b46d1459c027d516f758d4;hb=8e313509a42a8c638fcac018dd73dd975bf9cb68;hp=e85beb022dd7506b8a87d23bde76254c4048e053;hpb=ffeaf092f0381cf21d378115f8b97188d6eecdc6;p=Sone.git diff --git a/src/test/java/net/pterodactylus/sone/core/SoneModificationDetectorTest.java b/src/test/java/net/pterodactylus/sone/core/SoneModificationDetectorTest.java index e85beb0..a45556a 100644 --- a/src/test/java/net/pterodactylus/sone/core/SoneModificationDetectorTest.java +++ b/src/test/java/net/pterodactylus/sone/core/SoneModificationDetectorTest.java @@ -8,9 +8,10 @@ import static org.mockito.Mockito.when; import java.util.concurrent.atomic.AtomicInteger; -import net.pterodactylus.sone.data.Sone; +import net.pterodactylus.sone.core.SoneModificationDetector.LockableFingerprintProvider; import com.google.common.base.Ticker; +import org.junit.Before; import org.junit.Test; /** @@ -20,59 +21,121 @@ import org.junit.Test; */ public class SoneModificationDetectorTest { + private final Ticker ticker = mock(Ticker.class); + private final AtomicInteger insertionDelay = new AtomicInteger(60); + private final SoneModificationDetector soneModificationDetector; + private final LockableFingerprintProvider lockableFingerprintProvider = mock(LockableFingerprintProvider.class); + + public SoneModificationDetectorTest() { + when(lockableFingerprintProvider.getFingerprint()).thenReturn("original"); + when(lockableFingerprintProvider.isLocked()).thenReturn(false); + soneModificationDetector = new SoneModificationDetector(ticker, lockableFingerprintProvider, insertionDelay); + } + + private void modifySone() { + modifySone(""); + } + + private void modifySone(String uniqueValue) { + when(lockableFingerprintProvider.getFingerprint()).thenReturn("modified" + uniqueValue); + } + + private void passTime(int seconds) { + when(ticker.read()).thenReturn(SECONDS.toNanos(seconds)); + } + + private void lockSone() { + when(lockableFingerprintProvider.isLocked()).thenReturn(true); + } + + private void unlockSone() { + when(lockableFingerprintProvider.isLocked()).thenReturn(false); + } + + @Before + public void setupOriginalFingerprint() { + soneModificationDetector.setFingerprint("original"); + } + + @Test + public void normalConstructorCanBeCalled() { + new SoneModificationDetector(lockableFingerprintProvider, insertionDelay); + } + + @Test + public void sonesStartOutAsNotEligible() { + assertThat(soneModificationDetector.isModified(), is(false)); + assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); + } + + @Test + public void originalFingerprintIsRetained() { + assertThat(soneModificationDetector.getLastInsertFingerprint(), is("original")); + } + @Test public void modifiedSoneIsEligibleAfter60Seconds() { - Ticker ticker = mock(Ticker.class); - Sone sone = mock(Sone.class); - when(sone.getFingerprint()).thenReturn("original"); - Core core = mock(Core.class); - SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, new AtomicInteger(60)); + modifySone(); + assertThat(soneModificationDetector.isModified(), is(true)); + assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); + passTime(100); + assertThat(soneModificationDetector.isModified(), is(true)); + assertThat(soneModificationDetector.isEligibleForInsert(), is(true)); + } + + @Test + public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() { + modifySone(); + assertThat(soneModificationDetector.isModified(), is(true)); + assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); + passTime(30); + modifySone("2"); + assertThat(soneModificationDetector.isModified(), is(true)); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(sone.getFingerprint()).thenReturn("modified"); + passTime(61); + assertThat(soneModificationDetector.isModified(), is(true)); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(ticker.read()).thenReturn(SECONDS.toNanos(100)); + passTime(91); + assertThat(soneModificationDetector.isModified(), is(true)); assertThat(soneModificationDetector.isEligibleForInsert(), is(true)); } @Test public void modifiedSoneIsNotEligibleAfter30Seconds() { - Ticker ticker = mock(Ticker.class); - Sone sone = mock(Sone.class); - when(sone.getFingerprint()).thenReturn("original"); - Core core = mock(Core.class); - SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, new AtomicInteger(60)); - assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(sone.getFingerprint()).thenReturn("modified"); - when(ticker.read()).thenReturn(SECONDS.toNanos(30)); + modifySone(); + passTime(30); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); } @Test public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() { - Ticker ticker = mock(Ticker.class); - Sone sone = mock(Sone.class); - when(sone.getFingerprint()).thenReturn("original"); - Core core = mock(Core.class); - when(core.isLocked(sone)).thenReturn(true); - SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, new AtomicInteger(60)); + lockSone(); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(sone.getFingerprint()).thenReturn("modified"); + modifySone(); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(ticker.read()).thenReturn(SECONDS.toNanos(100)); + passTime(100); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); } @Test - public void settingFingerprintWillResetTheEligibility() { - Ticker ticker = mock(Ticker.class); - Sone sone = mock(Sone.class); - when(sone.getFingerprint()).thenReturn("original"); - Core core = mock(Core.class); - SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, new AtomicInteger(60)); + public void lockingAndUnlockingASoneRestartsTheWaitPeriod() { + modifySone(); + lockSone(); + passTime(30); + assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); + unlockSone(); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(sone.getFingerprint()).thenReturn("modified"); + passTime(60); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(ticker.read()).thenReturn(SECONDS.toNanos(100)); + passTime(90); + assertThat(soneModificationDetector.isEligibleForInsert(), is(true)); + } + + @Test + public void settingFingerprintWillResetTheEligibility() { + modifySone(); + assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); + passTime(100); assertThat(soneModificationDetector.isEligibleForInsert(), is(true)); soneModificationDetector.setFingerprint("modified"); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); @@ -80,19 +143,42 @@ public class SoneModificationDetectorTest { @Test public void changingInsertionDelayWillInfluenceEligibility() { - Ticker ticker = mock(Ticker.class); - Sone sone = mock(Sone.class); - when(sone.getFingerprint()).thenReturn("original"); - Core core = mock(Core.class); - AtomicInteger insertionDelay = new AtomicInteger(60); - SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, insertionDelay); - assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(sone.getFingerprint()).thenReturn("modified"); + modifySone(); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); - when(ticker.read()).thenReturn(SECONDS.toNanos(100)); + passTime(100); assertThat(soneModificationDetector.isEligibleForInsert(), is(true)); insertionDelay.set(120); assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); } + @Test + public void soneWithoutOriginalFingerprintIsNotEligibleAfter59Seconds() { + SoneModificationDetector soneModificationDetector = createDetectorWithoutOriginalFingerprint(); + assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); + passTime(59); + assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); + } + + private SoneModificationDetector createDetectorWithoutOriginalFingerprint() { + return new SoneModificationDetector(ticker, new LockableFingerprintProvider() { + @Override + public boolean isLocked() { + return false; + } + + @Override + public String getFingerprint() { + return "changed"; + } + }, insertionDelay); + } + + @Test + public void soneWithoutOriginalFingerprintIsEligibleAfter60Seconds() { + SoneModificationDetector soneModificationDetector = createDetectorWithoutOriginalFingerprint(); + assertThat(soneModificationDetector.isEligibleForInsert(), is(false)); + passTime(60); + assertThat(soneModificationDetector.isEligibleForInsert(), is(true)); + } + }