Remove @author tags
[Sone.git] / src / test / java / net / pterodactylus / sone / core / SoneModificationDetectorTest.java
index e85beb0..1fd52c8 100644 (file)
@@ -8,71 +8,132 @@ 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;
 
 /**
  * Unit test for {@link SoneModificationDetector}.
- *
- * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
 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 +141,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));
+       }
+
 }