Add unit test for PluginConnector.
[Sone.git] / src / test / java / net / pterodactylus / sone / freenet / plugin / PluginConnectorTest.java
1 /*
2  * Sone - PluginConnectorTest.java - Copyright © 2013 David Roden
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 package net.pterodactylus.sone.freenet.plugin;
19
20 import static org.mockito.Matchers.argThat;
21 import static org.mockito.Matchers.eq;
22 import static org.mockito.Mockito.mock;
23 import static org.mockito.Mockito.verify;
24 import static org.mockito.Mockito.when;
25
26 import net.pterodactylus.sone.Matchers;
27 import net.pterodactylus.sone.freenet.SimpleFieldSetBuilder;
28 import net.pterodactylus.sone.freenet.StringBucket;
29 import net.pterodactylus.sone.freenet.plugin.event.ReceivedReplyEvent;
30
31 import freenet.pluginmanager.PluginNotFoundException;
32 import freenet.pluginmanager.PluginRespirator;
33 import freenet.pluginmanager.PluginTalker;
34 import freenet.support.SimpleFieldSet;
35 import freenet.support.api.Bucket;
36
37 import com.google.common.eventbus.EventBus;
38 import org.hamcrest.Description;
39 import org.hamcrest.Matcher;
40 import org.hamcrest.TypeSafeMatcher;
41 import org.junit.Test;
42
43 /**
44  * Unit test for {@link PluginConnector}.
45  *
46  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
47  */
48 public class PluginConnectorTest {
49
50         private static final String PLUGIN_NAME = "org.example.plugin";
51         private static final String IDENTIFIER = "Some-Identifier-17";
52
53         private final EventBus eventBus = mock(EventBus.class);
54         private final PluginRespirator pluginRespirator = mock(PluginRespirator.class);
55         private final PluginConnector pluginConnector = new PluginConnector(eventBus, pluginRespirator);
56
57         @Test
58         public void canSendRequest() throws PluginException, PluginNotFoundException {
59                 SimpleFieldSet fieldSet = new SimpleFieldSetBuilder().put("Length", "35").get();
60                 Bucket data = new StringBucket("Test");
61                 PluginTalker pluginTalker = mock(PluginTalker.class);
62                 when(pluginRespirator.getPluginTalker(pluginConnector, PLUGIN_NAME, IDENTIFIER)).thenReturn(pluginTalker);
63                 pluginConnector.sendRequest(PLUGIN_NAME, IDENTIFIER, fieldSet, data);
64                 verify(pluginTalker).send(argThat(Matchers.matches(fieldSet)), eq(data));
65         }
66
67         @Test(expected = PluginException.class)
68         public void unknownPluginNameCausesAnError() throws PluginNotFoundException, PluginException {
69                 when(pluginRespirator.getPluginTalker(pluginConnector, PLUGIN_NAME, IDENTIFIER)).thenThrow(PluginNotFoundException.class);
70                 pluginConnector.sendRequest(PLUGIN_NAME, IDENTIFIER, null, null);
71         }
72
73         @Test
74         public void replyIsPostedToEventBus() {
75                 SimpleFieldSet fieldSet = new SimpleFieldSetBuilder().put("Length", "35").get();
76                 Bucket data = new StringBucket("Test");
77                 pluginConnector.onReply(PLUGIN_NAME, IDENTIFIER, fieldSet, data);
78                 verify(eventBus).post(argThat(matches(pluginConnector, PLUGIN_NAME, IDENTIFIER, fieldSet, data)));
79         }
80
81         private static Matcher<ReceivedReplyEvent> matches(final PluginConnector pluginConnector, final String pluginName, final String identitier, final SimpleFieldSet fieldSet, final Bucket data) {
82                 return new TypeSafeMatcher<ReceivedReplyEvent>() {
83                         @Override
84                         protected boolean matchesSafely(ReceivedReplyEvent receivedReplyEvent) {
85                                 if (receivedReplyEvent.pluginConnector() != pluginConnector) {
86                                         return false;
87                                 }
88                                 if (!receivedReplyEvent.pluginName().equals(pluginName)) {
89                                         return false;
90                                 }
91                                 if (!receivedReplyEvent.identifier().equals(identitier)) {
92                                         return false;
93                                 }
94                                 if (!Matchers.matches(fieldSet).matches(receivedReplyEvent.fieldSet())) {
95                                         return false;
96                                 }
97                                 if (data != receivedReplyEvent.data()) {
98                                         return false;
99                                 }
100                                 return true;
101                         }
102
103                         @Override
104                         public void describeTo(Description description) {
105                         }
106                 };
107         }
108
109 }