Add own test for starting state.
[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                 when(sone.getFingerprint()).thenReturn("modified");
36         }
37
38         private void passTime(int seconds) {
39                 when(ticker.read()).thenReturn(SECONDS.toNanos(seconds));
40         }
41
42         private void lockSone() {
43                 when(core.isLocked(sone)).thenReturn(true);
44         }
45
46         @Test
47         public void sonesStartOutAsNotEligible() {
48                 assertThat(soneModificationDetector.isModified(), is(false));
49                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
50         }
51
52         @Test
53         public void modifiedSoneIsEligibleAfter60Seconds() {
54                 modifySone();
55                 assertThat(soneModificationDetector.isModified(), is(true));
56                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
57                 passTime(100);
58                 assertThat(soneModificationDetector.isModified(), is(true));
59                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
60         }
61
62         @Test
63         public void modifiedSoneIsNotEligibleAfter30Seconds() {
64                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
65                 modifySone();
66                 passTime(30);
67                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
68         }
69
70         @Test
71         public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
72                 lockSone();
73                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
74                 modifySone();
75                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
76                 passTime(100);
77                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
78         }
79
80         @Test
81         public void settingFingerprintWillResetTheEligibility() {
82                 modifySone();
83                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
84                 passTime(100);
85                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
86                 soneModificationDetector.setFingerprint("modified");
87                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
88         }
89
90         @Test
91         public void changingInsertionDelayWillInfluenceEligibility() {
92                 modifySone();
93                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
94                 passTime(100);
95                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
96                 insertionDelay.set(120);
97                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
98         }
99
100 }