Increse test coverage.
[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 normalConstructorCanBeCalled() {
56                 new SoneModificationDetector(core, sone, insertionDelay);
57         }
58
59         @Test
60         public void sonesStartOutAsNotEligible() {
61                 assertThat(soneModificationDetector.isModified(), is(false));
62                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
63         }
64
65         @Test
66         public void originalFingerprintIsRetained() {
67                 assertThat(soneModificationDetector.getOriginalFingerprint(), is("original"));
68         }
69
70         @Test
71         public void modifiedSoneIsEligibleAfter60Seconds() {
72                 modifySone();
73                 assertThat(soneModificationDetector.isModified(), is(true));
74                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
75                 passTime(100);
76                 assertThat(soneModificationDetector.isModified(), is(true));
77                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
78         }
79
80         @Test
81         public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() {
82                 modifySone();
83                 assertThat(soneModificationDetector.isModified(), is(true));
84                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
85                 passTime(30);
86                 modifySone("2");
87                 assertThat(soneModificationDetector.isModified(), is(true));
88                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
89                 passTime(61);
90                 assertThat(soneModificationDetector.isModified(), is(true));
91                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
92                 passTime(91);
93                 assertThat(soneModificationDetector.isModified(), is(true));
94                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
95         }
96
97         @Test
98         public void modifiedSoneIsNotEligibleAfter30Seconds() {
99                 modifySone();
100                 passTime(30);
101                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
102         }
103
104         @Test
105         public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
106                 lockSone();
107                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
108                 modifySone();
109                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
110                 passTime(100);
111                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
112         }
113
114         @Test
115         public void lockingAndUnlockingASoneRestartsTheWaitPeriod() {
116                 modifySone();
117                 lockSone();
118                 passTime(30);
119                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
120                 unlockSone();
121                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
122                 passTime(60);
123                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
124                 passTime(90);
125                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
126         }
127
128         @Test
129         public void settingFingerprintWillResetTheEligibility() {
130                 modifySone();
131                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
132                 passTime(100);
133                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
134                 soneModificationDetector.setFingerprint("modified");
135                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
136         }
137
138         @Test
139         public void changingInsertionDelayWillInfluenceEligibility() {
140                 modifySone();
141                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
142                 passTime(100);
143                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
144                 insertionDelay.set(120);
145                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
146         }
147
148 }