Add Sone modification detector.
[Sone.git] / src / test / java / net / pterodactylus / sone / core / SoneModificationDetectorTest.java
1 package net.pterodactylus.sone.core;
2
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;
8
9 import java.util.concurrent.atomic.AtomicInteger;
10
11 import net.pterodactylus.sone.data.Sone;
12
13 import com.google.common.base.Ticker;
14 import org.junit.Test;
15
16 /**
17  * Unit test for {@link SoneModificationDetector}.
18  *
19  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
20  */
21 public class SoneModificationDetectorTest {
22
23         @Test
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));
35         }
36
37         @Test
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));
48         }
49
50         @Test
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));
63         }
64
65         @Test
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));
79         }
80
81         @Test
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));
96         }
97
98 }