1 package net.pterodactylus.fcp.quelaton;
3 import static org.hamcrest.MatcherAssert.assertThat;
4 import static org.hamcrest.Matchers.contains;
5 import static org.hamcrest.Matchers.containsInAnyOrder;
6 import static org.hamcrest.Matchers.hasSize;
7 import static org.hamcrest.Matchers.is;
8 import static org.hamcrest.Matchers.not;
9 import static org.hamcrest.Matchers.notNullValue;
10 import static org.hamcrest.Matchers.startsWith;
12 import java.io.ByteArrayInputStream;
14 import java.io.IOException;
16 import java.nio.charset.StandardCharsets;
17 import java.util.Collection;
18 import java.util.List;
19 import java.util.Optional;
20 import java.util.concurrent.CopyOnWriteArrayList;
21 import java.util.concurrent.ExecutionException;
22 import java.util.concurrent.ExecutorService;
23 import java.util.concurrent.Executors;
24 import java.util.concurrent.Future;
25 import java.util.stream.Collectors;
27 import net.pterodactylus.fcp.ARK;
28 import net.pterodactylus.fcp.ConfigData;
29 import net.pterodactylus.fcp.DSAGroup;
30 import net.pterodactylus.fcp.FcpKeyPair;
31 import net.pterodactylus.fcp.Key;
32 import net.pterodactylus.fcp.NodeData;
33 import net.pterodactylus.fcp.NodeRef;
34 import net.pterodactylus.fcp.Peer;
35 import net.pterodactylus.fcp.PeerNote;
36 import net.pterodactylus.fcp.PluginInfo;
37 import net.pterodactylus.fcp.Priority;
38 import net.pterodactylus.fcp.fake.FakeTcpServer;
39 import net.pterodactylus.fcp.quelaton.ClientGetCommand.Data;
41 import com.google.common.io.ByteStreams;
42 import com.google.common.io.Files;
43 import com.nitorcreations.junit.runners.NestedRunner;
44 import org.hamcrest.Description;
45 import org.hamcrest.Matcher;
46 import org.hamcrest.TypeSafeDiagnosingMatcher;
47 import org.junit.After;
48 import org.junit.Assert;
49 import org.junit.Test;
50 import org.junit.runner.RunWith;
53 * Unit test for {@link DefaultFcpClient}.
55 * @author <a href="bombe@freenetproject.org">David ‘Bombe’ Roden</a>
57 @RunWith(NestedRunner.class)
58 public class DefaultFcpClientTest {
60 private static final String INSERT_URI =
61 "SSK@RVCHbJdkkyTCeNN9AYukEg76eyqmiosSaNKgE3U9zUw,7SHH53gletBVb9JD7nBsyClbLQsBubDPEIcwg908r7Y,AQECAAE/";
62 private static final String REQUEST_URI =
63 "SSK@wtbgd2loNcJCXvtQVOftl2tuWBomDQHfqS6ytpPRhfw,7SHH53gletBVb9JD7nBsyClbLQsBubDPEIcwg908r7Y,AQACAAE/";
65 private int threadCounter = 0;
66 private final ExecutorService threadPool =
67 Executors.newCachedThreadPool(r -> new Thread(r, "Test-Thread-" + threadCounter++));
68 private final FakeTcpServer fcpServer;
69 private final DefaultFcpClient fcpClient;
71 public DefaultFcpClientTest() throws IOException {
72 fcpServer = new FakeTcpServer(threadPool);
73 fcpClient = new DefaultFcpClient(threadPool, "localhost", fcpServer.getPort(), () -> "Test");
77 public void tearDown() throws IOException {
79 threadPool.shutdown();
82 @Test(expected = ExecutionException.class)
83 public void defaultFcpClientThrowsExceptionIfItCanNotConnect()
84 throws IOException, ExecutionException, InterruptedException {
85 Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
86 fcpServer.connect().get();
87 fcpServer.collectUntil(is("EndMessage"));
89 "CloseConnectionDuplicateClientName",
95 @Test(expected = ExecutionException.class)
96 public void defaultFcpClientThrowsExceptionIfConnectionIsClosed()
97 throws IOException, ExecutionException, InterruptedException {
98 Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
99 fcpServer.connect().get();
100 fcpServer.collectUntil(is("EndMessage"));
106 public void defaultFcpClientCanGenerateKeypair() throws ExecutionException, InterruptedException, IOException {
107 Future<FcpKeyPair> keyPairFuture = fcpClient.generateKeypair().execute();
109 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
110 String identifier = extractIdentifier(lines);
111 fcpServer.writeLine("SSKKeypair",
112 "InsertURI=" + INSERT_URI + "",
113 "RequestURI=" + REQUEST_URI + "",
114 "Identifier=" + identifier,
116 FcpKeyPair keyPair = keyPairFuture.get();
117 assertThat(keyPair.getPublicKey(), is(REQUEST_URI));
118 assertThat(keyPair.getPrivateKey(), is(INSERT_URI));
121 private void connectNode() throws InterruptedException, ExecutionException, IOException {
122 fcpServer.connect().get();
123 fcpServer.collectUntil(is("EndMessage"));
124 fcpServer.writeLine("NodeHello",
125 "CompressionCodecs=4 - GZIP(0), BZIP2(1), LZMA(2), LZMA_NEW(3)",
126 "Revision=build01466",
128 "Version=Fred,0.7,1.0,1466",
130 "ConnectionIdentifier=14318898267048452a81b36e7f13a3f0",
134 "NodeLanguage=ENGLISH",
141 public void clientGetCanDownloadData() throws InterruptedException, ExecutionException, IOException {
142 Future<Optional<Data>> dataFuture = fcpClient.clientGet().uri("KSK@foo.txt").execute();
144 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
145 assertThat(lines, matchesFcpMessage("ClientGet", "ReturnType=direct", "URI=KSK@foo.txt"));
146 String identifier = extractIdentifier(lines);
149 "Identifier=" + identifier,
151 "StartupTime=1435610539000",
152 "CompletionTime=1435610540000",
153 "Metadata.ContentType=text/plain;charset=utf-8",
157 Optional<Data> data = dataFuture.get();
158 assertThat(data.get().getMimeType(), is("text/plain;charset=utf-8"));
159 assertThat(data.get().size(), is(6L));
160 assertThat(ByteStreams.toByteArray(data.get().getInputStream()),
161 is("Hello\n".getBytes(StandardCharsets.UTF_8)));
164 private String extractIdentifier(List<String> lines) {
165 return lines.stream()
166 .filter(s -> s.startsWith("Identifier="))
167 .map(s -> s.substring(s.indexOf('=') + 1))
173 public void clientGetDownloadsDataForCorrectIdentifier()
174 throws InterruptedException, ExecutionException, IOException {
175 Future<Optional<Data>> dataFuture = fcpClient.clientGet().uri("KSK@foo.txt").execute();
177 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
178 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt"));
179 String identifier = extractIdentifier(lines);
182 "Identifier=not-test",
184 "StartupTime=1435610539000",
185 "CompletionTime=1435610540000",
186 "Metadata.ContentType=text/plain;charset=latin-9",
192 "Identifier=" + identifier,
194 "StartupTime=1435610539000",
195 "CompletionTime=1435610540000",
196 "Metadata.ContentType=text/plain;charset=utf-8",
200 Optional<Data> data = dataFuture.get();
201 assertThat(data.get().getMimeType(), is("text/plain;charset=utf-8"));
202 assertThat(data.get().size(), is(6L));
203 assertThat(ByteStreams.toByteArray(data.get().getInputStream()),
204 is("Hello\n".getBytes(StandardCharsets.UTF_8)));
208 public void clientGetRecognizesGetFailed() throws InterruptedException, ExecutionException, IOException {
209 Future<Optional<Data>> dataFuture = fcpClient.clientGet().uri("KSK@foo.txt").execute();
211 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
212 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt"));
213 String identifier = extractIdentifier(lines);
216 "Identifier=" + identifier,
220 Optional<Data> data = dataFuture.get();
221 assertThat(data.isPresent(), is(false));
225 public void clientGetRecognizesGetFailedForCorrectIdentifier()
226 throws InterruptedException, ExecutionException, IOException {
227 Future<Optional<Data>> dataFuture = fcpClient.clientGet().uri("KSK@foo.txt").execute();
229 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
230 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt"));
231 String identifier = extractIdentifier(lines);
234 "Identifier=not-test",
240 "Identifier=" + identifier,
244 Optional<Data> data = dataFuture.get();
245 assertThat(data.isPresent(), is(false));
248 @Test(expected = ExecutionException.class)
249 public void clientGetRecognizesConnectionClosed() throws InterruptedException, ExecutionException, IOException {
250 Future<Optional<Data>> dataFuture = fcpClient.clientGet().uri("KSK@foo.txt").execute();
252 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
253 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt"));
259 public void defaultFcpClientReusesConnection() throws InterruptedException, ExecutionException, IOException {
260 Future<FcpKeyPair> keyPair = fcpClient.generateKeypair().execute();
262 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
263 String identifier = extractIdentifier(lines);
266 "InsertURI=" + INSERT_URI + "",
267 "RequestURI=" + REQUEST_URI + "",
268 "Identifier=" + identifier,
272 keyPair = fcpClient.generateKeypair().execute();
273 lines = fcpServer.collectUntil(is("EndMessage"));
274 identifier = extractIdentifier(lines);
277 "InsertURI=" + INSERT_URI + "",
278 "RequestURI=" + REQUEST_URI + "",
279 "Identifier=" + identifier,
286 public void defaultFcpClientCanReconnectAfterConnectionHasBeenClosed()
287 throws InterruptedException, ExecutionException, IOException {
288 Future<FcpKeyPair> keyPair = fcpClient.generateKeypair().execute();
290 fcpServer.collectUntil(is("EndMessage"));
295 } catch (ExecutionException e) {
297 keyPair = fcpClient.generateKeypair().execute();
299 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
300 String identifier = extractIdentifier(lines);
303 "InsertURI=" + INSERT_URI + "",
304 "RequestURI=" + REQUEST_URI + "",
305 "Identifier=" + identifier,
312 public void clientGetWithIgnoreDataStoreSettingSendsCorrectCommands()
313 throws InterruptedException, ExecutionException, IOException {
314 fcpClient.clientGet().ignoreDataStore().uri("KSK@foo.txt").execute();
316 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
317 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt", "IgnoreDS=true"));
321 public void clientGetWithDataStoreOnlySettingSendsCorrectCommands()
322 throws InterruptedException, ExecutionException, IOException {
323 fcpClient.clientGet().dataStoreOnly().uri("KSK@foo.txt").execute();
325 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
326 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt", "DSonly=true"));
330 public void clientGetWithMaxSizeSettingSendsCorrectCommands()
331 throws InterruptedException, ExecutionException, IOException {
332 fcpClient.clientGet().maxSize(1048576).uri("KSK@foo.txt").execute();
334 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
335 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt", "MaxSize=1048576"));
339 public void clientGetWithPrioritySettingSendsCorrectCommands()
340 throws InterruptedException, ExecutionException, IOException {
341 fcpClient.clientGet().priority(Priority.interactive).uri("KSK@foo.txt").execute();
343 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
344 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt", "PriorityClass=1"));
348 public void clientGetWithRealTimeSettingSendsCorrectCommands()
349 throws InterruptedException, ExecutionException, IOException {
350 fcpClient.clientGet().realTime().uri("KSK@foo.txt").execute();
352 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
353 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt", "RealTimeFlag=true"));
357 public void clientGetWithGlobalSettingSendsCorrectCommands()
358 throws InterruptedException, ExecutionException, IOException {
359 fcpClient.clientGet().global().uri("KSK@foo.txt").execute();
361 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
362 assertThat(lines, matchesFcpMessage("ClientGet", "URI=KSK@foo.txt", "Global=true"));
365 private Matcher<List<String>> matchesFcpMessage(String name, String... requiredLines) {
366 return new TypeSafeDiagnosingMatcher<List<String>>() {
368 protected boolean matchesSafely(List<String> item, Description mismatchDescription) {
369 if (!item.get(0).equals(name)) {
370 mismatchDescription.appendText("FCP message is named ").appendValue(item.get(0));
373 for (String requiredLine : requiredLines) {
374 if (item.indexOf(requiredLine) < 1) {
375 mismatchDescription.appendText("FCP message does not contain ").appendValue(requiredLine);
383 public void describeTo(Description description) {
384 description.appendText("FCP message named ").appendValue(name);
385 description.appendValueList(", containing the lines ", ", ", "", requiredLines);
391 public void clientPutWithDirectDataSendsCorrectCommand()
392 throws IOException, ExecutionException, InterruptedException {
393 fcpClient.clientPut()
394 .from(new ByteArrayInputStream("Hello\n".getBytes()))
399 List<String> lines = fcpServer.collectUntil(is("Hello"));
400 assertThat(lines, matchesFcpMessage("ClientPut", "UploadFrom=direct", "DataLength=6", "URI=KSK@foo.txt"));
404 public void clientPutWithDirectDataSucceedsOnCorrectIdentifier()
405 throws InterruptedException, ExecutionException, IOException {
406 Future<Optional<Key>> key = fcpClient.clientPut()
407 .from(new ByteArrayInputStream("Hello\n".getBytes()))
412 List<String> lines = fcpServer.collectUntil(is("Hello"));
413 String identifier = extractIdentifier(lines);
416 "Identifier=not-the-right-one",
422 "Identifier=" + identifier,
425 assertThat(key.get().get().getKey(), is("KSK@foo.txt"));
429 public void clientPutWithDirectDataFailsOnCorrectIdentifier()
430 throws InterruptedException, ExecutionException, IOException {
431 Future<Optional<Key>> key = fcpClient.clientPut()
432 .from(new ByteArrayInputStream("Hello\n".getBytes()))
437 List<String> lines = fcpServer.collectUntil(is("Hello"));
438 String identifier = extractIdentifier(lines);
441 "Identifier=not-the-right-one",
447 "Identifier=" + identifier,
450 assertThat(key.get().isPresent(), is(false));
454 public void clientPutWithRenamedDirectDataSendsCorrectCommand()
455 throws InterruptedException, ExecutionException, IOException {
456 fcpClient.clientPut()
457 .named("otherName.txt")
458 .from(new ByteArrayInputStream("Hello\n".getBytes()))
463 List<String> lines = fcpServer.collectUntil(is("Hello"));
464 assertThat(lines, matchesFcpMessage("ClientPut", "TargetFilename=otherName.txt", "UploadFrom=direct",
465 "DataLength=6", "URI=KSK@foo.txt"));
469 public void clientPutWithRedirectSendsCorrectCommand()
470 throws IOException, ExecutionException, InterruptedException {
471 fcpClient.clientPut().redirectTo("KSK@bar.txt").uri("KSK@foo.txt").execute();
473 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
475 matchesFcpMessage("ClientPut", "UploadFrom=redirect", "URI=KSK@foo.txt", "TargetURI=KSK@bar.txt"));
479 public void clientPutWithFileSendsCorrectCommand() throws InterruptedException, ExecutionException, IOException {
480 fcpClient.clientPut().from(new File("/tmp/data.txt")).uri("KSK@foo.txt").execute();
482 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
484 matchesFcpMessage("ClientPut", "UploadFrom=disk", "URI=KSK@foo.txt", "Filename=/tmp/data.txt"));
488 public void clientPutWithFileCanCompleteTestDdaSequence()
489 throws IOException, ExecutionException, InterruptedException {
490 File tempFile = createTempFile();
491 fcpClient.clientPut().from(new File(tempFile.getParent(), "test.dat")).uri("KSK@foo.txt").execute();
493 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
494 String identifier = extractIdentifier(lines);
497 "Identifier=" + identifier,
501 lines = fcpServer.collectUntil(is("EndMessage"));
502 assertThat(lines, matchesFcpMessage(
504 "Directory=" + tempFile.getParent(),
505 "WantReadDirectory=true",
506 "WantWriteDirectory=false",
511 "Directory=" + tempFile.getParent(),
512 "ReadFilename=" + tempFile,
515 lines = fcpServer.collectUntil(is("EndMessage"));
516 assertThat(lines, matchesFcpMessage(
518 "Directory=" + tempFile.getParent(),
519 "ReadContent=test-content",
524 "Directory=" + tempFile.getParent(),
525 "ReadDirectoryAllowed=true",
528 lines = fcpServer.collectUntil(is("EndMessage"));
530 matchesFcpMessage("ClientPut", "UploadFrom=disk", "URI=KSK@foo.txt",
531 "Filename=" + new File(tempFile.getParent(), "test.dat")));
534 private File createTempFile() throws IOException {
535 File tempFile = File.createTempFile("test-dda-", ".dat");
536 tempFile.deleteOnExit();
537 Files.write("test-content", tempFile, StandardCharsets.UTF_8);
542 public void clientPutDoesNotReactToProtocolErrorForDifferentIdentifier()
543 throws InterruptedException, ExecutionException, IOException {
544 Future<Optional<Key>> key = fcpClient.clientPut().from(new File("/tmp/data.txt")).uri("KSK@foo.txt").execute();
546 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
547 String identifier = extractIdentifier(lines);
550 "Identifier=not-the-right-one",
556 "Identifier=" + identifier,
560 assertThat(key.get().get().getKey(), is("KSK@foo.txt"));
564 public void clientPutAbortsOnProtocolErrorOtherThan25()
565 throws InterruptedException, ExecutionException, IOException {
566 Future<Optional<Key>> key = fcpClient.clientPut().from(new File("/tmp/data.txt")).uri("KSK@foo.txt").execute();
568 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
569 String identifier = extractIdentifier(lines);
572 "Identifier=" + identifier,
576 assertThat(key.get().isPresent(), is(false));
580 public void clientPutDoesNotReplyToWrongTestDdaReply() throws IOException, ExecutionException,
581 InterruptedException {
582 File tempFile = createTempFile();
583 fcpClient.clientPut().from(new File(tempFile.getParent(), "test.dat")).uri("KSK@foo.txt").execute();
585 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
586 String identifier = extractIdentifier(lines);
589 "Identifier=" + identifier,
593 lines = fcpServer.collectUntil(is("EndMessage"));
594 assertThat(lines, matchesFcpMessage(
596 "Directory=" + tempFile.getParent(),
597 "WantReadDirectory=true",
598 "WantWriteDirectory=false",
603 "Directory=/some-other-directory",
604 "ReadFilename=" + tempFile,
609 "Directory=" + tempFile.getParent(),
610 "ReadFilename=" + tempFile,
613 lines = fcpServer.collectUntil(is("EndMessage"));
614 assertThat(lines, matchesFcpMessage(
616 "Directory=" + tempFile.getParent(),
617 "ReadContent=test-content",
623 public void clientPutSendsResponseEvenIfFileCanNotBeRead()
624 throws IOException, ExecutionException, InterruptedException {
625 File tempFile = createTempFile();
626 fcpClient.clientPut().from(new File(tempFile.getParent(), "test.dat")).uri("KSK@foo.txt").execute();
628 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
629 String identifier = extractIdentifier(lines);
632 "Identifier=" + identifier,
636 lines = fcpServer.collectUntil(is("EndMessage"));
637 assertThat(lines, matchesFcpMessage(
639 "Directory=" + tempFile.getParent(),
640 "WantReadDirectory=true",
641 "WantWriteDirectory=false",
646 "Directory=" + tempFile.getParent(),
647 "ReadFilename=" + tempFile + ".foo",
650 lines = fcpServer.collectUntil(is("EndMessage"));
651 assertThat(lines, matchesFcpMessage(
653 "Directory=" + tempFile.getParent(),
654 "ReadContent=failed-to-read",
660 public void clientPutDoesNotResendOriginalClientPutOnTestDDACompleteWithWrongDirectory()
661 throws IOException, ExecutionException, InterruptedException {
662 File tempFile = createTempFile();
663 fcpClient.clientPut().from(new File(tempFile.getParent(), "test.dat")).uri("KSK@foo.txt").execute();
665 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
666 String identifier = extractIdentifier(lines);
669 "Directory=/some-other-directory",
674 "Identifier=" + identifier,
678 lines = fcpServer.collectUntil(is("EndMessage"));
679 assertThat(lines, matchesFcpMessage(
681 "Directory=" + tempFile.getParent(),
682 "WantReadDirectory=true",
683 "WantWriteDirectory=false",
689 public void clientPutSendsNotificationsForGeneratedKeys()
690 throws InterruptedException, ExecutionException, IOException {
691 List<String> generatedKeys = new CopyOnWriteArrayList<>();
692 Future<Optional<Key>> key = fcpClient.clientPut()
693 .onKeyGenerated(generatedKeys::add)
694 .from(new ByteArrayInputStream("Hello\n".getBytes()))
699 List<String> lines = fcpServer.collectUntil(is("Hello"));
700 String identifier = extractIdentifier(lines);
703 "Identifier=" + identifier,
710 "Identifier=" + identifier,
713 assertThat(key.get().get().getKey(), is("KSK@foo.txt"));
714 assertThat(generatedKeys, contains("KSK@foo.txt"));
718 public void clientCanListPeers() throws IOException, ExecutionException, InterruptedException {
719 Future<Collection<Peer>> peers = fcpClient.listPeers().execute();
721 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
722 assertThat(lines, matchesFcpMessage(
724 "WithVolatile=false",
725 "WithMetadata=false",
728 String identifier = extractIdentifier(lines);
731 "Identifier=" + identifier,
737 "Identifier=" + identifier,
743 "Identifier=" + identifier,
746 assertThat(peers.get(), hasSize(2));
747 assertThat(peers.get().stream().map(Peer::getIdentity).collect(Collectors.toList()),
748 containsInAnyOrder("id1", "id2"));
752 public void clientCanListPeersWithMetadata() throws IOException, ExecutionException, InterruptedException {
753 Future<Collection<Peer>> peers = fcpClient.listPeers().includeMetadata().execute();
755 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
756 assertThat(lines, matchesFcpMessage(
758 "WithVolatile=false",
762 String identifier = extractIdentifier(lines);
765 "Identifier=" + identifier,
772 "Identifier=" + identifier,
779 "Identifier=" + identifier,
782 assertThat(peers.get(), hasSize(2));
783 assertThat(peers.get().stream().map(peer -> peer.getMetadata("foo")).collect(Collectors.toList()),
784 containsInAnyOrder("bar1", "bar2"));
788 public void clientCanListPeersWithVolatiles() throws IOException, ExecutionException, InterruptedException {
789 Future<Collection<Peer>> peers = fcpClient.listPeers().includeVolatile().execute();
791 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
792 assertThat(lines, matchesFcpMessage(
795 "WithMetadata=false",
798 String identifier = extractIdentifier(lines);
801 "Identifier=" + identifier,
808 "Identifier=" + identifier,
815 "Identifier=" + identifier,
818 assertThat(peers.get(), hasSize(2));
819 assertThat(peers.get().stream().map(peer -> peer.getVolatile("foo")).collect(Collectors.toList()),
820 containsInAnyOrder("bar1", "bar2"));
824 public void defaultFcpClientCanGetNodeInformation() throws InterruptedException, ExecutionException, IOException {
825 Future<NodeData> nodeData = fcpClient.getNode().execute();
827 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
828 String identifier = extractIdentifier(lines);
829 assertThat(lines, matchesFcpMessage(
831 "Identifier=" + identifier,
832 "GiveOpennetRef=false",
834 "WithVolatile=false",
839 "Identifier=" + identifier,
840 "ark.pubURI=SSK@3YEf.../ark",
843 "version=Fred,0.7,1.0,1466",
844 "lastGoodVersion=Fred,0.7,1.0,1466",
847 assertThat(nodeData.get(), notNullValue());
851 public void defaultFcpClientCanGetNodeInformationWithOpennetRef()
852 throws InterruptedException, ExecutionException, IOException {
853 Future<NodeData> nodeData = fcpClient.getNode().opennetRef().execute();
855 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
856 String identifier = extractIdentifier(lines);
857 assertThat(lines, matchesFcpMessage(
859 "Identifier=" + identifier,
860 "GiveOpennetRef=true",
862 "WithVolatile=false",
867 "Identifier=" + identifier,
869 "ark.pubURI=SSK@3YEf.../ark",
872 "version=Fred,0.7,1.0,1466",
873 "lastGoodVersion=Fred,0.7,1.0,1466",
876 assertThat(nodeData.get().getVersion().toString(), is("Fred,0.7,1.0,1466"));
880 public void defaultFcpClientCanGetNodeInformationWithPrivateData()
881 throws InterruptedException, ExecutionException, IOException {
882 Future<NodeData> nodeData = fcpClient.getNode().includePrivate().execute();
884 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
885 String identifier = extractIdentifier(lines);
886 assertThat(lines, matchesFcpMessage(
888 "Identifier=" + identifier,
889 "GiveOpennetRef=false",
891 "WithVolatile=false",
896 "Identifier=" + identifier,
898 "ark.pubURI=SSK@3YEf.../ark",
901 "version=Fred,0.7,1.0,1466",
902 "lastGoodVersion=Fred,0.7,1.0,1466",
903 "ark.privURI=SSK@XdHMiRl",
906 assertThat(nodeData.get().getARK().getPrivateURI(), is("SSK@XdHMiRl"));
910 public void defaultFcpClientCanGetNodeInformationWithVolatileData()
911 throws InterruptedException, ExecutionException, IOException {
912 Future<NodeData> nodeData = fcpClient.getNode().includeVolatile().execute();
914 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
915 String identifier = extractIdentifier(lines);
916 assertThat(lines, matchesFcpMessage(
918 "Identifier=" + identifier,
919 "GiveOpennetRef=false",
926 "Identifier=" + identifier,
928 "ark.pubURI=SSK@3YEf.../ark",
931 "version=Fred,0.7,1.0,1466",
932 "lastGoodVersion=Fred,0.7,1.0,1466",
933 "volatile.freeJavaMemory=205706528",
936 assertThat(nodeData.get().getVolatile("freeJavaMemory"), is("205706528"));
940 public void defaultFcpClientCanListSinglePeerByIdentity()
941 throws InterruptedException, ExecutionException, IOException {
942 Future<Optional<Peer>> peer = fcpClient.listPeer().byIdentity("id1").execute();
944 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
945 String identifier = extractIdentifier(lines);
946 assertThat(lines, matchesFcpMessage(
948 "Identifier=" + identifier,
949 "NodeIdentifier=id1",
954 "Identifier=" + identifier,
957 "ark.pubURI=SSK@3YEf.../ark",
960 "version=Fred,0.7,1.0,1466",
961 "lastGoodVersion=Fred,0.7,1.0,1466",
964 assertThat(peer.get().get().getIdentity(), is("id1"));
968 public void defaultFcpClientCanListSinglePeerByHostAndPort()
969 throws InterruptedException, ExecutionException, IOException {
970 Future<Optional<Peer>> peer = fcpClient.listPeer().byHostAndPort("host.free.net", 12345).execute();
972 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
973 String identifier = extractIdentifier(lines);
974 assertThat(lines, matchesFcpMessage(
976 "Identifier=" + identifier,
977 "NodeIdentifier=host.free.net:12345",
982 "Identifier=" + identifier,
985 "ark.pubURI=SSK@3YEf.../ark",
988 "version=Fred,0.7,1.0,1466",
989 "lastGoodVersion=Fred,0.7,1.0,1466",
992 assertThat(peer.get().get().getIdentity(), is("id1"));
996 public void defaultFcpClientCanListSinglePeerByName()
997 throws InterruptedException, ExecutionException, IOException {
998 Future<Optional<Peer>> peer = fcpClient.listPeer().byName("FriendNode").execute();
1000 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1001 String identifier = extractIdentifier(lines);
1002 assertThat(lines, matchesFcpMessage(
1004 "Identifier=" + identifier,
1005 "NodeIdentifier=FriendNode",
1008 fcpServer.writeLine(
1010 "Identifier=" + identifier,
1013 "ark.pubURI=SSK@3YEf.../ark",
1016 "version=Fred,0.7,1.0,1466",
1017 "lastGoodVersion=Fred,0.7,1.0,1466",
1020 assertThat(peer.get().get().getIdentity(), is("id1"));
1024 public void defaultFcpClientRecognizesUnknownNodeIdentifiers()
1025 throws InterruptedException, ExecutionException, IOException {
1026 Future<Optional<Peer>> peer = fcpClient.listPeer().byIdentity("id2").execute();
1028 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1029 String identifier = extractIdentifier(lines);
1030 assertThat(lines, matchesFcpMessage(
1032 "Identifier=" + identifier,
1033 "NodeIdentifier=id2",
1036 fcpServer.writeLine(
1037 "UnknownNodeIdentifier",
1038 "Identifier=" + identifier,
1039 "NodeIdentifier=id2",
1042 assertThat(peer.get().isPresent(), is(false));
1046 public void defaultFcpClientCanAddPeerFromFile() throws InterruptedException, ExecutionException, IOException {
1047 Future<Optional<Peer>> peer = fcpClient.addPeer().fromFile(new File("/tmp/ref.txt")).execute();
1049 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1050 String identifier = extractIdentifier(lines);
1051 assertThat(lines, matchesFcpMessage(
1053 "Identifier=" + identifier,
1054 "File=/tmp/ref.txt",
1057 fcpServer.writeLine(
1059 "Identifier=" + identifier,
1062 "ark.pubURI=SSK@3YEf.../ark",
1065 "version=Fred,0.7,1.0,1466",
1066 "lastGoodVersion=Fred,0.7,1.0,1466",
1069 assertThat(peer.get().get().getIdentity(), is("id1"));
1073 public void defaultFcpClientCanAddPeerFromURL() throws InterruptedException, ExecutionException, IOException {
1074 Future<Optional<Peer>> peer = fcpClient.addPeer().fromURL(new URL("http://node.ref/")).execute();
1076 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1077 String identifier = extractIdentifier(lines);
1078 assertThat(lines, matchesFcpMessage(
1080 "Identifier=" + identifier,
1081 "URL=http://node.ref/",
1084 fcpServer.writeLine(
1086 "Identifier=" + identifier,
1089 "ark.pubURI=SSK@3YEf.../ark",
1092 "version=Fred,0.7,1.0,1466",
1093 "lastGoodVersion=Fred,0.7,1.0,1466",
1096 assertThat(peer.get().get().getIdentity(), is("id1"));
1100 public void defaultFcpClientCanAddPeerFromNodeRef() throws InterruptedException, ExecutionException, IOException {
1101 NodeRef nodeRef = new NodeRef();
1102 nodeRef.setIdentity("id1");
1103 nodeRef.setName("name");
1104 nodeRef.setARK(new ARK("public", "1"));
1105 nodeRef.setDSAGroup(new DSAGroup("base", "prime", "subprime"));
1106 nodeRef.setNegotiationTypes(new int[] { 3, 5 });
1107 nodeRef.setPhysicalUDP("1.2.3.4:5678");
1108 nodeRef.setDSAPublicKey("dsa-public");
1109 nodeRef.setSignature("sig");
1110 Future<Optional<Peer>> peer = fcpClient.addPeer().fromNodeRef(nodeRef).execute();
1112 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1113 String identifier = extractIdentifier(lines);
1114 assertThat(lines, matchesFcpMessage(
1116 "Identifier=" + identifier,
1119 "ark.pubURI=public",
1123 "dsaGroup.q=subprime",
1124 "dsaPubKey.y=dsa-public",
1125 "physical.udp=1.2.3.4:5678",
1126 "auth.negTypes=3;5",
1130 fcpServer.writeLine(
1132 "Identifier=" + identifier,
1135 "ark.pubURI=SSK@3YEf.../ark",
1138 "version=Fred,0.7,1.0,1466",
1139 "lastGoodVersion=Fred,0.7,1.0,1466",
1142 assertThat(peer.get().get().getIdentity(), is("id1"));
1146 public void listPeerNotesCanGetPeerNotesByNodeName() throws InterruptedException, ExecutionException, IOException {
1147 Future<Optional<PeerNote>> peerNote = fcpClient.listPeerNotes().byName("Friend1").execute();
1149 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1150 String identifier = extractIdentifier(lines);
1151 assertThat(lines, matchesFcpMessage(
1153 "NodeIdentifier=Friend1",
1156 fcpServer.writeLine(
1158 "Identifier=" + identifier,
1159 "NodeIdentifier=Friend1",
1160 "NoteText=RXhhbXBsZSBUZXh0Lg==",
1164 fcpServer.writeLine(
1166 "Identifier=" + identifier,
1169 assertThat(peerNote.get().get().getNoteText(), is("RXhhbXBsZSBUZXh0Lg=="));
1170 assertThat(peerNote.get().get().getPeerNoteType(), is(1));
1174 public void listPeerNotesReturnsEmptyOptionalWhenNodeIdenfierUnknown()
1175 throws InterruptedException, ExecutionException,
1177 Future<Optional<PeerNote>> peerNote = fcpClient.listPeerNotes().byName("Friend1").execute();
1179 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1180 String identifier = extractIdentifier(lines);
1181 assertThat(lines, matchesFcpMessage(
1183 "NodeIdentifier=Friend1",
1186 fcpServer.writeLine(
1187 "UnknownNodeIdentifier",
1188 "Identifier=" + identifier,
1189 "NodeIdentifier=Friend1",
1192 assertThat(peerNote.get().isPresent(), is(false));
1196 public void listPeerNotesCanGetPeerNotesByNodeIdentifier()
1197 throws InterruptedException, ExecutionException, IOException {
1198 Future<Optional<PeerNote>> peerNote = fcpClient.listPeerNotes().byIdentity("id1").execute();
1200 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1201 String identifier = extractIdentifier(lines);
1202 assertThat(lines, matchesFcpMessage(
1204 "NodeIdentifier=id1",
1207 fcpServer.writeLine(
1209 "Identifier=" + identifier,
1210 "NodeIdentifier=id1",
1211 "NoteText=RXhhbXBsZSBUZXh0Lg==",
1215 fcpServer.writeLine(
1217 "Identifier=" + identifier,
1220 assertThat(peerNote.get().get().getNoteText(), is("RXhhbXBsZSBUZXh0Lg=="));
1221 assertThat(peerNote.get().get().getPeerNoteType(), is(1));
1225 public void listPeerNotesCanGetPeerNotesByHostNameAndPortNumber()
1226 throws InterruptedException, ExecutionException, IOException {
1227 Future<Optional<PeerNote>> peerNote = fcpClient.listPeerNotes().byHostAndPort("1.2.3.4", 5678).execute();
1229 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1230 String identifier = extractIdentifier(lines);
1231 assertThat(lines, matchesFcpMessage(
1233 "NodeIdentifier=1.2.3.4:5678",
1236 fcpServer.writeLine(
1238 "Identifier=" + identifier,
1239 "NodeIdentifier=id1",
1240 "NoteText=RXhhbXBsZSBUZXh0Lg==",
1244 fcpServer.writeLine(
1246 "Identifier=" + identifier,
1249 assertThat(peerNote.get().get().getNoteText(), is("RXhhbXBsZSBUZXh0Lg=="));
1250 assertThat(peerNote.get().get().getPeerNoteType(), is(1));
1254 public void defaultFcpClientCanEnablePeerByName() throws InterruptedException, ExecutionException, IOException {
1255 Future<Optional<Peer>> peer = fcpClient.modifyPeer().enable().byName("Friend1").execute();
1257 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1258 String identifier = extractIdentifier(lines);
1259 assertThat(lines, matchesFcpMessage(
1261 "Identifier=" + identifier,
1262 "NodeIdentifier=Friend1",
1266 fcpServer.writeLine(
1268 "Identifier=" + identifier,
1269 "NodeIdentifier=Friend1",
1273 assertThat(peer.get().get().getIdentity(), is("id1"));
1277 public void defaultFcpClientCanDisablePeerByName() throws InterruptedException, ExecutionException, IOException {
1278 Future<Optional<Peer>> peer = fcpClient.modifyPeer().disable().byName("Friend1").execute();
1280 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1281 String identifier = extractIdentifier(lines);
1282 assertThat(lines, matchesFcpMessage(
1284 "Identifier=" + identifier,
1285 "NodeIdentifier=Friend1",
1289 fcpServer.writeLine(
1291 "Identifier=" + identifier,
1292 "NodeIdentifier=Friend1",
1296 assertThat(peer.get().get().getIdentity(), is("id1"));
1300 public void defaultFcpClientCanEnablePeerByIdentity() throws InterruptedException, ExecutionException, IOException {
1301 Future<Optional<Peer>> peer = fcpClient.modifyPeer().enable().byIdentity("id1").execute();
1303 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1304 String identifier = extractIdentifier(lines);
1305 assertThat(lines, matchesFcpMessage(
1307 "Identifier=" + identifier,
1308 "NodeIdentifier=id1",
1312 fcpServer.writeLine(
1314 "Identifier=" + identifier,
1315 "NodeIdentifier=Friend1",
1319 assertThat(peer.get().get().getIdentity(), is("id1"));
1323 public void defaultFcpClientCanEnablePeerByHostAndPort()
1324 throws InterruptedException, ExecutionException, IOException {
1325 Future<Optional<Peer>> peer = fcpClient.modifyPeer().enable().byHostAndPort("1.2.3.4", 5678).execute();
1327 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1328 String identifier = extractIdentifier(lines);
1329 assertThat(lines, matchesFcpMessage(
1331 "Identifier=" + identifier,
1332 "NodeIdentifier=1.2.3.4:5678",
1336 fcpServer.writeLine(
1338 "Identifier=" + identifier,
1339 "NodeIdentifier=Friend1",
1343 assertThat(peer.get().get().getIdentity(), is("id1"));
1347 public void defaultFcpClientCanNotModifyPeerOfUnknownNode()
1348 throws InterruptedException, ExecutionException, IOException {
1349 Future<Optional<Peer>> peer = fcpClient.modifyPeer().enable().byIdentity("id1").execute();
1351 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1352 String identifier = extractIdentifier(lines);
1353 assertThat(lines, matchesFcpMessage(
1355 "Identifier=" + identifier,
1356 "NodeIdentifier=id1",
1360 fcpServer.writeLine(
1361 "UnknownNodeIdentifier",
1362 "Identifier=" + identifier,
1363 "NodeIdentifier=id1",
1366 assertThat(peer.get().isPresent(), is(false));
1370 public void defaultFcpClientCanAllowLocalAddressesOfPeer()
1371 throws InterruptedException, ExecutionException, IOException {
1372 Future<Optional<Peer>> peer = fcpClient.modifyPeer().allowLocalAddresses().byIdentity("id1").execute();
1374 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1375 String identifier = extractIdentifier(lines);
1376 assertThat(lines, matchesFcpMessage(
1378 "Identifier=" + identifier,
1379 "NodeIdentifier=id1",
1380 "AllowLocalAddresses=true",
1383 assertThat(lines, not(contains(startsWith("IsDisabled="))));
1384 fcpServer.writeLine(
1386 "Identifier=" + identifier,
1387 "NodeIdentifier=Friend1",
1391 assertThat(peer.get().get().getIdentity(), is("id1"));
1395 public void defaultFcpClientCanDisallowLocalAddressesOfPeer()
1396 throws InterruptedException, ExecutionException, IOException {
1397 Future<Optional<Peer>> peer = fcpClient.modifyPeer().disallowLocalAddresses().byIdentity("id1").execute();
1399 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1400 String identifier = extractIdentifier(lines);
1401 assertThat(lines, matchesFcpMessage(
1403 "Identifier=" + identifier,
1404 "NodeIdentifier=id1",
1405 "AllowLocalAddresses=false",
1408 assertThat(lines, not(contains(startsWith("IsDisabled="))));
1409 fcpServer.writeLine(
1411 "Identifier=" + identifier,
1412 "NodeIdentifier=Friend1",
1416 assertThat(peer.get().get().getIdentity(), is("id1"));
1420 public void defaultFcpClientCanSetBurstOnlyForPeer()
1421 throws InterruptedException, ExecutionException, IOException {
1422 Future<Optional<Peer>> peer = fcpClient.modifyPeer().setBurstOnly().byIdentity("id1").execute();
1424 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1425 String identifier = extractIdentifier(lines);
1426 assertThat(lines, matchesFcpMessage(
1428 "Identifier=" + identifier,
1429 "NodeIdentifier=id1",
1433 assertThat(lines, not(contains(startsWith("AllowLocalAddresses="))));
1434 assertThat(lines, not(contains(startsWith("IsDisabled="))));
1435 fcpServer.writeLine(
1437 "Identifier=" + identifier,
1438 "NodeIdentifier=Friend1",
1442 assertThat(peer.get().get().getIdentity(), is("id1"));
1446 public void defaultFcpClientCanClearBurstOnlyForPeer()
1447 throws InterruptedException, ExecutionException, IOException {
1448 Future<Optional<Peer>> peer = fcpClient.modifyPeer().clearBurstOnly().byIdentity("id1").execute();
1450 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1451 String identifier = extractIdentifier(lines);
1452 assertThat(lines, matchesFcpMessage(
1454 "Identifier=" + identifier,
1455 "NodeIdentifier=id1",
1456 "IsBurstOnly=false",
1459 assertThat(lines, not(contains(startsWith("AllowLocalAddresses="))));
1460 assertThat(lines, not(contains(startsWith("IsDisabled="))));
1461 fcpServer.writeLine(
1463 "Identifier=" + identifier,
1464 "NodeIdentifier=Friend1",
1468 assertThat(peer.get().get().getIdentity(), is("id1"));
1472 public void defaultFcpClientCanSetListenOnlyForPeer()
1473 throws InterruptedException, ExecutionException, IOException {
1474 Future<Optional<Peer>> peer = fcpClient.modifyPeer().setListenOnly().byIdentity("id1").execute();
1476 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1477 String identifier = extractIdentifier(lines);
1478 assertThat(lines, matchesFcpMessage(
1480 "Identifier=" + identifier,
1481 "NodeIdentifier=id1",
1482 "IsListenOnly=true",
1485 assertThat(lines, not(contains(startsWith("AllowLocalAddresses="))));
1486 assertThat(lines, not(contains(startsWith("IsDisabled="))));
1487 assertThat(lines, not(contains(startsWith("IsBurstOnly="))));
1488 fcpServer.writeLine(
1490 "Identifier=" + identifier,
1491 "NodeIdentifier=Friend1",
1495 assertThat(peer.get().get().getIdentity(), is("id1"));
1499 public void defaultFcpClientCanClearListenOnlyForPeer()
1500 throws InterruptedException, ExecutionException, IOException {
1501 Future<Optional<Peer>> peer = fcpClient.modifyPeer().clearListenOnly().byIdentity("id1").execute();
1503 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1504 String identifier = extractIdentifier(lines);
1505 assertThat(lines, matchesFcpMessage(
1507 "Identifier=" + identifier,
1508 "NodeIdentifier=id1",
1509 "IsListenOnly=false",
1512 assertThat(lines, not(contains(startsWith("AllowLocalAddresses="))));
1513 assertThat(lines, not(contains(startsWith("IsDisabled="))));
1514 assertThat(lines, not(contains(startsWith("IsBurstOnly="))));
1515 fcpServer.writeLine(
1517 "Identifier=" + identifier,
1518 "NodeIdentifier=Friend1",
1522 assertThat(peer.get().get().getIdentity(), is("id1"));
1526 public void defaultFcpClientCanIgnoreSourceForPeer()
1527 throws InterruptedException, ExecutionException, IOException {
1528 Future<Optional<Peer>> peer = fcpClient.modifyPeer().ignoreSource().byIdentity("id1").execute();
1530 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1531 String identifier = extractIdentifier(lines);
1532 assertThat(lines, matchesFcpMessage(
1534 "Identifier=" + identifier,
1535 "NodeIdentifier=id1",
1536 "IgnoreSourcePort=true",
1539 assertThat(lines, not(contains(startsWith("AllowLocalAddresses="))));
1540 assertThat(lines, not(contains(startsWith("IsDisabled="))));
1541 assertThat(lines, not(contains(startsWith("IsBurstOnly="))));
1542 assertThat(lines, not(contains(startsWith("IsListenOnly="))));
1543 fcpServer.writeLine(
1545 "Identifier=" + identifier,
1546 "NodeIdentifier=Friend1",
1550 assertThat(peer.get().get().getIdentity(), is("id1"));
1554 public void defaultFcpClientCanUseSourceForPeer()
1555 throws InterruptedException, ExecutionException, IOException {
1556 Future<Optional<Peer>> peer = fcpClient.modifyPeer().useSource().byIdentity("id1").execute();
1558 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1559 String identifier = extractIdentifier(lines);
1560 assertThat(lines, matchesFcpMessage(
1562 "Identifier=" + identifier,
1563 "NodeIdentifier=id1",
1564 "IgnoreSourcePort=false",
1567 assertThat(lines, not(contains(startsWith("AllowLocalAddresses="))));
1568 assertThat(lines, not(contains(startsWith("IsDisabled="))));
1569 assertThat(lines, not(contains(startsWith("IsBurstOnly="))));
1570 assertThat(lines, not(contains(startsWith("IsListenOnly="))));
1571 fcpServer.writeLine(
1573 "Identifier=" + identifier,
1574 "NodeIdentifier=Friend1",
1578 assertThat(peer.get().get().getIdentity(), is("id1"));
1582 public void defaultFcpClientCanRemovePeerByName() throws InterruptedException, ExecutionException, IOException {
1583 Future<Boolean> peer = fcpClient.removePeer().byName("Friend1").execute();
1585 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1586 String identifier = extractIdentifier(lines);
1587 assertThat(lines, matchesFcpMessage(
1589 "Identifier=" + identifier,
1590 "NodeIdentifier=Friend1",
1593 fcpServer.writeLine(
1595 "Identifier=" + identifier,
1596 "NodeIdentifier=Friend1",
1599 assertThat(peer.get(), is(true));
1603 public void defaultFcpClientCanNotRemovePeerByInvalidName()
1604 throws InterruptedException, ExecutionException, IOException {
1605 Future<Boolean> peer = fcpClient.removePeer().byName("NotFriend1").execute();
1607 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1608 String identifier = extractIdentifier(lines);
1609 assertThat(lines, matchesFcpMessage(
1611 "Identifier=" + identifier,
1612 "NodeIdentifier=NotFriend1",
1615 fcpServer.writeLine(
1616 "UnknownNodeIdentifier",
1617 "Identifier=" + identifier,
1620 assertThat(peer.get(), is(false));
1624 public void defaultFcpClientCanRemovePeerByIdentity() throws InterruptedException, ExecutionException, IOException {
1625 Future<Boolean> peer = fcpClient.removePeer().byIdentity("id1").execute();
1627 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1628 String identifier = extractIdentifier(lines);
1629 assertThat(lines, matchesFcpMessage(
1631 "Identifier=" + identifier,
1632 "NodeIdentifier=id1",
1635 fcpServer.writeLine(
1637 "Identifier=" + identifier,
1638 "NodeIdentifier=Friend1",
1641 assertThat(peer.get(), is(true));
1645 public void defaultFcpClientCanRemovePeerByHostAndPort()
1646 throws InterruptedException, ExecutionException, IOException {
1647 Future<Boolean> peer = fcpClient.removePeer().byHostAndPort("1.2.3.4", 5678).execute();
1649 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1650 String identifier = extractIdentifier(lines);
1651 assertThat(lines, matchesFcpMessage(
1653 "Identifier=" + identifier,
1654 "NodeIdentifier=1.2.3.4:5678",
1657 fcpServer.writeLine(
1659 "Identifier=" + identifier,
1660 "NodeIdentifier=Friend1",
1663 assertThat(peer.get(), is(true));
1667 public void defaultFcpClientCanModifyPeerNoteByName()
1668 throws InterruptedException, ExecutionException, IOException {
1669 Future<Boolean> noteUpdated = fcpClient.modifyPeerNote().darknetComment("foo").byName("Friend1").execute();
1671 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1672 String identifier = extractIdentifier(lines);
1673 assertThat(lines, matchesFcpMessage(
1675 "Identifier=" + identifier,
1676 "NodeIdentifier=Friend1",
1681 fcpServer.writeLine(
1683 "Identifier=" + identifier,
1684 "NodeIdentifier=Friend1",
1689 assertThat(noteUpdated.get(), is(true));
1693 public void defaultFcpClientKnowsPeerNoteWasNotModifiedOnUnknownNodeIdentifier()
1694 throws InterruptedException, ExecutionException, IOException {
1695 Future<Boolean> noteUpdated = fcpClient.modifyPeerNote().darknetComment("foo").byName("Friend1").execute();
1697 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1698 String identifier = extractIdentifier(lines);
1699 assertThat(lines, matchesFcpMessage(
1701 "Identifier=" + identifier,
1702 "NodeIdentifier=Friend1",
1707 fcpServer.writeLine(
1708 "UnknownNodeIdentifier",
1709 "Identifier=" + identifier,
1710 "NodeIdentifier=Friend1",
1713 assertThat(noteUpdated.get(), is(false));
1717 public void defaultFcpClientFailsToModifyPeerNoteWithoutPeerNote()
1718 throws InterruptedException, ExecutionException, IOException {
1719 Future<Boolean> noteUpdated = fcpClient.modifyPeerNote().byName("Friend1").execute();
1720 assertThat(noteUpdated.get(), is(false));
1724 public void defaultFcpClientCanModifyPeerNoteByIdentifier()
1725 throws InterruptedException, ExecutionException, IOException {
1726 Future<Boolean> noteUpdated = fcpClient.modifyPeerNote().darknetComment("foo").byIdentifier("id1").execute();
1728 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1729 String identifier = extractIdentifier(lines);
1730 assertThat(lines, matchesFcpMessage(
1732 "Identifier=" + identifier,
1733 "NodeIdentifier=id1",
1738 fcpServer.writeLine(
1740 "Identifier=" + identifier,
1741 "NodeIdentifier=id1",
1746 assertThat(noteUpdated.get(), is(true));
1750 public void defaultFcpClientCanModifyPeerNoteByHostAndPort()
1751 throws InterruptedException, ExecutionException, IOException {
1752 Future<Boolean> noteUpdated =
1753 fcpClient.modifyPeerNote().darknetComment("foo").byHostAndPort("1.2.3.4", 5678).execute();
1755 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1756 String identifier = extractIdentifier(lines);
1757 assertThat(lines, matchesFcpMessage(
1759 "Identifier=" + identifier,
1760 "NodeIdentifier=1.2.3.4:5678",
1765 fcpServer.writeLine(
1767 "Identifier=" + identifier,
1768 "NodeIdentifier=1.2.3.4:5678",
1773 assertThat(noteUpdated.get(), is(true));
1777 public void defaultFcpClientCanGetConfigWithoutDetails()
1778 throws InterruptedException, ExecutionException, IOException {
1779 Future<ConfigData> configData = fcpClient.getConfig().execute();
1781 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1782 String identifier = extractIdentifier(lines);
1783 assertThat(lines, matchesFcpMessage(
1785 "Identifier=" + identifier,
1788 fcpServer.writeLine(
1790 "Identifier=" + identifier,
1793 assertThat(configData.get(), notNullValue());
1797 public void defaultFcpClientCanGetConfigWithCurrent()
1798 throws InterruptedException, ExecutionException, IOException {
1799 Future<ConfigData> configData = fcpClient.getConfig().withCurrent().execute();
1801 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1802 String identifier = extractIdentifier(lines);
1803 assertThat(lines, matchesFcpMessage(
1805 "Identifier=" + identifier,
1809 fcpServer.writeLine(
1811 "Identifier=" + identifier,
1815 assertThat(configData.get().getCurrent("foo"), is("bar"));
1819 public void defaultFcpClientCanGetConfigWithDefaults()
1820 throws InterruptedException, ExecutionException, IOException {
1821 Future<ConfigData> configData = fcpClient.getConfig().withDefaults().execute();
1823 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1824 String identifier = extractIdentifier(lines);
1825 assertThat(lines, matchesFcpMessage(
1827 "Identifier=" + identifier,
1828 "WithDefaults=true",
1831 fcpServer.writeLine(
1833 "Identifier=" + identifier,
1837 assertThat(configData.get().getDefault("foo"), is("bar"));
1841 public void defaultFcpClientCanGetConfigWithSortOrder()
1842 throws InterruptedException, ExecutionException, IOException {
1843 Future<ConfigData> configData = fcpClient.getConfig().withSortOrder().execute();
1845 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1846 String identifier = extractIdentifier(lines);
1847 assertThat(lines, matchesFcpMessage(
1849 "Identifier=" + identifier,
1850 "WithSortOrder=true",
1853 fcpServer.writeLine(
1855 "Identifier=" + identifier,
1859 assertThat(configData.get().getSortOrder("foo"), is(17));
1863 public void defaultFcpClientCanGetConfigWithExpertFlag()
1864 throws InterruptedException, ExecutionException, IOException {
1865 Future<ConfigData> configData = fcpClient.getConfig().withExpertFlag().execute();
1867 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1868 String identifier = extractIdentifier(lines);
1869 assertThat(lines, matchesFcpMessage(
1871 "Identifier=" + identifier,
1872 "WithExpertFlag=true",
1875 fcpServer.writeLine(
1877 "Identifier=" + identifier,
1878 "expertFlag.foo=true",
1881 assertThat(configData.get().getExpertFlag("foo"), is(true));
1885 public void defaultFcpClientCanGetConfigWithForceWriteFlag()
1886 throws InterruptedException, ExecutionException, IOException {
1887 Future<ConfigData> configData = fcpClient.getConfig().withForceWriteFlag().execute();
1889 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1890 String identifier = extractIdentifier(lines);
1891 assertThat(lines, matchesFcpMessage(
1893 "Identifier=" + identifier,
1894 "WithForceWriteFlag=true",
1897 fcpServer.writeLine(
1899 "Identifier=" + identifier,
1900 "forceWriteFlag.foo=true",
1903 assertThat(configData.get().getForceWriteFlag("foo"), is(true));
1907 public void defaultFcpClientCanGetConfigWithShortDescription()
1908 throws InterruptedException, ExecutionException, IOException {
1909 Future<ConfigData> configData = fcpClient.getConfig().withShortDescription().execute();
1911 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1912 String identifier = extractIdentifier(lines);
1913 assertThat(lines, matchesFcpMessage(
1915 "Identifier=" + identifier,
1916 "WithShortDescription=true",
1919 fcpServer.writeLine(
1921 "Identifier=" + identifier,
1922 "shortDescription.foo=bar",
1925 assertThat(configData.get().getShortDescription("foo"), is("bar"));
1929 public void defaultFcpClientCanGetConfigWithLongDescription()
1930 throws InterruptedException, ExecutionException, IOException {
1931 Future<ConfigData> configData = fcpClient.getConfig().withLongDescription().execute();
1933 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1934 String identifier = extractIdentifier(lines);
1935 assertThat(lines, matchesFcpMessage(
1937 "Identifier=" + identifier,
1938 "WithLongDescription=true",
1941 fcpServer.writeLine(
1943 "Identifier=" + identifier,
1944 "longDescription.foo=bar",
1947 assertThat(configData.get().getLongDescription("foo"), is("bar"));
1951 public void defaultFcpClientCanGetConfigWithDataTypes()
1952 throws InterruptedException, ExecutionException, IOException {
1953 Future<ConfigData> configData = fcpClient.getConfig().withDataTypes().execute();
1955 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1956 String identifier = extractIdentifier(lines);
1957 assertThat(lines, matchesFcpMessage(
1959 "Identifier=" + identifier,
1960 "WithDataTypes=true",
1963 fcpServer.writeLine(
1965 "Identifier=" + identifier,
1966 "dataType.foo=number",
1969 assertThat(configData.get().getDataType("foo"), is("number"));
1973 public void defaultFcpClientCanModifyConfigData() throws InterruptedException, ExecutionException, IOException {
1974 Future<ConfigData> newConfigData = fcpClient.modifyConfig().set("foo.bar").to("baz").execute();
1976 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
1977 String identifier = extractIdentifier(lines);
1978 assertThat(lines, matchesFcpMessage(
1980 "Identifier=" + identifier,
1984 fcpServer.writeLine(
1986 "Identifier=" + identifier,
1987 "current.foo.bar=baz",
1990 assertThat(newConfigData.get().getCurrent("foo.bar"), is("baz"));
1993 public class LoadPlugin {
1996 public void fromFreenet() throws ExecutionException, InterruptedException, IOException {
1997 Future<Optional<PluginInfo>> pluginInfo =
1998 fcpClient.loadPlugin().officialFromFreenet("superPlugin").execute();
2000 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
2001 String identifier = extractIdentifier(lines);
2002 assertThat(lines, matchesFcpMessage(
2004 "Identifier=" + identifier,
2005 "PluginURL=superPlugin",
2007 "OfficialSource=freenet",
2010 assertThat(lines, not(contains(startsWith("Store="))));
2011 replyWithPluginInfo(identifier);
2012 verifyPluginInfo(pluginInfo);
2016 public void persistentFromFreenet() throws ExecutionException, InterruptedException,
2018 Future<Optional<PluginInfo>> pluginInfo =
2019 fcpClient.loadPlugin().addToConfig().officialFromFreenet("superPlugin").execute();
2021 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
2022 String identifier = extractIdentifier(lines);
2023 assertThat(lines, matchesFcpMessage(
2025 "Identifier=" + identifier,
2026 "PluginURL=superPlugin",
2028 "OfficialSource=freenet",
2032 replyWithPluginInfo(identifier);
2033 verifyPluginInfo(pluginInfo);
2037 public void fromHttps() throws ExecutionException, InterruptedException, IOException {
2038 Future<Optional<PluginInfo>> pluginInfo = fcpClient.loadPlugin().officialFromHttps("superPlugin").execute();
2040 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
2041 String identifier = extractIdentifier(lines);
2042 assertThat(lines, matchesFcpMessage(
2044 "Identifier=" + identifier,
2045 "PluginURL=superPlugin",
2047 "OfficialSource=https",
2050 replyWithPluginInfo(identifier);
2051 verifyPluginInfo(pluginInfo);
2055 public void fromFile() throws ExecutionException, InterruptedException, IOException {
2056 Future<Optional<PluginInfo>> pluginInfo = fcpClient.loadPlugin().fromFile("/path/to/plugin.jar").execute();
2058 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
2059 String identifier = extractIdentifier(lines);
2060 assertThat(lines, matchesFcpMessage(
2062 "Identifier=" + identifier,
2063 "PluginURL=/path/to/plugin.jar",
2067 replyWithPluginInfo(identifier);
2068 verifyPluginInfo(pluginInfo);
2072 public void fromUrl() throws ExecutionException, InterruptedException, IOException {
2073 Future<Optional<PluginInfo>> pluginInfo =
2074 fcpClient.loadPlugin().fromUrl("http://server.com/plugin.jar").execute();
2076 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
2077 String identifier = extractIdentifier(lines);
2078 assertThat(lines, matchesFcpMessage(
2080 "Identifier=" + identifier,
2081 "PluginURL=http://server.com/plugin.jar",
2085 replyWithPluginInfo(identifier);
2086 verifyPluginInfo(pluginInfo);
2090 public void failedLoad() throws ExecutionException, InterruptedException, IOException {
2091 Future<Optional<PluginInfo>> pluginInfo =
2092 fcpClient.loadPlugin().officialFromFreenet("superPlugin").execute();
2094 List<String> lines = fcpServer.collectUntil(is("EndMessage"));
2095 String identifier = extractIdentifier(lines);
2096 fcpServer.writeLine(
2098 "Identifier=" + identifier,
2101 assertThat(pluginInfo.get().isPresent(), is(false));
2104 private void replyWithPluginInfo(String identifier) throws IOException {
2105 fcpServer.writeLine(
2107 "Identifier=" + identifier,
2108 "PluginName=superPlugin",
2110 "LongVersion=1.2.3",
2112 "OriginUri=superPlugin",
2118 private void verifyPluginInfo(Future<Optional<PluginInfo>> pluginInfo)
2119 throws InterruptedException, ExecutionException {
2120 assertThat(pluginInfo.get().get().getPluginName(), is("superPlugin"));
2121 assertThat(pluginInfo.get().get().getOriginalURI(), is("superPlugin"));
2122 assertThat(pluginInfo.get().get().isTalkable(), is(true));
2123 assertThat(pluginInfo.get().get().getVersion(), is("42"));
2124 assertThat(pluginInfo.get().get().getLongVersion(), is("1.2.3"));
2125 assertThat(pluginInfo.get().get().isStarted(), is(true));