1 @file:Suppress("DEPRECATION")
3 package net.pterodactylus.sone.fcp
5 import freenet.pluginmanager.PluginNotFoundException
6 import freenet.pluginmanager.PluginReplySender
7 import freenet.support.SimpleFieldSet
8 import net.pterodactylus.sone.core.Core
9 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired
10 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired.ALWAYS
11 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired.NO
12 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired.WRITING
13 import net.pterodactylus.sone.fcp.event.FcpInterfaceActivatedEvent
14 import net.pterodactylus.sone.fcp.event.FcpInterfaceDeactivatedEvent
15 import net.pterodactylus.sone.fcp.event.FullAccessRequiredChanged
16 import net.pterodactylus.sone.freenet.fcp.Command.AccessType.FULL_FCP
17 import net.pterodactylus.sone.freenet.fcp.Command.AccessType.RESTRICTED_FCP
18 import net.pterodactylus.sone.main.SonePlugin
19 import net.pterodactylus.sone.test.capture
20 import net.pterodactylus.sone.test.mock
21 import net.pterodactylus.sone.test.whenever
22 import org.hamcrest.MatcherAssert.assertThat
23 import org.hamcrest.Matchers.equalTo
25 import org.mockito.ArgumentMatchers
26 import org.mockito.Mockito.verify
29 * Unit test for [FcpInterface] and its subclasses.
31 class FcpInterfaceTest {
33 private val core = mock<Core>()
34 private val fcpInterface = FcpInterface(core)
35 private val pluginReplySender = mock<PluginReplySender>()
36 private val parameters = SimpleFieldSet(true)
37 private val replyParameters = capture<SimpleFieldSet>()
40 fun `fcp interface can be activated`() {
41 fcpInterface.fcpInterfaceActivated(FcpInterfaceActivatedEvent())
42 assertThat(fcpInterface.isActive, equalTo(true))
46 fun `fcp interface can be deactivated`() {
47 fcpInterface.fcpInterfaceDeactivated(FcpInterfaceDeactivatedEvent())
48 assertThat(fcpInterface.isActive, equalTo(false))
51 private fun setAndVerifyAccessRequired(fullAccessRequired: FullAccessRequired) {
52 fcpInterface.fullAccessRequiredChanged(FullAccessRequiredChanged(fullAccessRequired))
53 assertThat(fcpInterface.fullAccessRequired, equalTo(fullAccessRequired))
57 fun `set full access required can set access to no`() {
58 setAndVerifyAccessRequired(NO)
62 fun `set full access required can set access to writing`() {
63 setAndVerifyAccessRequired(WRITING)
67 fun `set full access required can set access to always`() {
68 setAndVerifyAccessRequired(ALWAYS)
72 fun `sending command to inactive fcp interface results in 400 error reply`() {
73 fcpInterface.fcpInterfaceDeactivated(FcpInterfaceDeactivatedEvent())
74 fcpInterface.handle(pluginReplySender, parameters, null, 0)
75 verify(pluginReplySender).send(replyParameters.capture())
76 assertThat(replyParameters.value["Message"], equalTo("Error"))
77 assertThat(replyParameters.value["ErrorCode"], equalTo("503"))
81 fun `exception while sending reply does not result in exception`() {
82 fcpInterface.fcpInterfaceDeactivated(FcpInterfaceDeactivatedEvent())
83 whenever(pluginReplySender.send(ArgumentMatchers.any())).thenThrow(PluginNotFoundException::class.java)
84 fcpInterface.handle(pluginReplySender, parameters, null, 0)
88 fun `sending command over restricted fcp connection results in 401 error reply`() {
89 fcpInterface.fcpInterfaceActivated(FcpInterfaceActivatedEvent())
90 fcpInterface.handle(pluginReplySender, parameters, null, RESTRICTED_FCP.ordinal)
91 verify(pluginReplySender).send(replyParameters.capture())
92 assertThat(replyParameters.value["Message"], equalTo("Error"))
93 assertThat(replyParameters.value["ErrorCode"], equalTo("401"))
97 fun `sending unknown command over full access connection results in 404 error reply`() {
98 fcpInterface.fcpInterfaceActivated(FcpInterfaceActivatedEvent())
99 fcpInterface.handle(pluginReplySender, parameters, null, FULL_FCP.ordinal)
100 verify(pluginReplySender).send(replyParameters.capture())
101 assertThat(replyParameters.value["Message"], equalTo("Error"))
102 assertThat(replyParameters.value["ErrorCode"], equalTo("404"))
106 fun `sending version command without identifier results in 400 error code`() {
107 fcpInterface.fcpInterfaceActivated(FcpInterfaceActivatedEvent())
108 parameters.putSingle("Message", "Version")
109 fcpInterface.handle(pluginReplySender, parameters, null, FULL_FCP.ordinal)
110 verify(pluginReplySender).send(replyParameters.capture())
111 assertThat(replyParameters.value["Message"], equalTo("Error"))
112 assertThat(replyParameters.value["ErrorCode"], equalTo("400"))
116 fun `sending version command with empty identifier results in 400 error code`() {
117 fcpInterface.fcpInterfaceActivated(FcpInterfaceActivatedEvent())
118 parameters.putSingle("Message", "Version")
119 parameters.putSingle("Identifier", "")
120 fcpInterface.handle(pluginReplySender, parameters, null, FULL_FCP.ordinal)
121 verify(pluginReplySender).send(replyParameters.capture())
122 assertThat(replyParameters.value["Message"], equalTo("Error"))
123 assertThat(replyParameters.value["ErrorCode"], equalTo("400"))
127 fun `sending version command with identifier results in version reply`() {
128 fcpInterface.fcpInterfaceActivated(FcpInterfaceActivatedEvent())
129 parameters.putSingle("Message", "Version")
130 parameters.putSingle("Identifier", "Test")
131 fcpInterface.handle(pluginReplySender, parameters, null, FULL_FCP.ordinal)
132 verify(pluginReplySender).send(replyParameters.capture())
133 assertThat(replyParameters.value["Message"], equalTo("Version"))
134 assertThat(replyParameters.value["Version"], equalTo(SonePlugin.getPluginVersion()))
135 assertThat(replyParameters.value["ProtocolVersion"], equalTo("1"))