Follow redirects in ClientGet
[jFCPlib.git] / src / test / java / net / pterodactylus / fcp / quelaton / DefaultFcpClientTest.java
index 0a39451..61a7d0a 100644 (file)
@@ -1299,6 +1299,30 @@ public class DefaultFcpClientTest {
                        connectAndAssert(() -> matchesFcpMessage("ClientGet", "URI=KSK@foo.txt", "Global=true"));
                }
 
+               @Test
+               public void clientGetFollowsRedirect() throws InterruptedException, ExecutionException, IOException {
+                   Future<Optional<Data>> data = fcpClient.clientGet().uri("USK@foo/bar").execute();
+                       connectAndAssert(() -> matchesFcpMessage("ClientGet", "URI=USK@foo/bar"));
+                       replyWithRedirect("USK@foo/baz");
+                       readMessage(() -> matchesFcpMessage("ClientGet", "URI=USK@foo/baz"));
+                       replyWithAllData(identifier, "Hello", "text/plain;charset=utf-8");
+                       verifyData(data.get());
+               }
+
+               @Test
+               public void clientGetNotifiesListenersOnRedirect() throws IOException, ExecutionException, InterruptedException {
+                       List<String> redirects = new ArrayList<>();
+                       Future<Optional<Data>> data = fcpClient.clientGet().onRedirect(redirects::add).uri("USK@foo/bar").execute();
+                       connectAndAssert(() -> matchesFcpMessage("ClientGet", "URI=USK@foo/bar"));
+                       replyWithRedirect("USK@foo/baz");
+                       readMessage(() -> matchesFcpMessage("ClientGet", "URI=USK@foo/baz"));
+                       replyWithRedirect("USK@foo/quux");
+                       readMessage(() -> matchesFcpMessage("ClientGet", "URI=USK@foo/quux"));
+                       replyWithAllData(identifier, "Hello", "text/plain;charset=utf-8");
+                       verifyData(data.get());
+                       assertThat(redirects, contains("USK@foo/baz", "USK@foo/quux"));
+               }
+
                private void replyWithGetFailed(String identifier) throws IOException {
                        fcpServer.writeLine(
                                "GetFailed",
@@ -1308,6 +1332,16 @@ public class DefaultFcpClientTest {
                        );
                }
 
+               private void replyWithRedirect(String newUri) throws IOException {
+                       fcpServer.writeLine(
+                               "GetFailed",
+                               "Identifier=" + identifier,
+                               "Code=27",
+                               "RedirectURI=" + newUri,
+                               "EndMessage"
+                       );
+               }
+
                private void replyWithAllData(String identifier, String text, String contentType) throws IOException {
                        fcpServer.writeLine(
                                "AllData",