import java.util.concurrent.atomic.AtomicInteger;
+import net.pterodactylus.sone.core.SoneModificationDetector.LockableFingerprintProvider;
import net.pterodactylus.sone.data.Sone;
import com.google.common.base.Ticker;
+import org.junit.Before;
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.getOriginalFingerprint(), 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));
+ passTime(90);
+ assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
+ }
+
+ @Test
+ public void settingFingerprintWillResetTheEligibility() {
+ modifySone();
assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
- when(ticker.read()).thenReturn(SECONDS.toNanos(100));
+ passTime(100);
assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
soneModificationDetector.setFingerprint("modified");
assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
@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));