### Question:
DisabledAutoDiscovery implements Discovery { @Override public void onUpdate(NodeInfo nodeInfo) { if(!knownPeers.contains(NodeUri.create(nodeInfo.getUrl()))) { throw new AutoDiscoveryDisabledException(String.format("%s is not a known peer", nodeInfo.getUrl())); } final NodeUri callerNodeUri = NodeUri.create(nodeInfo.getUrl()); final Set<PublicKey> keys = nodeInfo.getRecipients().stream() .filter(r -> NodeUri.create(r.getUrl()).equals(callerNodeUri)) .map(Recipient::getKey) .collect(Collectors.toSet()); final ActiveNode activeNode = ActiveNode.Builder.create() .withUri(callerNodeUri) .withSupportedVersions(nodeInfo.supportedApiVersions()) .withKeys(keys) .build(); networkStore.store(activeNode); } DisabledAutoDiscovery(NetworkStore networkStore,Set<NodeUri> knownPeers); @Override void onUpdate(NodeInfo nodeInfo); @Override void onDisconnect(URI nodeUri);  }### Answer:
@Test public void onUpdateFromUnknownPeer() { NodeInfo nodeInfo = NodeInfo.Builder.create() .withUrl("http: .build(); try { discovery.onUpdate(nodeInfo); failBecauseExceptionWasNotThrown(AutoDiscoveryDisabledException.class); } catch (AutoDiscoveryDisabledException exception) { assertThat(exception).isNotNull(); } }
@Test public void onUpdateFromKnownPeer() { NodeInfo nodeInfo = NodeInfo.Builder.create() .withUrl(knownPeers.iterator().next().asString()) .build(); discovery.onUpdate(nodeInfo); verify(networkStore).store(any(ActiveNode.class)); }
@Test public void onUpdateNodeSendsNewKey() { String url = knownPeers.iterator().next().asString(); PublicKey key = mock(PublicKey.class); List<Recipient> recipients = List.of(Recipient.of(key,url)); List<ActiveNode> storedNodes = new ArrayList<>(); doAnswer(invocation -> { storedNodes.add(invocation.getArgument(0)); return null; }).when(networkStore).store(any(ActiveNode.class)); NodeInfo nodeInfo = NodeInfo.Builder.create() .withUrl(url) .withRecipients(recipients) .build(); discovery.onUpdate(nodeInfo); assertThat(storedNodes).hasSize(1); ActiveNode savedNode = storedNodes.get(0); assertThat(savedNode.getKeys()).containsExactly(key); assertThat(savedNode.getUri()).isEqualTo(NodeUri.create(url)); verify(networkStore).store(any(ActiveNode.class)); }
@Test public void onUpdateIgnoreKeysNotOwnedBySender() { String uri = "http: PublicKey key = mock(PublicKey.class); PublicKey key2 = mock(PublicKey.class); Recipient recipient = Recipient.of(key, uri); Recipient other = Recipient.of(key2, "http: List<Recipient> recipients = List.of(recipient, other); NodeInfo nodeInfo = NodeInfo.Builder.create() .withUrl(uri) .withRecipients(recipients) .withSupportedApiVersions(List.of("Two", "Fifty")) .build(); List<ActiveNode> storedNodes = new ArrayList<>(); doAnswer( invocation -> { storedNodes.add(invocation.getArgument(0)); return null; }) .when(networkStore) .store(any(ActiveNode.class)); discovery.onUpdate(nodeInfo); assertThat(storedNodes).hasSize(1); ActiveNode result = storedNodes.iterator().next(); assertThat(result.getUri()).isEqualTo(NodeUri.create(uri)); assertThat(result.getKeys()).containsExactly(key); assertThat(result.getSupportedVersions()).containsExactlyInAnyOrder("Two", "Fifty"); verify(networkStore).store(any(ActiveNode.class)); }