Move detection of modification into 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         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;
28
29         public SoneModificationDetectorTest() {
30                 when(sone.getFingerprint()).thenReturn("original");
31                 soneModificationDetector = new SoneModificationDetector(ticker, core, sone, insertionDelay);
32         }
33
34         private void modifySone() {
35                 when(sone.getFingerprint()).thenReturn("modified");
36         }
37
38         private void passTime(int seconds) {
39                 when(ticker.read()).thenReturn(SECONDS.toNanos(seconds));
40         }
41
42         private void lockSone() {
43                 when(core.isLocked(sone)).thenReturn(true);
44         }
45
46         @Test
47         public void modifiedSoneIsEligibleAfter60Seconds() {
48                 assertThat(soneModificationDetector.isModified(), is(false));
49                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
50                 modifySone();
51                 assertThat(soneModificationDetector.isModified(), is(true));
52                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
53                 passTime(100);
54                 assertThat(soneModificationDetector.isModified(), is(true));
55                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
56         }
57
58         @Test
59         public void modifiedSoneIsNotEligibleAfter30Seconds() {
60                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
61                 modifySone();
62                 passTime(30);
63                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
64         }
65
66         @Test
67         public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
68                 lockSone();
69                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
70                 modifySone();
71                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
72                 passTime(100);
73                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
74         }
75
76         @Test
77         public void settingFingerprintWillResetTheEligibility() {
78                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
79                 modifySone();
80                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
81                 passTime(100);
82                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
83                 soneModificationDetector.setFingerprint("modified");
84                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
85         }
86
87         @Test
88         public void changingInsertionDelayWillInfluenceEligibility() {
89                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
90                 modifySone();
91                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
92                 passTime(100);
93                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
94                 insertionDelay.set(120);
95                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
96         }
97
98 }