Refactor connection tests a bit more
[jFCPlib.git] / src / test / java / net / pterodactylus / fcp / quelaton / DefaultFcpClientTest.java
index 3374556..f95f9b2 100644 (file)
@@ -88,29 +88,6 @@ public class DefaultFcpClientTest {
                threadPool.shutdown();
        }
 
-       @Test(expected = ExecutionException.class)
-       public void defaultFcpClientThrowsExceptionIfItCanNotConnect()
-       throws IOException, ExecutionException, InterruptedException {
-               Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
-               fcpServer.connect().get();
-               fcpServer.collectUntil(is("EndMessage"));
-               fcpServer.writeLine(
-                       "CloseConnectionDuplicateClientName",
-                       "EndMessage"
-               );
-               keyPairFuture.get();
-       }
-
-       @Test(expected = ExecutionException.class)
-       public void defaultFcpClientThrowsExceptionIfConnectionIsClosed()
-       throws IOException, ExecutionException, InterruptedException {
-               Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
-               fcpServer.connect().get();
-               fcpServer.collectUntil(is("EndMessage"));
-               fcpServer.close();
-               keyPairFuture.get();
-       }
-
        private void connectNode() throws InterruptedException, ExecutionException, IOException {
                fcpServer.connect().get();
                fcpServer.collectUntil(is("EndMessage"));
@@ -130,30 +107,6 @@ public class DefaultFcpClientTest {
                );
        }
 
