1 package net.pterodactylus.sone.freenet.wot
3 import freenet.support.*
4 import freenet.support.api.*
5 import net.pterodactylus.sone.freenet.*
6 import net.pterodactylus.sone.freenet.plugin.*
7 import net.pterodactylus.sone.test.*
9 import org.hamcrest.MatcherAssert.*
10 import org.hamcrest.Matchers.*
11 import org.hamcrest.core.*
15 * Unit test for [PluginWebOfTrustConnector].
17 class PluginWebOfTrustConnectorTest {
19 private val ownIdentity = DefaultOwnIdentity("id", "nickname", "requestUri", "insertUri")
22 fun `wot plugin can be pinged`() {
23 createPluginConnector("Ping")
28 fun `own identities are returned correctly`() {
29 val ownIdentities = createPluginConnector("GetOwnIdentities") {
30 put("Identity0", "id-0")
31 put("RequestURI0", "request-uri-0")
32 put("InsertURI0", "insert-uri-0")
33 put("Nickname0", "nickname-0")
34 put("Contexts0.Context0", "id-0-context-0")
35 put("Properties0.Property0.Name", "id-0-property-0-name")
36 put("Properties0.Property0.Value", "id-0-property-0-value")
37 put("Identity1", "id-1")
38 put("RequestURI1", "request-uri-1")
39 put("InsertURI1", "insert-uri-1")
40 put("Nickname1", "nickname-1")
41 put("Contexts1.Context0", "id-1-context-0")
42 put("Properties1.Property0.Name", "id-1-property-0-name")
43 put("Properties1.Property0.Value", "id-1-property-0-value")
44 }.connect { loadAllOwnIdentities() }
45 assertThat(ownIdentities, containsInAnyOrder(
46 isOwnIdentity("id-0", "nickname-0", "request-uri-0", "insert-uri-0", contains("id-0-context-0"), hasEntry("id-0-property-0-name", "id-0-property-0-value")),
47 isOwnIdentity("id-1", "nickname-1", "request-uri-1", "insert-uri-1", contains("id-1-context-0"), hasEntry("id-1-property-0-name", "id-1-property-0-value"))
52 fun `trusted identities are requested with correct own identity`() {
53 createPluginConnector("GetIdentitiesByScore", hasField("Truster", equalTo("id")))
54 .connect { loadTrustedIdentities(ownIdentity) }
58 fun `trusted identities are requested with correct selection parameter`() {
59 createPluginConnector("GetIdentitiesByScore", hasField("Selection", equalTo("+")))
60 .connect { loadTrustedIdentities(ownIdentity) }
64 fun `trusted identities are requested with empty context if null context requested`() {
65 createPluginConnector("GetIdentitiesByScore", hasField("Context", equalTo("")))
66 .connect { loadTrustedIdentities(ownIdentity) }
70 fun `trusted identities are requested with context if context requested`() {
71 createPluginConnector("GetIdentitiesByScore", hasField("Context", equalTo("TestContext")))
72 .connect { loadTrustedIdentities(ownIdentity, "TestContext") }
76 fun `trusted identities are requested with trust values`() {
77 createPluginConnector("GetIdentitiesByScore", hasField("WantTrustValues", equalTo("true")))
78 .connect { loadTrustedIdentities(ownIdentity) }
82 fun `empty list of trusted identities is returned correctly`() {
83 val trustedIdentities = createPluginConnector("GetIdentitiesByScore")
84 .connect { loadTrustedIdentities(ownIdentity) }
85 assertThat(trustedIdentities, empty())
89 fun `trusted identities without context, properties, or trust value are returned correctly`() {
90 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
91 put("Identity0", "id0")
92 put("Nickname0", "nickname0")
93 put("RequestURI0", "request-uri0")
94 put("Identity1", "id1")
95 put("Nickname1", "nickname1")
96 put("RequestURI1", "request-uri1")
97 }.connect { loadTrustedIdentities(ownIdentity) }
98 assertThat(trustedIdentities, contains(
100 isIdentity("id0", "nickname0", "request-uri0", empty<String>(), isEmptyMap()),
101 isTrusted(ownIdentity, isTrust(null, null, null))
104 isIdentity("id1", "nickname1", "request-uri1", empty<String>(), isEmptyMap()),
105 isTrusted(ownIdentity, isTrust(null, null, null))
111 fun `trusted identity without nickname is returned correctly`() {
112 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
113 put("Identity0", "id0")
114 put("RequestURI0", "request-uri0")
115 }.connect { loadTrustedIdentities(ownIdentity) }
116 assertThat(trustedIdentities, contains(
118 isIdentity("id0", null, "request-uri0", empty<String>(), isEmptyMap()),
119 isTrusted(ownIdentity, isTrust(null, null, null))
125 fun `trusted identity with contexts is returned correctly`() {
126 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
127 put("Identity0", "id0")
128 put("Nickname0", "nickname0")
129 put("RequestURI0", "request-uri0")
130 put("Contexts0.Context0", "Context0")
131 put("Contexts0.Context1", "Context1")
132 }.connect { loadTrustedIdentities(ownIdentity) }
133 assertThat(trustedIdentities, contains(
134 isIdentity("id0", "nickname0", "request-uri0", containsInAnyOrder("Context0", "Context1"), isEmptyMap())
139 fun `trusted identity with properties is returned correctly`() {
140 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
141 put("Identity0", "id0")
142 put("Nickname0", "nickname0")
143 put("RequestURI0", "request-uri0")
144 put("Properties0.Property0.Name", "foo")
145 put("Properties0.Property0.Value", "bar")
146 put("Properties0.Property1.Name", "baz")
147 put("Properties0.Property1.Value", "quo")
148 }.connect { loadTrustedIdentities(ownIdentity) }
149 assertThat(trustedIdentities, contains(
150 isIdentity("id0", "nickname0", "request-uri0", empty(), allOf(hasEntry("foo", "bar"), hasEntry("baz", "quo")))
155 fun `trusted identity with trust value is returned correctly`() {
156 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
157 put("Identity0", "id0")
158 put("Nickname0", "nickname0")
159 put("RequestURI0", "request-uri0")
163 }.connect { loadTrustedIdentities(ownIdentity) }
164 assertThat(trustedIdentities, contains(
166 isIdentity("id0", "nickname0", "request-uri0", empty(), isEmptyMap()),
167 isTrusted(ownIdentity, isTrust(12, 34, 56))
173 fun `adding a context sends the correct own identity id`() {
174 createPluginConnector("AddContext", hasField("Identity", equalTo(ownIdentity.id)))
175 .connect { addContext(ownIdentity, "TestContext") }
179 fun `adding a context sends the correct context`() {
180 createPluginConnector("AddContext", hasField("Context", equalTo("TestContext")))
181 .connect { addContext(ownIdentity, "TestContext") }
185 fun `removing a context sends the correct own identity id`() {
186 createPluginConnector("RemoveContext", hasField("Identity", equalTo(ownIdentity.id)))
187 .connect { removeContext(ownIdentity, "TestContext") }
191 fun `removing a context sends the correct context`() {
192 createPluginConnector("RemoveContext", hasField("Context", equalTo("TestContext")))
193 .connect { removeContext(ownIdentity, "TestContext") }
197 fun `setting a property sends the correct identity id`() {
198 createPluginConnector("SetProperty", hasField("Identity", equalTo(ownIdentity.id)))
199 .connect { setProperty(ownIdentity, "TestProperty", "TestValue") }
203 fun `setting a property sends the correct property name`() {
204 createPluginConnector("SetProperty", hasField("Property", equalTo("TestProperty")))
205 .connect { setProperty(ownIdentity, "TestProperty", "TestValue") }
209 fun `setting a property sends the correct property value`() {
210 createPluginConnector("SetProperty", hasField("Value", equalTo("TestValue")))
211 .connect { setProperty(ownIdentity, "TestProperty", "TestValue") }
215 fun `removing a property sends the correct identity id`() {
216 createPluginConnector("RemoveProperty", hasField("Identity", equalTo(ownIdentity.id)))
217 .connect { removeProperty(ownIdentity, "TestProperty") }
221 fun `removing a property sends the correct property name`() {
222 createPluginConnector("RemoveProperty", hasField("Property", equalTo("TestProperty")))
223 .connect { removeProperty(ownIdentity, "TestProperty") }
228 private fun <R> PluginConnector.connect(block: PluginWebOfTrustConnector.() -> R) =
229 PluginWebOfTrustConnector(this).let(block)
231 fun createPluginConnector(message: String, fieldsMatcher: Matcher<SimpleFieldSet> = IsAnything<SimpleFieldSet>(), build: SimpleFieldSetBuilder.() -> Unit = {}) =
232 object : PluginConnector {
233 override suspend fun sendRequest(pluginName: String, fields: SimpleFieldSet, data: Bucket?) =
234 if ((pluginName != wotPluginName) || (fields.get("Message") != message)) {
235 throw PluginException()
237 assertThat(fields, fieldsMatcher)
238 PluginReply(SimpleFieldSetBuilder().apply(build).get(), null)
242 private const val wotPluginName = "plugins.WebOfTrust.WebOfTrust"