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 {
24 public void modifiedSoneIsEligibleAfter60Seconds() {
25 Ticker ticker = mock(Ticker.class);
26 Sone sone = mock(Sone.class);
27 when(sone.getFingerprint()).thenReturn("original");
28 Core core = mock(Core.class);
29 SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, new AtomicInteger(60));
30 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
31 when(sone.getFingerprint()).thenReturn("modified");
32 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
33 when(ticker.read()).thenReturn(SECONDS.toNanos(100));
34 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
38 public void modifiedSoneIsNotEligibleAfter30Seconds() {
39 Ticker ticker = mock(Ticker.class);
40 Sone sone = mock(Sone.class);
41 when(sone.getFingerprint()).thenReturn("original");
42 Core core = mock(Core.class);
43 SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, new AtomicInteger(60));
44 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
45 when(sone.getFingerprint()).thenReturn("modified");
46 when(ticker.read()).thenReturn(SECONDS.toNanos(30));
47 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
51 public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
52 Ticker ticker = mock(Ticker.class);
53 Sone sone = mock(Sone.class);
54 when(sone.getFingerprint()).thenReturn("original");
55 Core core = mock(Core.class);
56 when(core.isLocked(sone)).thenReturn(true);
57 SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, new AtomicInteger(60));
58 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
59 when(sone.getFingerprint()).thenReturn("modified");
60 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
61 when(ticker.read()).thenReturn(SECONDS.toNanos(100));
62 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
66 public void settingFingerprintWillResetTheEligibility() {
67 Ticker ticker = mock(Ticker.class);
68 Sone sone = mock(Sone.class);
69 when(sone.getFingerprint()).thenReturn("original");
70 Core core = mock(Core.class);
71 SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, new AtomicInteger(60));
72 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
73 when(sone.getFingerprint()).thenReturn("modified");
74 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
75 when(ticker.read()).thenReturn(SECONDS.toNanos(100));
76 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
77 soneModificationDetector.setFingerprint("modified");
78 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
82 public void changingInsertionDelayWillInfluenceEligibility() {
83 Ticker ticker = mock(Ticker.class);
84 Sone sone = mock(Sone.class);
85 when(sone.getFingerprint()).thenReturn("original");
86 Core core = mock(Core.class);
87 AtomicInteger insertionDelay = new AtomicInteger(60);
88 SoneModificationDetector soneModificationDetector = new SoneModificationDetector(ticker, core, sone, insertionDelay);
89 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
90 when(sone.getFingerprint()).thenReturn("modified");
91 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
92 when(ticker.read()).thenReturn(SECONDS.toNanos(100));
93 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
94 insertionDelay.set(120);
95 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));