Increase test coverage.
[Sone.git] / src / test / java / net / pterodactylus / sone / core / WebOfTrustUpdaterTest.java
1 package net.pterodactylus.sone.core;
2
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;
13
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;
21
22 import org.junit.Test;
23
24 /**
25  * Unit test for {@link WebOfTrustUpdater} and its subclasses.
26  *
27  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
28  */
29 public class WebOfTrustUpdaterTest {
30
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);
40
41         private WebOfTrustUpdateJob createWebOfTrustUpdateJob(final boolean success) {
42                 return webOfTrustUpdater.new WebOfTrustUpdateJob() {
43                         @Override
44                         public void run() {
45                                 super.run();
46                                 try {
47                                         sleep(100);
48                                 } catch (InterruptedException ie1) {
49                                         throw new RuntimeException(ie1);
50                                 }
51                                 finish(success);
52                         }
53                 };
54         }
55
56         @Test
57         public void webOfTrustUpdateJobWaitsUntilFinishedHasBeenCalledAndReturnsSuccess() throws InterruptedException {
58                 new Thread(successfulWebOfTrustUpdateJob).start();
59                 assertThat(successfulWebOfTrustUpdateJob.waitForCompletion(), is(true));
60         }
61
62         @Test
63         public void webOfTrustUpdateJobWaitsUntilFinishedHasBeenCalledAndReturnsFailure() throws InterruptedException {
64                 new Thread(failingWebOfTrustUpdateJob).start();
65                 assertThat(failingWebOfTrustUpdateJob.waitForCompletion(), is(false));
66         }
67
68         @Test
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()));
74         }
75
76         @Test
77         public void webOfTrustContextUpdatesJobsAreNotEqualIfTheirClassDiffers() {
78                 assertThat(contextUpdateJob.equals(addContextJob), is(false));
79         }
80
81         @Test
82         public void webOfTrustContextUpdateJobToStringContainsIdentityAndContext() {
83                 assertThat(contextUpdateJob.toString(), containsString(ownIdentity.toString()));
84                 assertThat(contextUpdateJob.toString(), containsString(CONTEXT));
85         }
86
87         @Test
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));
93         }
94
95         @Test
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));
100         }
101
102         @Test
103         public void webOfTrustContextUpdateJobsAreNotEqualToNull() {
104                 assertThat(contextUpdateJob.equals(null), is(false));
105         }
106
107         @Test
108         public void addContextJobAddsTheContext() throws PluginException {
109                 addContextJob.run();
110                 verify(webOfTrustConnector).addContext(eq(ownIdentity), eq(CONTEXT));
111                 verify(ownIdentity).addContext(eq(CONTEXT));
112                 assertThat(addContextJob.waitForCompletion(), is(true));
113         }
114
115         @Test
116         public void exceptionWhileAddingAContextIsExposed() throws PluginException {
117                 doThrow(PluginException.class).when(webOfTrustConnector).addContext(eq(ownIdentity), eq(CONTEXT));
118                 addContextJob.run();
119                 verify(webOfTrustConnector).addContext(eq(ownIdentity), eq(CONTEXT));
120                 verify(ownIdentity, never()).addContext(eq(CONTEXT));
121                 assertThat(addContextJob.waitForCompletion(), is(false));
122         }
123
124         @Test
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));
130         }
131
132         @Test
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));
139         }
140
141 }