1 package net.pterodactylus.sone.core;
3 import static java.lang.Thread.sleep;
4 import static org.hamcrest.MatcherAssert.assertThat;
5 import static org.hamcrest.Matchers.containsString;
6 import static org.hamcrest.Matchers.is;
7 import static org.mockito.Matchers.eq;
8 import static org.mockito.Mockito.doThrow;
9 import static org.mockito.Mockito.mock;
10 import static org.mockito.Mockito.never;
11 import static org.mockito.Mockito.verify;
12 import static org.mockito.Mockito.when;
14 import net.pterodactylus.sone.core.WebOfTrustUpdater.AddContextJob;
15 import net.pterodactylus.sone.core.WebOfTrustUpdater.RemoveContextJob;
16 import net.pterodactylus.sone.core.WebOfTrustUpdater.WebOfTrustContextUpdateJob;
17 import net.pterodactylus.sone.core.WebOfTrustUpdater.WebOfTrustUpdateJob;
18 import net.pterodactylus.sone.freenet.plugin.PluginException;
19 import net.pterodactylus.sone.freenet.wot.OwnIdentity;
20 import net.pterodactylus.sone.freenet.wot.WebOfTrustConnector;
22 import org.junit.Test;
25 * Unit test for {@link WebOfTrustUpdater} and its subclasses.
27 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
29 public class WebOfTrustUpdaterTest {
31 private static final String CONTEXT = "test-context";
32 private final WebOfTrustConnector webOfTrustConnector = mock(WebOfTrustConnector.class);
33 private final WebOfTrustUpdater webOfTrustUpdater = new WebOfTrustUpdater(webOfTrustConnector);
34 private final OwnIdentity ownIdentity = when(mock(OwnIdentity.class).getId()).thenReturn("own-identity-id").getMock();
35 private final WebOfTrustUpdateJob successfulWebOfTrustUpdateJob = createWebOfTrustUpdateJob(true);
36 private final WebOfTrustUpdateJob failingWebOfTrustUpdateJob = createWebOfTrustUpdateJob(false);
37 private final WebOfTrustContextUpdateJob contextUpdateJob = webOfTrustUpdater.new WebOfTrustContextUpdateJob(ownIdentity, CONTEXT);
38 private final AddContextJob addContextJob = webOfTrustUpdater.new AddContextJob(ownIdentity, CONTEXT);
39 private final RemoveContextJob removeContextJob = webOfTrustUpdater.new RemoveContextJob(ownIdentity, CONTEXT);
41 private WebOfTrustUpdateJob createWebOfTrustUpdateJob(final boolean success) {
42 return webOfTrustUpdater.new WebOfTrustUpdateJob() {
48 } catch (InterruptedException ie1) {
49 throw new RuntimeException(ie1);
57 public void webOfTrustUpdateJobWaitsUntilFinishedHasBeenCalledAndReturnsSuccess() throws InterruptedException {
58 new Thread(successfulWebOfTrustUpdateJob).start();
59 assertThat(successfulWebOfTrustUpdateJob.waitForCompletion(), is(true));
63 public void webOfTrustUpdateJobWaitsUntilFinishedHasBeenCalledAndReturnsFailure() throws InterruptedException {
64 new Thread(failingWebOfTrustUpdateJob).start();
65 assertThat(failingWebOfTrustUpdateJob.waitForCompletion(), is(false));
69 public void webOfTrustContextUpdateJobsAreEqualIfTheirClassOwnIdentityAndContextAreEqual() {
70 WebOfTrustContextUpdateJob secondContextUpdateJob = webOfTrustUpdater.new WebOfTrustContextUpdateJob(ownIdentity, CONTEXT);
71 assertThat(contextUpdateJob.equals(secondContextUpdateJob), is(true));
72 assertThat(secondContextUpdateJob.equals(contextUpdateJob), is(true));
73 assertThat(contextUpdateJob.hashCode(), is(secondContextUpdateJob.hashCode()));
77 public void webOfTrustContextUpdatesJobsAreNotEqualIfTheirClassDiffers() {
78 assertThat(contextUpdateJob.equals(addContextJob), is(false));
82 public void webOfTrustContextUpdateJobToStringContainsIdentityAndContext() {
83 assertThat(contextUpdateJob.toString(), containsString(ownIdentity.toString()));
84 assertThat(contextUpdateJob.toString(), containsString(CONTEXT));
88 public void webOfTrustContextUpdateJobsAreNotEqualIfTheIdentitiesDiffer() {
89 OwnIdentity ownIdentity = mock(OwnIdentity.class);
90 WebOfTrustContextUpdateJob secondContextUpdateJob = webOfTrustUpdater.new WebOfTrustContextUpdateJob(ownIdentity, CONTEXT);
91 assertThat(contextUpdateJob.equals(secondContextUpdateJob), is(false));
92 assertThat(secondContextUpdateJob.equals(contextUpdateJob), is(false));
96 public void webOfTrustContextUpdateJobsAreNotEqualIfTheirContextsDiffer() {
97 WebOfTrustContextUpdateJob secondContextUpdateJob = webOfTrustUpdater.new WebOfTrustContextUpdateJob(ownIdentity, CONTEXT + CONTEXT);
98 assertThat(contextUpdateJob.equals(secondContextUpdateJob), is(false));
99 assertThat(secondContextUpdateJob.equals(contextUpdateJob), is(false));
103 public void webOfTrustContextUpdateJobsAreNotEqualToNull() {
104 assertThat(contextUpdateJob.equals(null), is(false));
108 public void addContextJobAddsTheContext() throws PluginException {
110 verify(webOfTrustConnector).addContext(eq(ownIdentity), eq(CONTEXT));
111 verify(ownIdentity).addContext(eq(CONTEXT));
112 assertThat(addContextJob.waitForCompletion(), is(true));
116 public void exceptionWhileAddingAContextIsExposed() throws PluginException {
117 doThrow(PluginException.class).when(webOfTrustConnector).addContext(eq(ownIdentity), eq(CONTEXT));
119 verify(webOfTrustConnector).addContext(eq(ownIdentity), eq(CONTEXT));
120 verify(ownIdentity, never()).addContext(eq(CONTEXT));
121 assertThat(addContextJob.waitForCompletion(), is(false));
125 public void removeContextJobRemovesTheContext() throws PluginException {
126 removeContextJob.run();
127 verify(webOfTrustConnector).removeContext(eq(ownIdentity), eq(CONTEXT));
128 verify(ownIdentity).removeContext(eq(CONTEXT));
129 assertThat(removeContextJob.waitForCompletion(), is(true));
133 public void exceptionWhileRemovingAContextIsExposed() throws PluginException {
134 doThrow(PluginException.class).when(webOfTrustConnector).removeContext(eq(ownIdentity), eq(CONTEXT));
135 removeContextJob.run();
136 verify(webOfTrustConnector).removeContext(eq(ownIdentity), eq(CONTEXT));
137 verify(ownIdentity, never()).removeContext(eq(CONTEXT));
138 assertThat(removeContextJob.waitForCompletion(), is(false));