388319bfa6fe628b21826c30bf563b7ef983158d
[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         @Test
51         public void sonesStartOutAsNotEligible() {
52                 assertThat(soneModificationDetector.isModified(), is(false));
53                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
54         }
55
56         @Test
57         public void modifiedSoneIsEligibleAfter60Seconds() {
58                 modifySone();
59                 assertThat(soneModificationDetector.isModified(), is(true));
60                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
61                 passTime(100);
62                 assertThat(soneModificationDetector.isModified(), is(true));
63                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
64         }
65
66         @Test
67         public void modifiedAndRemodifiedSoneIsEligibleAfter90Seconds() {
68                 modifySone();
69                 assertThat(soneModificationDetector.isModified(), is(true));
70                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
71                 passTime(30);
72                 modifySone("2");
73                 assertThat(soneModificationDetector.isModified(), is(true));
74                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
75                 passTime(61);
76                 assertThat(soneModificationDetector.isModified(), is(true));
77                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
78                 passTime(91);
79                 assertThat(soneModificationDetector.isModified(), is(true));
80                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
81         }
82
83         @Test
84         public void modifiedSoneIsNotEligibleAfter30Seconds() {
85                 modifySone();
86                 passTime(30);
87                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
88         }
89
90         @Test
91         public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
92                 lockSone();
93                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
94                 modifySone();
95                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
96                 passTime(100);
97                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
98         }
99
100         @Test
101         public void settingFingerprintWillResetTheEligibility() {
102                 modifySone();
103                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
104                 passTime(100);
105                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
106                 soneModificationDetector.setFingerprint("modified");
107                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
108         }
109
110         @Test
111         public void changingInsertionDelayWillInfluenceEligibility() {
112                 modifySone();
113                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
114                 passTime(100);
115                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
116                 insertionDelay.set(120);
117                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
118         }
119
120 }