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.data.Sone;
13 import com.google.common.base.Ticker;
14 import org.junit.Test;
17 * Unit test for {@link SoneModificationDetector}.
19 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
21 public class SoneModificationDetectorTest {
23 private final Ticker ticker = mock(Ticker.class);
24 private final Sone sone = mock(Sone.class);
25 private final Core core = mock(Core.class);
26 private final AtomicInteger insertionDelay = new AtomicInteger(60);
27 private final SoneModificationDetector soneModificationDetector;
29 public SoneModificationDetectorTest() {
30 when(sone.getFingerprint()).thenReturn("original");
31 soneModificationDetector = new SoneModificationDetector(ticker, core, sone, insertionDelay);
34 private void modifySone() {
38 private void modifySone(String uniqueValue) {
39 when(sone.getFingerprint()).thenReturn("modified" + uniqueValue);
42 private void passTime(int seconds) {
43 when(ticker.read()).thenReturn(SECONDS.toNanos(seconds));
46 private void lockSone() {
47 when(core.isLocked(sone)).thenReturn(true);
50 private void unlockSone() {
51 when(core.isLocked(sone)).thenReturn(false);
55 public void normalConstructorCanBeCalled() {
56 new SoneModificationDetector(core, sone, insertionDelay);
60 public void sonesStartOutAsNotEligible() {
61 assertThat(soneModificationDetector.isModified(), is(false));
62 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
66 public void originalFingerprintIsRetained() {
67 assertThat(soneModificationDetector.getOriginalFingerprint(), is("original"));
71 public void modifiedSoneIsEligibleAfter60Seconds() {
73 assertThat(soneModificationDetector.isModified(), is(true));
74 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
76 assertThat(soneModificationDetector.isModified(), is(true));
77 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
81 public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() {
83 assertThat(soneModificationDetector.isModified(), is(true));
84 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
87 assertThat(soneModificationDetector.isModified(), is(true));
88 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
90 assertThat(soneModificationDetector.isModified(), is(true));
91 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
93 assertThat(soneModificationDetector.isModified(), is(true));
94 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
98 public void modifiedSoneIsNotEligibleAfter30Seconds() {
101 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
105 public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
107 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
109 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
111 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
115 public void lockingAndUnlockingASoneRestartsTheWaitPeriod() {
119 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
121 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
123 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
125 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
129 public void settingFingerprintWillResetTheEligibility() {
131 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
133 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
134 soneModificationDetector.setFingerprint("modified");
135 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
139 public void changingInsertionDelayWillInfluenceEligibility() {
141 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
143 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
144 insertionDelay.set(120);
145 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));