90f2935dda7bfe60177e5f471053b49386d82bb0
[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 modifiedSoneIsEligibleAfter60Seconds() {
48                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
49                 modifySone();
50                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
51                 passTime(100);
52                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
53         }
54
55         @Test
56         public void modifiedSoneIsNotEligibleAfter30Seconds() {
57                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
58                 modifySone();
59                 passTime(30);
60                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
61         }
62
63         @Test
64         public void lockedAndModifiedSoneIsNotEligibleAfter60Seconds() {
65                 lockSone();
66                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
67                 modifySone();
68                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
69                 passTime(100);
70                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
71         }
72
73         @Test
74         public void settingFingerprintWillResetTheEligibility() {
75                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
76                 modifySone();
77                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
78                 passTime(100);
79                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
80                 soneModificationDetector.setFingerprint("modified");
81                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
82         }
83
84         @Test
85         public void changingInsertionDelayWillInfluenceEligibility() {
86                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
87                 modifySone();
88                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
89                 passTime(100);
90                 assertThat(soneModificationDetector.isEligibleForInsert(), is(true));
91                 insertionDelay.set(120);
92                 assertThat(soneModificationDetector.isEligibleForInsert(), is(false));
93         }
94
95 }