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.Matchers.any;
6 import static org.mockito.Matchers.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.LocalSone;
14 import net.pterodactylus.sone.data.Sone;
16 import freenet.keys.FreenetURI;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.mockito.invocation.InvocationOnMock;
21 import org.mockito.stubbing.Answer;
24 * Unit test for {@link SoneRescuer}.
26 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
28 public class SoneRescuerTest {
30 private static final long CURRENT_EDITION = 12L;
31 private static final long SOME_OTHER_EDITION = 15L;
32 private final Core core = mock(Core.class);
33 private final SoneDownloader soneDownloader = mock(SoneDownloader.class);
34 private final LocalSone sone = mock(LocalSone.class);
35 private SoneRescuer soneRescuer;
38 public void setupSone() {
39 FreenetURI soneUri = mock(FreenetURI.class);
40 when(soneUri.getEdition()).thenReturn(CURRENT_EDITION);
41 when(sone.getRequestUri()).thenReturn(soneUri);
45 public void setupSoneRescuer() {
46 soneRescuer = new SoneRescuer(core, soneDownloader, sone);
50 public void newSoneRescuerIsNotFetchingAnything() {
51 assertThat(soneRescuer.isFetching(), is(false));
55 public void newSoneRescuerStartsAtCurrentEditionOfSone() {
56 assertThat(soneRescuer.getCurrentEdition(), is(CURRENT_EDITION));
60 public void newSoneRescuerHasANextEditionToGet() {
61 assertThat(soneRescuer.hasNextEdition(), is(true));
65 public void soneRescuerDoesNotHaveANextEditionIfCurrentEditionIsZero() {
66 when(sone.getRequestUri().getEdition()).thenReturn(0L);
67 soneRescuer = new SoneRescuer(core, soneDownloader, sone);
68 assertThat(soneRescuer.hasNextEdition(), is(false));
72 public void nextEditionIsOneSmallerThanTheCurrentEdition() {
73 assertThat(soneRescuer.getNextEdition(), is(CURRENT_EDITION - 1));
77 public void currentEditionCanBeSet() {
78 soneRescuer.setEdition(SOME_OTHER_EDITION);
79 assertThat(soneRescuer.getCurrentEdition(), is(SOME_OTHER_EDITION));
83 public void lastFetchOfANewSoneRescuerWasSuccessful() {
84 assertThat(soneRescuer.isLastFetchSuccessful(), is(true));
88 public void mainLoopStopsWhenItShould() {
90 soneRescuer.serviceRun();
94 public void successfulInsert() {
95 final Sone fetchedSone = mock(Sone.class);
96 returnUriOnInsert(fetchedSone);
97 soneRescuer.startNextFetch();
98 soneRescuer.serviceRun();
99 verify(core).lockSone(eq(sone));
100 verify(core).updateSone(eq(fetchedSone), eq(true));
101 assertThat(soneRescuer.isLastFetchSuccessful(), is(true));
102 assertThat(soneRescuer.isFetching(), is(false));
106 public void nonSuccessfulInsertIsRecognized() {
107 returnUriOnInsert(null);
108 soneRescuer.startNextFetch();
109 soneRescuer.serviceRun();
110 verify(core).lockSone(eq(sone));
111 verify(core, never()).updateSone(any(Sone.class), eq(true));
112 assertThat(soneRescuer.isLastFetchSuccessful(), is(false));
113 assertThat(soneRescuer.isFetching(), is(false));
116 private void returnUriOnInsert(final Sone fetchedSone) {
117 FreenetURI keyWithMetaStrings = setupFreenetUri();
118 doAnswer(new Answer<Sone>() {
120 public Sone answer(InvocationOnMock invocation) throws Throwable {
124 }).when(soneDownloader).fetchSone(eq(sone), eq(keyWithMetaStrings), eq(true));
127 private FreenetURI setupFreenetUri() {
128 FreenetURI sskKey = mock(FreenetURI.class);
129 FreenetURI keyWithDocName = mock(FreenetURI.class);
130 FreenetURI keyWithMetaStrings = mock(FreenetURI.class);
131 when(keyWithDocName.setMetaString(eq(new String[] { "sone.xml" }))).thenReturn(keyWithMetaStrings);
132 when(sskKey.setDocName(eq("Sone-" + CURRENT_EDITION))).thenReturn(keyWithDocName);
133 when(sone.getRequestUri().setKeyType(eq("SSK"))).thenReturn(sskKey);
134 return keyWithMetaStrings;