-       @Test
-       public void clientGetCanDownloadData() throws InterruptedException, ExecutionException, IOException {
-               Future<Optional<Data>> dataFuture = fcpClient.clientGet().uri("KSK@foo.txt").execute();
-               connectNode();
-               List<String> lines = fcpServer.collectUntil(is("EndMessage"));
-               assertThat(lines, matchesFcpMessage("ClientGet", "ReturnType=direct", "URI=KSK@foo.txt"));
-               String identifier = extractIdentifier(lines);
-               fcpServer.writeLine(
-                       "AllData",
-                       "Identifier=" + identifier,
-                       "DataLength=6",
-                       "StartupTime=1435610539000",
-                       "CompletionTime=1435610540000",
-                       "Metadata.ContentType=text/plain;charset=utf-8",
-                       "Data",
-                       "Hello"
-               );
-               Optional<Data> data = dataFuture.get();
-               assertThat(data.get().getMimeType(), is("text/plain;charset=utf-8"));
-               assertThat(data.get().size(), is(6L));
-               assertThat(ByteStreams.toByteArray(data.get().getInputStream()),
-                       is("Hello\n".getBytes(StandardCharsets.UTF_8)));
-       }
-
        private String extractIdentifier(List<String> lines) {
                return lines.stream()
                        .filter(s -> s.startsWith("Identifier="))
@@ -162,67 +115,10 @@ public class DefaultFcpClientTest {
                        .orElse("");
        }
 
-       @Test
-       public void defaultFcpClientReusesConnection() throws InterruptedException, ExecutionException, IOException {
-               Future<FcpKeyPair> keyPair = fcpClient.generateKeypair().execute();
-               connectNode();
-               List<String> lines = fcpServer.collectUntil(is("EndMessage"));
-               String identifier = extractIdentifier(lines);
-               fcpServer.writeLine(
-                       "SSKKeypair",
-                       "InsertURI=" + INSERT_URI + "",
-                       "RequestURI=" + REQUEST_URI + "",
-                       "Identifier=" + identifier,
-                       "EndMessage"
-               );
-               keyPair.get();
-               keyPair = fcpClient.generateKeypair().execute();
-               lines = fcpServer.collectUntil(is("EndMessage"));
-               identifier = extractIdentifier(lines);
-               fcpServer.writeLine(
-                       "SSKKeypair",
-                       "InsertURI=" + INSERT_URI + "",
-                       "RequestURI=" + REQUEST_URI + "",
-                       "Identifier=" + identifier,
-                       "EndMessage"
-               );
-               keyPair.get();
-       }
-
-       @Test
-       public void defaultFcpClientCanReconnectAfterConnectionHasBeenClosed()
-       throws InterruptedException, ExecutionException, IOException {
-               Future<FcpKeyPair> keyPair = fcpClient.generateKeypair().execute();
-               connectNode();
-               fcpServer.collectUntil(is("EndMessage"));
-               fcpServer.close();
-               try {
-                       keyPair.get();
-                       Assert.fail();
-               } catch (ExecutionException e) {
-               }
-               keyPair = fcpClient.generateKeypair().execute();
-               connectNode();
-               List<String> lines = fcpServer.collectUntil(is("EndMessage"));
-               String identifier = extractIdentifier(lines);
-               fcpServer.writeLine(
-                       "SSKKeypair",
-                       "InsertURI=" + INSERT_URI + "",
-                       "RequestURI=" + REQUEST_URI + "",
-                       "Identifier=" + identifier,
-                       "EndMessage"
-               );
-               keyPair.get();
-       }
-
        private Matcher<List<String>> matchesFcpMessage(String name, String... requiredLines) {
                return matchesFcpMessageWithTerminator(name, "EndMessage", requiredLines);
        }
 
-       private Matcher<List<String>> matchesDataMessage(String name, String... requiredLines) {
-               return matchesFcpMessageWithTerminator(name, "Data", requiredLines);
-       }
-
        private Matcher<Iterable<String>> hasHead(String firstElement) {
                return new TypeSafeDiagnosingMatcher<Iterable<String>>() {
                        @Override
@@ -961,16 +857,74 @@ public class DefaultFcpClientTest {
                assertThat(lines, requestMatcher.get());
        }
 
-       public class GenerateKeyPair {
+       public class ConnectionsAndKeyPairs {
+
+               public class Connections {
+
+                       @Test(expected = ExecutionException.class)
+                       public void throwsExceptionOnFailure() throws IOException, ExecutionException, InterruptedException {
+                               Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
+                               connectAndAssert(() -> matchesFcpMessage("GenerateSSK"));
+                               fcpServer.writeLine(
+                                       "CloseConnectionDuplicateClientName",
+                                       "EndMessage"
+                               );
+                               keyPairFuture.get();
+                       }
+
+                       @Test(expected = ExecutionException.class)
+                       public void throwsExceptionIfConnectionIsClosed() throws IOException, ExecutionException, InterruptedException {
+                               Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
+                               connectAndAssert(() -> matchesFcpMessage("GenerateSSK"));
+                               fcpServer.close();
+                               keyPairFuture.get();
+                       }
+
+                       @Test
+                       public void connectionIsReused() throws InterruptedException, ExecutionException, IOException {
+                               Future<FcpKeyPair> keyPair = fcpClient.generateKeypair().execute();
+                               connectAndAssert(() -> matchesFcpMessage("GenerateSSK"));
+                               replyWithKeyPair();
+                               keyPair.get();
+                               keyPair = fcpClient.generateKeypair().execute();
+                               readMessage(() -> matchesFcpMessage("GenerateSSK"));
+                               identifier = extractIdentifier(lines);
+                               replyWithKeyPair();
+                               keyPair.get();
+                       }
+
+                       @Test
+                       public void defaultFcpClientCanReconnectAfterConnectionHasBeenClosed()
+                       throws InterruptedException, ExecutionException, IOException {
+                               Future<FcpKeyPair> keyPair = fcpClient.generateKeypair().execute();
+                               connectAndAssert(() -> matchesFcpMessage("GenerateSSK"));
+                               fcpServer.close();
+                               try {
+                                       keyPair.get();
+                                       Assert.fail();
+                               } catch (ExecutionException e) {
+                               }
+                               keyPair = fcpClient.generateKeypair().execute();
+                               connectAndAssert(() -> matchesFcpMessage("GenerateSSK"));
+                               replyWithKeyPair();
+                               keyPair.get();
+                       }
+
+               }
+
+               public class GenerateKeyPair {
+
+                       @Test
+                       public void defaultFcpClientCanGenerateKeypair()
+                       throws ExecutionException, InterruptedException, IOException {
+                               Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
+                               connectAndAssert(() -> matchesFcpMessage("GenerateSSK"));
+                               replyWithKeyPair();
+                               FcpKeyPair keyPair = keyPairFuture.get();
+                               assertThat(keyPair.getPublicKey(), is(REQUEST_URI));
+                               assertThat(keyPair.getPrivateKey(), is(INSERT_URI));
+                       }
 
-               @Test
-               public void defaultFcpClientCanGenerateKeypair() throws ExecutionException, InterruptedException, IOException {
-                       Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
-                       connectAndAssert(() -> matchesFcpMessage("GenerateSSK"));
-                       replyWithKeyPair();
-                       FcpKeyPair keyPair = keyPairFuture.get();
-                       assertThat(keyPair.getPublicKey(), is(REQUEST_URI));
-                       assertThat(keyPair.getPrivateKey(), is(INSERT_URI));
                }
 
                private void replyWithKeyPair() throws IOException {
@@ -1890,7 +1844,7 @@ public class DefaultFcpClientTest {
                @Test
                public void works() throws InterruptedException, ExecutionException, IOException {
                        Future<Optional<Data>> dataFuture = fcpClient.clientGet().uri("KSK@foo.txt").execute();
-                       connectAndAssert(() -> matchesFcpMessage("ClientGet", "URI=KSK@foo.txt"));
+                       connectAndAssert(() -> matchesFcpMessage("ClientGet", "URI=KSK@foo.txt", "ReturnType=direct"));
                        replyWithAllData("not-test", "Hello World", "text/plain;charset=latin-9");
                        replyWithAllData(identifier, "Hello", "text/plain;charset=utf-8");
                        Optional<Data> data = dataFuture.get();
@@ -1901,6 +1855,7 @@ public class DefaultFcpClientTest {
                public void getFailedIsRecognized() throws InterruptedException, ExecutionException, IOException {
                        Future<Optional<Data>> dataFuture = fcpClient.clientGet().uri("KSK@foo.txt").execute();
                        connectAndAssert(() -> matchesFcpMessage("ClientGet", "URI=KSK@foo.txt"));
+                       replyWithGetFailed("not-test");
                        replyWithGetFailed(identifier);
                        Optional<Data> data = dataFuture.get();
                        assertThat(data.isPresent(), is(false));