Don’t store a Sone in the Sone inserter.
[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 import net.pterodactylus.sone.data.Sone;
13
14 import com.google.common.base.Ticker;
15 import org.junit.Test;
16
17 /**
18  * Unit test for {@link SoneModificationDetector}.
19  *
20  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
21  */
22 public class SoneModificationDetectorTest {
23
24         private final Ticker ticker = mock(Ticker.class);
25         private final AtomicInteger insertionDelay = new AtomicInteger(60);
26         private final SoneModificationDetector soneModificationDetector;
27         private final LockableFingerprintProvider lockableFingerprintProvider = mock(LockableFingerprintProvider.class);
28
29         public SoneModificationDetectorTest() {
30                 when(lockableFingerprintProvider.getFingerprint()).thenReturn("original");
31                 when(lockableFingerprintProvider.isLocked()).thenReturn(false);
32                 soneModificationDetector = new SoneModificationDetector(ticker, lockableFingerprintProvider, insertionDelay);
33         }
34
35         private void modifySone() {
36                 modifySone("");
37         }
38
39         private void modifySone(String uniqueValue) {
40                 when(lockableFingerprintProvider.getFingerprint()).thenReturn("modified" + uniqueValue);
41         }
42
43         private void passTime(int seconds) {
44                 when(ticker.read()).thenReturn(SECONDS.toNanos(seconds));
45         }
46
47         private void lockSone() {
48                 when(lockableFingerprintProvider.isLocked()).thenReturn(true);
49         }
50
51         private void unlockSone() {
52                 when(lockableFingerprintProvider.isLocked()).thenReturn(false);
53         }
54
55         @Test
56         public void normalConstructorCanBeCalled() {
57                 new SoneModificationDetector(lockableFingerprintProvider, insertionDelay);
58         }
59
60         @Test
61         public void sonesStartOutAsNotEligible() {
62                 assertThat(soneModificationDetector.isModified(), is(false));
63                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
64         }
65
66         @Test
67         public void originalFingerprintIsRetained() {
68                 assertThat(soneModificationDetector.getOriginalFingerprint(), is("original"));
69         }
70
71         @Test
72         public void modifiedSoneIsEligibleAfter60Seconds() {
73                 modifySone();
74                 assertThat(soneModificationDetector.isModified(), is(true));
75                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
76                 passTime(100);
77                 assertThat(soneModificationDetector.isModified(), is(true));
78                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
79         }
80
81         @Test
82         public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() {
83                 modifySone();
84                 assertThat(soneModificationDetector.isModified(), is(true));
85                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
86                 passTime(30);
87                 modifySone("2");
88                 assertThat(soneModificationDetector.isModified(), is(true));
89                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
90                 passTime(61);
91                 assertThat(soneModificationDetector.isModified(), is(true));
92                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
93                 passTime(91);
94                 assertThat(soneModificationDetector.isModified(), is(true));
95                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
96         }
97
98         @Test
99         public void modifiedSoneIsNotEligibleAfter30Seconds() {
100                 modifySone();
101                 passTime(30);
102                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
103         }
104
105         @Test
106         public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
107                 lockSone();
108                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
109                 modifySone();
110                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
111                 passTime(100);
112                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
113         }
114
115         @Test
116         public void lockingAndUnlockingASoneRestartsTheWaitPeriod() {
117                 modifySone();
118                 lockSone();
119                 passTime(30);
120                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
121                 unlockSone();
122                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
123                 passTime(60);
124                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
125                 passTime(90);
126                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
127         }
128
129         @Test
130         public void settingFingerprintWillResetTheEligibility() {
131                 modifySone();
132                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
133                 passTime(100);
134                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
135                 soneModificationDetector.setFingerprint("modified");
136                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
137         }
138
139         @Test
140         public void changingInsertionDelayWillInfluenceEligibility() {
141                 modifySone();
142                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
143                 passTime(100);
144                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
145                 insertionDelay.set(120);
146                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
147         }
148
149 }