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;
13 import com.google.common.base.Ticker;
14 import org.junit.Before;
15 import org.junit.Test;
18 * Unit test for {@link SoneModificationDetector}.
20 public class SoneModificationDetectorTest {
22 private final Ticker ticker = mock(Ticker.class);
23 private final AtomicInteger insertionDelay = new AtomicInteger(60);
24 private final SoneModificationDetector soneModificationDetector;
25 private final LockableFingerprintProvider lockableFingerprintProvider = mock(LockableFingerprintProvider.class);
27 public SoneModificationDetectorTest() {
28 when(lockableFingerprintProvider.getFingerprint()).thenReturn("original");
29 when(lockableFingerprintProvider.isLocked()).thenReturn(false);
30 soneModificationDetector = new SoneModificationDetector(ticker, lockableFingerprintProvider, insertionDelay);
33 private void modifySone() {
37 private void modifySone(String uniqueValue) {
38 when(lockableFingerprintProvider.getFingerprint()).thenReturn("modified" + uniqueValue);
41 private void passTime(int seconds) {
42 when(ticker.read()).thenReturn(SECONDS.toNanos(seconds));
45 private void lockSone() {
46 when(lockableFingerprintProvider.isLocked()).thenReturn(true);
49 private void unlockSone() {
50 when(lockableFingerprintProvider.isLocked()).thenReturn(false);
54 public void setupOriginalFingerprint() {
55 soneModificationDetector.setFingerprint("original");
59 public void normalConstructorCanBeCalled() {
60 new SoneModificationDetector(lockableFingerprintProvider, insertionDelay);
64 public void sonesStartOutAsNotEligible() {
65 assertThat(soneModificationDetector.isModified(), is(false));
66 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
70 public void originalFingerprintIsRetained() {
71 assertThat(soneModificationDetector.getLastInsertFingerprint(), is("original"));
75 public void modifiedSoneIsEligibleAfter60Seconds() {
77 assertThat(soneModificationDetector.isModified(), is(true));
78 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
80 assertThat(soneModificationDetector.isModified(), is(true));
81 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
85 public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() {
87 assertThat(soneModificationDetector.isModified(), is(true));
88 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
91 assertThat(soneModificationDetector.isModified(), is(true));
92 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(true));
102 public void modifiedSoneIsNotEligibleAfter30Seconds() {
105 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
109 public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
111 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
113 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
115 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
119 public void lockingAndUnlockingASoneRestartsTheWaitPeriod() {
123 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
125 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
127 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
129 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
133 public void settingFingerprintWillResetTheEligibility() {
135 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
137 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
138 soneModificationDetector.setFingerprint("modified");
139 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
143 public void changingInsertionDelayWillInfluenceEligibility() {
145 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
147 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
148 insertionDelay.set(120);
149 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
153 public void soneWithoutOriginalFingerprintIsNotEligibleAfter59Seconds() {
154 SoneModificationDetector soneModificationDetector = createDetectorWithoutOriginalFingerprint();
155 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
157 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
160 private SoneModificationDetector createDetectorWithoutOriginalFingerprint() {
161 return new SoneModificationDetector(ticker, new LockableFingerprintProvider() {
163 public boolean isLocked() {
168 public String getFingerprint() {
175 public void soneWithoutOriginalFingerprintIsEligibleAfter60Seconds() {
176 SoneModificationDetector soneModificationDetector = createDetectorWithoutOriginalFingerprint();
177 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
179 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));