Remove @author tags
[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.core.SoneModificationDetector.LockableFingerprintProvider;
12
13 import com.google.common.base.Ticker;
14 import org.junit.Before;
15 import org.junit.Test;
16
17 /**
18  * Unit test for {@link SoneModificationDetector}.
19  */
20 public class SoneModificationDetectorTest {
21
22         private final Ticker ticker = mock(Ticker.class);
23         private final AtomicInteger insertionDelay = new AtomicInteger(60);
24         private final SoneModificationDetector soneModificationDetector;
25         private final LockableFingerprintProvider lockableFingerprintProvider = mock(LockableFingerprintProvider.class);
26
27         public SoneModificationDetectorTest() {
28                 when(lockableFingerprintProvider.getFingerprint()).thenReturn("original");
29                 when(lockableFingerprintProvider.isLocked()).thenReturn(false);
30                 soneModificationDetector = new SoneModificationDetector(ticker, lockableFingerprintProvider, insertionDelay);
31         }
32
33         private void modifySone() {
34                 modifySone("");
35         }
36
37         private void modifySone(String uniqueValue) {
38                 when(lockableFingerprintProvider.getFingerprint()).thenReturn("modified" + uniqueValue);
39         }
40
41         private void passTime(int seconds) {
42                 when(ticker.read()).thenReturn(SECONDS.toNanos(seconds));
43         }
44
45         private void lockSone() {
46                 when(lockableFingerprintProvider.isLocked()).thenReturn(true);
47         }
48
49         private void unlockSone() {
50                 when(lockableFingerprintProvider.isLocked()).thenReturn(false);
51         }
52
53         @Before
54         public void setupOriginalFingerprint() {
55             soneModificationDetector.setFingerprint("original");
56         }
57
58         @Test
59         public void normalConstructorCanBeCalled() {
60                 new SoneModificationDetector(lockableFingerprintProvider, insertionDelay);
61         }
62
63         @Test
64         public void sonesStartOutAsNotEligible() {
65                 assertThat(soneModificationDetector.isModified(), is(false));
66                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
67         }
68
69         @Test
70         public void originalFingerprintIsRetained() {
71                 assertThat(soneModificationDetector.getLastInsertFingerprint(), is("original"));
72         }
73
74         @Test
75         public void modifiedSoneIsEligibleAfter60Seconds() {
76                 modifySone();
77                 assertThat(soneModificationDetector.isModified(), is(true));
78                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
79                 passTime(100);
80                 assertThat(soneModificationDetector.isModified(), is(true));
81                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
82         }
83
84         @Test
85         public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() {
86                 modifySone();
87                 assertThat(soneModificationDetector.isModified(), is(true));
88                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
89                 passTime(30);
90                 modifySone("2");
91                 assertThat(soneModificationDetector.isModified(), is(true));
92                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
93                 passTime(61);
94                 assertThat(soneModificationDetector.isModified(), is(true));
95                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
96                 passTime(91);
97                 assertThat(soneModificationDetector.isModified(), is(true));
98                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
99         }
100
101         @Test
102         public void modifiedSoneIsNotEligibleAfter30Seconds() {
103                 modifySone();
104                 passTime(30);
105                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
106         }
107
108         @Test
109         public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
110                 lockSone();
111                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
112                 modifySone();
113                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
114                 passTime(100);
115                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
116         }
117
118         @Test
119         public void lockingAndUnlockingASoneRestartsTheWaitPeriod() {
120                 modifySone();
121                 lockSone();
122                 passTime(30);
123                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
124                 unlockSone();
125                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
126                 passTime(60);
127                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
128                 passTime(90);
129                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
130         }
131
132         @Test
133         public void settingFingerprintWillResetTheEligibility() {
134                 modifySone();
135                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
136                 passTime(100);
137                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
138                 soneModificationDetector.setFingerprint("modified");
139                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
140         }
141
142         @Test
143         public void changingInsertionDelayWillInfluenceEligibility() {
144                 modifySone();
145                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
146                 passTime(100);
147                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
148                 insertionDelay.set(120);
149                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
150         }
151
152         @Test
153         public void soneWithoutOriginalFingerprintIsNotEligibleAfter59Seconds() {
154                 SoneModificationDetector soneModificationDetector = createDetectorWithoutOriginalFingerprint();
155                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
156                 passTime(59);
157                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
158         }
159
160         private SoneModificationDetector createDetectorWithoutOriginalFingerprint() {
161                 return new SoneModificationDetector(ticker, new LockableFingerprintProvider() {
162                         @Override
163                         public boolean isLocked() {
164                                 return false;
165                         }
166
167                         @Override
168                         public String getFingerprint() {
169                                 return "changed";
170                         }
171                 }, insertionDelay);
172         }
173
174         @Test
175         public void soneWithoutOriginalFingerprintIsEligibleAfter60Seconds() {
176                 SoneModificationDetector soneModificationDetector = createDetectorWithoutOriginalFingerprint();
177                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
178                 passTime(60);
179                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
180         }
181
182 }