Add test for “add context” job.
[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                 modifySone("");
36         }
37
38         private void modifySone(String uniqueValue) {
39                 when(sone.getFingerprint()).thenReturn("modified" + uniqueValue);
40         }
41
42         private void passTime(int seconds) {
43                 when(ticker.read()).thenReturn(SECONDS.toNanos(seconds));
44         }
45
46         private void lockSone() {
47                 when(core.isLocked(sone)).thenReturn(true);
48         }
49
50         private void unlockSone() {
51                 when(core.isLocked(sone)).thenReturn(false);
52         }
53
54         @Test
55         public void sonesStartOutAsNotEligible() {
56                 assertThat(soneModificationDetector.isModified(), is(false));
57                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
58         }
59
60         @Test
61         public void modifiedSoneIsEligibleAfter60Seconds() {
62                 modifySone();
63                 assertThat(soneModificationDetector.isModified(), is(true));
64                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
65                 passTime(100);
66                 assertThat(soneModificationDetector.isModified(), is(true));
67                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
68         }
69
70         @Test
71         public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() {
72                 modifySone();
73                 assertThat(soneModificationDetector.isModified(), is(true));
74                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
75                 passTime(30);
76                 modifySone("2");
77                 assertThat(soneModificationDetector.isModified(), is(true));
78                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
79                 passTime(61);
80                 assertThat(soneModificationDetector.isModified(), is(true));
81                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
82                 passTime(91);
83                 assertThat(soneModificationDetector.isModified(), is(true));
84                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
85         }
86
87         @Test
88         public void modifiedSoneIsNotEligibleAfter30Seconds() {
89                 modifySone();
90                 passTime(30);
91                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
92         }
93
94         @Test
95         public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
96                 lockSone();
97                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
98                 modifySone();
99                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
100                 passTime(100);
101                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
102         }
103
104         @Test
105         public void lockingAndUnlockingASoneRestartsTheWaitPeriod() {
106                 modifySone();
107                 lockSone();
108                 passTime(30);
109                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
110                 unlockSone();
111                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
112                 passTime(60);
113                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
114                 passTime(90);
115                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
116         }
117
118         @Test
119         public void settingFingerprintWillResetTheEligibility() {
120                 modifySone();
121                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
122                 passTime(100);
123                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
124                 soneModificationDetector.setFingerprint("modified");
125                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
126         }
127
128         @Test
129         public void changingInsertionDelayWillInfluenceEligibility() {
130                 modifySone();
131                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
132                 passTime(100);
133                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
134                 insertionDelay.set(120);
135                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
136         }
137
138 }