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