♻️ Extract interface for plugin connector
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / freenet / plugin / FredPluginConnectorTest.kt
1 /* EventBus and Subscribe are marked @Beta, ignore that. And Fred stuff is
2  * often marked as deprecated even though there is no replacement. */
3 @file:Suppress("UnstableApiUsage", "DEPRECATION")
4
5 package net.pterodactylus.sone.freenet.plugin
6
7 import com.google.common.eventbus.*
8 import freenet.pluginmanager.*
9 import freenet.support.*
10 import freenet.support.api.*
11 import freenet.support.io.*
12 import net.pterodactylus.sone.freenet.*
13 import net.pterodactylus.sone.freenet.plugin.event.*
14 import org.hamcrest.MatcherAssert.*
15 import org.hamcrest.Matchers.*
16 import org.junit.*
17 import org.junit.rules.*
18
19 /**
20  * Unit test for [PluginConnector].
21  */
22 class PluginConnectorTest {
23
24         @Rule
25         @JvmField
26         val expectedException = ExpectedException.none()!!
27
28         private val eventBus = EventBus()
29         private val pluginRespirator = object : PluginRespiratorFacade {
30                 val call1Parameters = mutableListOf<Call1Parameters>()
31                 val call2Parameters = mutableListOf<Call2Parameters>()
32                 override fun getPluginTalker(pluginTalker: FredPluginTalker, pluginName: String, identifier: String) =
33                                 if ("wrong" in pluginName) {
34                                         throw PluginNotFoundException()
35                                 } else {
36                                         object : PluginTalkerFacade {
37                                                 override fun send(pluginParameters: SimpleFieldSet, data: Bucket?) = Unit
38                                                                 .also { call2Parameters += Call2Parameters(pluginParameters, data) }
39                                         }.also { call1Parameters += Call1Parameters(pluginTalker, pluginName, identifier) }
40                                 }
41         }
42         private val pluginConnector = FredPluginConnector(eventBus, pluginRespirator)
43
44         @Test
45         fun `sending request calls correct method on plugin respirator`() {
46                 pluginConnector.sendRequest("test.plugin", "test-request-1", fields)
47                 assertThat(pluginRespirator.call1Parameters, hasSize(1))
48                 assertThat(pluginRespirator.call1Parameters[0].pluginTalker, sameInstance<FredPluginTalker>(pluginConnector))
49                 assertThat(pluginRespirator.call1Parameters[0].pluginName, equalTo("test.plugin"))
50                 assertThat(pluginRespirator.call1Parameters[0].identifier, equalTo("test-request-1"))
51         }
52
53         @Test
54         fun `sending request with bucket calls correct method on plugin respirator`() {
55                 pluginConnector.sendRequest("test.plugin", "test-request-1", fields, data)
56                 assertThat(pluginRespirator.call1Parameters, hasSize(1))
57                 assertThat(pluginRespirator.call1Parameters[0].pluginTalker, sameInstance<FredPluginTalker>(pluginConnector))
58                 assertThat(pluginRespirator.call1Parameters[0].pluginName, equalTo("test.plugin"))
59                 assertThat(pluginRespirator.call1Parameters[0].identifier, equalTo("test-request-1"))
60         }
61
62         @Test
63         fun `sending request to incorrect plugin translates exception correctly`() {
64                 expectedException.expect(PluginException::class.java)
65                 pluginConnector.sendRequest("wrong.plugin", "test-request-1", fields)
66         }
67
68         @Test
69         fun `sending request with bucket to incorrect plugin translates exception correctly`() {
70                 expectedException.expect(PluginException::class.java)
71                 pluginConnector.sendRequest("wrong.plugin", "test-request-1", fields, data)
72         }
73
74         @Test
75         fun `sending request calls correct method on plugin talker`() {
76                 pluginConnector.sendRequest("test.plugin", "test-request-1", fields)
77                 assertThat(pluginRespirator.call2Parameters, hasSize(1))
78                 assertThat(pluginRespirator.call2Parameters[0].pluginParameters, equalTo(fields))
79                 assertThat(pluginRespirator.call2Parameters[0].data, nullValue())
80         }
81
82         @Test
83         fun `sending request with bucket calls correct method on plugin talker`() {
84                 pluginConnector.sendRequest("test.plugin", "test-request-1", fields, data)
85                 assertThat(pluginRespirator.call2Parameters, hasSize(1))
86                 assertThat(pluginRespirator.call2Parameters[0].pluginParameters, equalTo(fields))
87                 assertThat(pluginRespirator.call2Parameters[0].data, equalTo<Bucket?>(data))
88         }
89
90         @Test
91         fun `reply is sent to event bus correctly`() {
92                 val listener = object {
93                         val receivedReplyEvents = mutableListOf<ReceivedReplyEvent>()
94                         @Subscribe
95                         fun onReply(receivedReplyEvent: ReceivedReplyEvent) = Unit.also { receivedReplyEvents += receivedReplyEvent }
96                 }
97                 eventBus.register(listener)
98                 pluginConnector.onReply("test.plugin", "test-request-1", fields, data)
99                 assertThat(listener.receivedReplyEvents, hasSize(1))
100                 assertThat(listener.receivedReplyEvents[0].pluginName(), equalTo("test.plugin"))
101                 assertThat(listener.receivedReplyEvents[0].identifier(), equalTo("test-request-1"))
102                 assertThat(listener.receivedReplyEvents[0].fieldSet(), equalTo(fields))
103                 assertThat(listener.receivedReplyEvents[0].data(), equalTo<Bucket?>(data))
104         }
105
106 }
107
108 private val fields = SimpleFieldSetBuilder().put("foo", "bar").get()
109 private val data = ArrayBucket(byteArrayOf(1, 2))
110
111 private data class Call1Parameters(val pluginTalker: FredPluginTalker, val pluginName: String, val identifier: String)
112 private data class Call2Parameters(val pluginParameters: SimpleFieldSet, val data: Bucket?)