Don’t set insert URI of a Sone, let it be generated from the identity.
[Sone.git] / src / test / java / net / pterodactylus / sone / core / FreenetInterfaceTest.java
index 486b177..60c8344 100644 (file)
@@ -1,11 +1,10 @@
 package net.pterodactylus.sone.core;
 
+import static freenet.client.InsertException.CANCELLED;
+import static freenet.client.InsertException.INTERNAL_ERROR;
 import static freenet.keys.InsertableClientSSK.createRandom;
 import static freenet.node.RequestStarter.INTERACTIVE_PRIORITY_CLASS;
 import static freenet.node.RequestStarter.PREFETCH_PRIORITY_CLASS;
-import static java.lang.System.currentTimeMillis;
-import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.SECONDS;
 import static net.pterodactylus.sone.Matchers.delivers;
 import static net.pterodactylus.sone.TestUtil.setFinalField;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -17,10 +16,10 @@ import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyShort;
 import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.withSettings;
@@ -28,13 +27,15 @@ import static org.mockito.Mockito.withSettings;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.util.HashMap;
-import java.util.concurrent.CountDownLatch;
 
 import net.pterodactylus.sone.TestUtil;
 import net.pterodactylus.sone.core.FreenetInterface.Callback;
 import net.pterodactylus.sone.core.FreenetInterface.Fetched;
 import net.pterodactylus.sone.core.FreenetInterface.InsertToken;
 import net.pterodactylus.sone.core.FreenetInterface.InsertTokenSupplier;
+import net.pterodactylus.sone.core.event.ImageInsertAbortedEvent;
+import net.pterodactylus.sone.core.event.ImageInsertFailedEvent;
+import net.pterodactylus.sone.core.event.ImageInsertFinishedEvent;
 import net.pterodactylus.sone.core.event.ImageInsertStartedEvent;
 import net.pterodactylus.sone.data.Image;
 import net.pterodactylus.sone.data.ImageImpl;
