1 package net.pterodactylus.sone.core;
3 import static java.util.concurrent.TimeUnit.SECONDS;
4 import static org.hamcrest.MatcherAssert.assertThat;
5 import static org.hamcrest.Matchers.is;
6 import static org.mockito.Mockito.mock;
7 import static org.mockito.Mockito.when;
9 import java.util.concurrent.atomic.AtomicInteger;
11 import net.pterodactylus.sone.core.SoneModificationDetector.LockableFingerprintProvider;
12 import net.pterodactylus.sone.data.Sone;
14 import com.google.common.base.Ticker;
15 import org.junit.Before;
16 import org.junit.Test;
19 * Unit test for {@link SoneModificationDetector}.
21 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
23 public class SoneModificationDetectorTest {
25 private final Ticker ticker = mock(Ticker.class);
26 private final AtomicInteger insertionDelay = new AtomicInteger(60);
27 private final SoneModificationDetector soneModificationDetector;
28 private final LockableFingerprintProvider lockableFingerprintProvider = mock(LockableFingerprintProvider.class);
30 public SoneModificationDetectorTest() {
31 when(lockableFingerprintProvider.getFingerprint()).thenReturn("original");
32 when(lockableFingerprintProvider.isLocked()).thenReturn(false);
33 soneModificationDetector = new SoneModificationDetector(ticker, lockableFingerprintProvider, insertionDelay);
36 private void modifySone() {
40 private void modifySone(String uniqueValue) {
41 when(lockableFingerprintProvider.getFingerprint()).thenReturn("modified" + uniqueValue);
44 private void passTime(int seconds) {
45 when(ticker.read()).thenReturn(SECONDS.toNanos(seconds));
48 private void lockSone() {
49 when(lockableFingerprintProvider.isLocked()).thenReturn(true);
52 private void unlockSone() {
53 when(lockableFingerprintProvider.isLocked()).thenReturn(false);
57 public void setupOriginalFingerprint() {
58 soneModificationDetector.setFingerprint("original");
62 public void normalConstructorCanBeCalled() {
63 new SoneModificationDetector(lockableFingerprintProvider, insertionDelay);
67 public void sonesStartOutAsNotEligible() {
68 assertThat(soneModificationDetector.isModified(), is(false));
69 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
73 public void originalFingerprintIsRetained() {
74 assertThat(soneModificationDetector.getOriginalFingerprint(), is("original"));
78 public void modifiedSoneIsEligibleAfter60Seconds() {
80 assertThat(soneModificationDetector.isModified(), is(true));
81 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
83 assertThat(soneModificationDetector.isModified(), is(true));
84 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
88 public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() {
90 assertThat(soneModificationDetector.isModified(), is(true));
91 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
94 assertThat(soneModificationDetector.isModified(), is(true));
95 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
97 assertThat(soneModificationDetector.isModified(), is(true));
98 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
100 assertThat(soneModificationDetector.isModified(), is(true));
101 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
105 public void modifiedSoneIsNotEligibleAfter30Seconds() {
108 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
112 public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
114 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
116 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
118 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
122 public void lockingAndUnlockingASoneRestartsTheWaitPeriod() {
126 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
128 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
130 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
132 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
136 public void settingFingerprintWillResetTheEligibility() {
138 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
140 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
141 soneModificationDetector.setFingerprint("modified");
142 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
146 public void changingInsertionDelayWillInfluenceEligibility() {
148 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
150 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
151 insertionDelay.set(120);
152 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));