9e9df1638daabab9e68f8cfac5d979a8dbc01d90
[Sone.git] / src / test / java / net / pterodactylus / sone / fcp / FcpInterfaceTest.kt
1 @file:Suppress("DEPRECATION")
2
3 package net.pterodactylus.sone.fcp
4
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
24 import org.junit.Test
25 import org.mockito.ArgumentMatchers
26 import org.mockito.Mockito.verify
27
28 /**
29  * Unit test for [FcpInterface] and its subclasses.
30  */
31 class FcpInterfaceTest {
32
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>()
38
39         @Test
40         fun `fcp interface can be activated`() {
41                 fcpInterface.fcpInterfaceActivated(FcpInterfaceActivatedEvent())
42                 assertThat(fcpInterface.isActive, equalTo(true))
43         }
44
45         @Test
46         fun `fcp interface can be deactivated`() {
47                 fcpInterface.fcpInterfaceDeactivated(FcpInterfaceDeactivatedEvent())
48                 assertThat(fcpInterface.isActive, equalTo(false))
49         }
50
51         private fun setAndVerifyAccessRequired(fullAccessRequired: FullAccessRequired) {
52                 fcpInterface.fullAccessRequiredChanged(FullAccessRequiredChanged(fullAccessRequired))
53                 assertThat(fcpInterface.fullAccessRequired, equalTo(fullAccessRequired))
54         }
55
56         @Test
57         fun `set full access required can set access to no`() {
58                 setAndVerifyAccessRequired(NO)
59         }
60
61         @Test
62         fun `set full access required can set access to writing`() {
63                 setAndVerifyAccessRequired(WRITING)
64         }
65
66         @Test
67         fun `set full access required can set access to always`() {
68                 setAndVerifyAccessRequired(ALWAYS)
69         }
70
71         @Test
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"))
78         }
79
80         @Test
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)
85         }
86
87         @Test
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"))
94         }
95
96         @Test
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"))
103         }
104
105         @Test
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"))
113         }
114
115         @Test
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"))
124         }
125
126         @Test
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"))
136         }
137
138 }