@@ -67,8 +68,6 @@ import com.google.common.eventbus.EventBus;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
 
 /**
  * Unit test for {@link FreenetInterface}.
@@ -86,7 +85,8 @@ public class FreenetInterfaceTest {
        private FreenetInterface freenetInterface;
        private final Sone sone = mock(Sone.class);
        private final ArgumentCaptor<USKCallback> callbackCaptor = forClass(USKCallback.class);
-       private final SoneDownloader soneDownloader = mock(SoneDownloader.class);
+       private final Image image = mock(Image.class);
+       private InsertToken insertToken;
 
        @Before
        public void setupFreenetInterface() {
@@ -95,6 +95,7 @@ public class FreenetInterfaceTest {
                setFinalField(node, "random", randomSource);
                setFinalField(nodeClientCore, "uskManager", uskManager);
                freenetInterface = new FreenetInterface(eventBus, node);
+               insertToken = freenetInterface.new InsertToken(image);
        }
 
        @Before
@@ -201,25 +202,11 @@ public class FreenetInterfaceTest {
        @Test
        public void soneWithWrongRequestUriWillNotBeSubscribed() throws MalformedURLException {
                when(sone.getRequestUri()).thenReturn(new FreenetURI("KSK@GPLv3.txt"));
-               freenetInterface.registerUsk(sone, null);
+               freenetInterface.registerUsk(new FreenetURI("KSK@GPLv3.txt"), null);
                verify(uskManager, never()).subscribe(any(USK.class), any(USKCallback.class), anyBoolean(), any(RequestClient.class));
        }
 
        @Test
-       public void registeringAUskForARecentlyModifiedSone() throws MalformedURLException {
-               when(sone.getTime()).thenReturn(currentTimeMillis() - DAYS.toMillis(1));
-               freenetInterface.registerUsk(sone, null);
-               verify(uskManager).subscribe(any(USK.class), any(USKCallback.class), eq(true), eq((RequestClient) highLevelSimpleClient));
-       }
-
-       @Test
-       public void registeringAUskForAnOldSone() throws MalformedURLException {
-               when(sone.getTime()).thenReturn(currentTimeMillis() - DAYS.toMillis(365));
-               freenetInterface.registerUsk(sone, null);
-               verify(uskManager).subscribe(any(USK.class), any(USKCallback.class), eq(false), eq((RequestClient) highLevelSimpleClient));
-       }
-
-       @Test
        public void registeringAUsk() {
                FreenetURI freenetUri = createRandom(randomSource, "test-0").getURI().uskForSSK();
                Callback callback = mock(Callback.class);
@@ -236,6 +223,42 @@ public class FreenetInterfaceTest {
        }
 
        @Test
+       public void registeringAnActiveUskWillSubscribeToItCorrectly() {
+               FreenetURI freenetUri = createRandom(randomSource, "test-0").getURI().uskForSSK();
+               final USKCallback uskCallback = mock(USKCallback.class);
+               freenetInterface.registerActiveUsk(freenetUri, uskCallback);
+               verify(uskManager).subscribe(any(USK.class), eq(uskCallback), eq(true), any(RequestClient.class));
+       }
+
+       @Test
+       public void registeringAnInactiveUskWillSubscribeToItCorrectly() {
+               FreenetURI freenetUri = createRandom(randomSource, "test-0").getURI().uskForSSK();
+               final USKCallback uskCallback = mock(USKCallback.class);
+               freenetInterface.registerPassiveUsk(freenetUri, uskCallback);
+               verify(uskManager).subscribe(any(USK.class), eq(uskCallback), eq(false), any(RequestClient.class));
+       }
+
+       @Test
+       public void registeringAnActiveNonUskWillNotSubscribeToAUsk()
+       throws MalformedURLException {
+               FreenetURI freenetUri = createRandom(randomSource, "test-0").getURI();
+           freenetInterface.registerActiveUsk(freenetUri, null);
+               verify(uskManager, never()).subscribe(any(USK.class),
+                               any(USKCallback.class), anyBoolean(),
+                               eq((RequestClient) highLevelSimpleClient));
+       }
+
+       @Test
+       public void registeringAnInactiveNonUskWillNotSubscribeToAUsk()
+       throws MalformedURLException {
+               FreenetURI freenetUri = createRandom(randomSource, "test-0").getURI();
+           freenetInterface.registerPassiveUsk(freenetUri, null);
+               verify(uskManager, never()).subscribe(any(USK.class),
+                               any(USKCallback.class), anyBoolean(),
+                               eq((RequestClient) highLevelSimpleClient));
+       }
+
+       @Test
        public void unregisteringANotRegisteredUskDoesNothing() {
                FreenetURI freenetURI = createRandom(randomSource, "test-0").getURI().uskForSSK();
                freenetInterface.unregisterUsk(freenetURI);
@@ -258,62 +281,26 @@ public class FreenetInterfaceTest {
        }
 
        @Test
-       public void unregisteringARegisteredSoneUnregistersTheSone() {
-               freenetInterface.registerUsk(sone, null);
+       public void unregisteringARegisteredSoneUnregistersTheSone()
+       throws MalformedURLException {
+               freenetInterface.registerActiveUsk(sone.getRequestUri(), mock(USKCallback.class));
                freenetInterface.unregisterUsk(sone);
                verify(uskManager).unsubscribe(any(USK.class), any(USKCallback.class));
        }
 
        @Test
        public void unregisteringASoneWithAWrongRequestKeyWillNotUnsubscribe() throws MalformedURLException {
-               freenetInterface.registerUsk(sone, null);
                when(sone.getRequestUri()).thenReturn(new FreenetURI("KSK@GPLv3.txt"));
+               freenetInterface.registerUsk(sone.getRequestUri(), null);
                freenetInterface.unregisterUsk(sone);
                verify(uskManager, never()).unsubscribe(any(USK.class), any(USKCallback.class));
        }
 
        @Test
-       public void callbackPrioritiesAreInteractive() {
-               freenetInterface.registerUsk(sone, null);
-               assertThat(callbackCaptor.getValue().getPollingPriorityNormal(), is(INTERACTIVE_PRIORITY_CLASS));
-               assertThat(callbackCaptor.getValue().getPollingPriorityProgress(), is(INTERACTIVE_PRIORITY_CLASS));
-       }
-
-       @Test
-       public void callbackForRegisteredSoneWithHigherEditionTriggersDownload() throws InterruptedException {
-               freenetInterface.registerUsk(sone, soneDownloader);
-               final CountDownLatch downloadTriggered = new CountDownLatch(1);
-               doAnswer(new Answer<Void>() {
-                       @Override
-                       public Void answer(InvocationOnMock invocation) throws Throwable {
-                               downloadTriggered.countDown();
-                               return null;
-                       }
-               }).when(soneDownloader).fetchSone(sone);
-               callbackCaptor.getValue().onFoundEdition(1, null, null, null, false, (short) 0, null, false, false);
-               assertThat(downloadTriggered.await(1, SECONDS), is(true));
-       }
-
-       @Test
-       public void callbackForRegisteredSoneWithTheSameEditionDoesNotTriggerDownload() throws InterruptedException {
-               freenetInterface.registerUsk(sone, soneDownloader);
-               final CountDownLatch downloadTriggered = new CountDownLatch(1);
-               doAnswer(new Answer<Void>() {
-                       @Override
-                       public Void answer(InvocationOnMock invocation) throws Throwable {
-                               downloadTriggered.countDown();
-                               return null;
-                       }
-               }).when(soneDownloader).fetchSone(sone);
-               callbackCaptor.getValue().onFoundEdition(0, null, null, null, false, (short) 0, null, false, false);
-               assertThat(downloadTriggered.await(1, SECONDS), is(false));
-       }
-
-       @Test
        public void callbackForNormalUskUsesDifferentPriorities() {
                Callback callback = mock(Callback.class);
-               FreenetURI uri = createRandom(randomSource, "test-0").getURI().uskForSSK();
-               freenetInterface.registerUsk(uri, callback);
+               FreenetURI soneUri = createRandom(randomSource, "test-0").getURI().uskForSSK();
+               freenetInterface.registerUsk(soneUri, callback);
                assertThat(callbackCaptor.getValue().getPollingPriorityNormal(), is(PREFETCH_PRIORITY_CLASS));
                assertThat(callbackCaptor.getValue().getPollingPriorityProgress(), is(INTERACTIVE_PRIORITY_CLASS));
        }
@@ -339,9 +326,67 @@ public class FreenetInterfaceTest {
        }
 
        @Test
+       public void cancellingAnInsertWillFireImageInsertAbortedEvent() {
+               ClientPutter clientPutter = mock(ClientPutter.class);
+               insertToken.setClientPutter(clientPutter);
+               ArgumentCaptor<ImageInsertStartedEvent> imageInsertStartedEvent = forClass(ImageInsertStartedEvent.class);
+               verify(eventBus).post(imageInsertStartedEvent.capture());
+               assertThat(imageInsertStartedEvent.getValue().image(), is(image));
+               insertToken.cancel();
+               ArgumentCaptor<ImageInsertAbortedEvent> imageInsertAbortedEvent = forClass(ImageInsertAbortedEvent.class);
+               verify(eventBus, times(2)).post(imageInsertAbortedEvent.capture());
+               assertThat(imageInsertAbortedEvent.getValue().image(), is(image));
+       }
+
+       @Test
+       public void failureWithoutExceptionSendsFailedEvent() {
+               insertToken.onFailure(null, null, null);
+               ArgumentCaptor<ImageInsertFailedEvent> imageInsertFailedEvent = forClass(ImageInsertFailedEvent.class);
+               verify(eventBus).post(imageInsertFailedEvent.capture());
+               assertThat(imageInsertFailedEvent.getValue().image(), is(image));
+               assertThat(imageInsertFailedEvent.getValue().cause(), nullValue());
+       }
+
+       @Test
+       public void failureSendsFailedEventWithException() {
+               InsertException insertException = new InsertException(INTERNAL_ERROR, "Internal error", null);
+               insertToken.onFailure(insertException, null, null);
+               ArgumentCaptor<ImageInsertFailedEvent> imageInsertFailedEvent = forClass(ImageInsertFailedEvent.class);
+               verify(eventBus).post(imageInsertFailedEvent.capture());
+               assertThat(imageInsertFailedEvent.getValue().image(), is(image));
+               assertThat(imageInsertFailedEvent.getValue().cause(), is((Throwable) insertException));
+       }
+
+       @Test
+       public void failureBecauseCancelledByUserSendsAbortedEvent() {
+               InsertException insertException = new InsertException(CANCELLED, null);
+               insertToken.onFailure(insertException, null, null);
+               ArgumentCaptor<ImageInsertAbortedEvent> imageInsertAbortedEvent = forClass(ImageInsertAbortedEvent.class);
+               verify(eventBus).post(imageInsertAbortedEvent.capture());
+               assertThat(imageInsertAbortedEvent.getValue().image(), is(image));
+       }
+
+       @Test
+       public void ignoredMethodsDoNotThrowExceptions() {
+               insertToken.onMajorProgress(null);
+               insertToken.onFetchable(null, null);
+               insertToken.onGeneratedMetadata(null, null, null);
+       }
+
+       @Test
+       public void generatedUriIsPostedOnSuccess() {
+               FreenetURI generatedUri = mock(FreenetURI.class);
+               insertToken.onGeneratedURI(generatedUri, null, null);
+               insertToken.onSuccess(null, null);
+               ArgumentCaptor<ImageInsertFinishedEvent> imageInsertFinishedEvent = forClass(ImageInsertFinishedEvent.class);
+               verify(eventBus).post(imageInsertFinishedEvent.capture());
+               assertThat(imageInsertFinishedEvent.getValue().image(), is(image));
+               assertThat(imageInsertFinishedEvent.getValue().resultingUri(), is(generatedUri));
+       }
+
+       @Test
        public void insertTokenSupplierSuppliesInsertTokens() {
                InsertTokenSupplier insertTokenSupplier = freenetInterface.new InsertTokenSupplier();
-               Image image = mock(Image.class);
                assertThat(insertTokenSupplier.apply(image), notNullValue());
        }