1 package net.pterodactylus.sone.core;
3 import static org.hamcrest.MatcherAssert.assertThat;
4 import static org.hamcrest.Matchers.is;
5 import static org.mockito.ArgumentMatchers.any;
6 import static org.mockito.ArgumentMatchers.eq;
7 import static org.mockito.Mockito.doAnswer;
8 import static org.mockito.Mockito.mock;
9 import static org.mockito.Mockito.never;
10 import static org.mockito.Mockito.verify;
11 import static org.mockito.Mockito.when;
13 import net.pterodactylus.sone.data.Sone;
15 import freenet.keys.FreenetURI;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.mockito.invocation.InvocationOnMock;
20 import org.mockito.stubbing.Answer;
23 * Unit test for {@link SoneRescuer}.
25 public class SoneRescuerTest {
27 private static final long CURRENT_EDITION = 12L;
28 private static final long SOME_OTHER_EDITION = 15L;
29 private final Core core = mock(Core.class);
30 private final SoneDownloader soneDownloader = mock(SoneDownloader.class);
31 private final Sone sone = mock(Sone.class);
32 private SoneRescuer soneRescuer;
35 public void setupSone() {
36 FreenetURI soneUri = mock(FreenetURI.class);
37 when(soneUri.getEdition()).thenReturn(CURRENT_EDITION);
38 when(sone.getRequestUri()).thenReturn(soneUri);
42 public void setupSoneRescuer() {
43 soneRescuer = new SoneRescuer(core, soneDownloader, sone);
47 public void newSoneRescuerIsNotFetchingAnything() {
48 assertThat(soneRescuer.isFetching(), is(false));
52 public void newSoneRescuerStartsAtCurrentEditionOfSone() {
53 assertThat(soneRescuer.getCurrentEdition(), is(CURRENT_EDITION));
57 public void newSoneRescuerHasANextEditionToGet() {
58 assertThat(soneRescuer.hasNextEdition(), is(true));
62 public void soneRescuerDoesNotHaveANextEditionIfCurrentEditionIsZero() {
63 when(sone.getRequestUri().getEdition()).thenReturn(0L);
64 soneRescuer = new SoneRescuer(core, soneDownloader, sone);
65 assertThat(soneRescuer.hasNextEdition(), is(false));
69 public void nextEditionIsOneSmallerThanTheCurrentEdition() {
70 assertThat(soneRescuer.getNextEdition(), is(CURRENT_EDITION - 1));
74 public void currentEditionCanBeSet() {
75 soneRescuer.setEdition(SOME_OTHER_EDITION);
76 assertThat(soneRescuer.getCurrentEdition(), is(SOME_OTHER_EDITION));
80 public void lastFetchOfANewSoneRescuerWasSuccessful() {
81 assertThat(soneRescuer.isLastFetchSuccessful(), is(true));
85 public void mainLoopStopsWhenItShould() {
87 soneRescuer.serviceRun();
91 public void successfulInsert() {
92 final Sone fetchedSone = mock(Sone.class);
93 returnUriOnInsert(fetchedSone);
94 soneRescuer.startNextFetch();
95 soneRescuer.serviceRun();
96 verify(core).lockSone(eq(sone));
97 verify(core).updateSone(eq(fetchedSone), eq(true));
98 assertThat(soneRescuer.isLastFetchSuccessful(), is(true));
99 assertThat(soneRescuer.isFetching(), is(false));
103 public void nonSuccessfulInsertIsRecognized() {
104 returnUriOnInsert(null);
105 soneRescuer.startNextFetch();
106 soneRescuer.serviceRun();
107 verify(core).lockSone(eq(sone));
108 verify(core, never()).updateSone(any(Sone.class), eq(true));
109 assertThat(soneRescuer.isLastFetchSuccessful(), is(false));
110 assertThat(soneRescuer.isFetching(), is(false));
113 private void returnUriOnInsert(final Sone fetchedSone) {
114 FreenetURI keyWithMetaStrings = setupFreenetUri();
115 doAnswer(new Answer<Sone>() {
117 public Sone answer(InvocationOnMock invocation) throws Throwable {
121 }).when(soneDownloader).fetchSone(eq(sone), eq(keyWithMetaStrings), eq(true));
124 private FreenetURI setupFreenetUri() {
125 FreenetURI sskKey = mock(FreenetURI.class);
126 FreenetURI keyWithDocName = mock(FreenetURI.class);
127 FreenetURI keyWithMetaStrings = mock(FreenetURI.class);
128 when(keyWithDocName.setMetaString(eq(new String[] { "sone.xml" }))).thenReturn(keyWithMetaStrings);
129 when(sskKey.setDocName(eq("Sone-" + CURRENT_EDITION))).thenReturn(keyWithDocName);
130 when(sone.getRequestUri().setKeyType(eq("SSK"))).thenReturn(sskKey);
131 return keyWithMetaStrings;