2 * Sone - IdentityLoaderTest.kt - Copyright © 2013–2020 David Roden
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.
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.
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/>.
18 package net.pterodactylus.sone.freenet.wot
20 import org.hamcrest.MatcherAssert.assertThat
21 import org.hamcrest.Matchers.containsInAnyOrder
22 import org.hamcrest.Matchers.equalTo
23 import org.hamcrest.Matchers.hasSize
24 import org.hamcrest.Matchers.notNullValue
28 * Unit test for [IdentityLoader].
30 class IdentityLoaderTest {
32 private val ownIdentities = createOwnIdentities()
33 private val webOfTrustConnector = object : TestWebOfTrustConnector() {
34 override fun loadAllOwnIdentities() = ownIdentities.toSet()
35 override fun loadTrustedIdentities(ownIdentity: OwnIdentity, context: String?) =
37 ownIdentities[0] -> createTrustedIdentitiesForFirstOwnIdentity()
38 ownIdentities[1] -> createTrustedIdentitiesForSecondOwnIdentity()
39 ownIdentities[2] -> createTrustedIdentitiesForThirdOwnIdentity()
40 ownIdentities[3] -> createTrustedIdentitiesForFourthOwnIdentity()
41 else -> throw RuntimeException()
46 fun loadingIdentities() {
47 val identityLoader = IdentityLoader(webOfTrustConnector, Context("Test"))
48 val identities = identityLoader.loadTrustedIdentities()
49 assertThat(identities.keys, hasSize(4))
50 assertThat(identities.keys, containsInAnyOrder(ownIdentities[0], ownIdentities[1], ownIdentities[2], ownIdentities[3]))
51 verifyIdentitiesForOwnIdentity(identities, ownIdentities[0], createTrustedIdentitiesForFirstOwnIdentity())
52 verifyIdentitiesForOwnIdentity(identities, ownIdentities[1], createTrustedIdentitiesForSecondOwnIdentity())
53 verifyIdentitiesForOwnIdentity(identities, ownIdentities[2], emptySet())
54 verifyIdentitiesForOwnIdentity(identities, ownIdentities[3], createTrustedIdentitiesForFourthOwnIdentity())
58 fun loadingIdentitiesWithoutContext() {
59 val identityLoaderWithoutContext = IdentityLoader(webOfTrustConnector)
60 val identities = identityLoaderWithoutContext.loadTrustedIdentities()
61 assertThat(identities.keys, hasSize(4))
62 assertThat(identities.keys, containsInAnyOrder(ownIdentities[0], ownIdentities[1], ownIdentities[2], ownIdentities[3]))
63 verifyIdentitiesForOwnIdentity(identities, ownIdentities[0], createTrustedIdentitiesForFirstOwnIdentity())
64 verifyIdentitiesForOwnIdentity(identities, ownIdentities[1], createTrustedIdentitiesForSecondOwnIdentity())
65 verifyIdentitiesForOwnIdentity(identities, ownIdentities[2], createTrustedIdentitiesForThirdOwnIdentity())
66 verifyIdentitiesForOwnIdentity(identities, ownIdentities[3], createTrustedIdentitiesForFourthOwnIdentity())
69 private fun verifyIdentitiesForOwnIdentity(identities: Map<OwnIdentity, Collection<Identity>>, ownIdentity: OwnIdentity, trustedIdentities: Set<Identity>) {
70 assertThat(identities[ownIdentity], equalTo<Collection<Identity>>(trustedIdentities))
74 fun `loading all identities merges remote identities’ trust values`() {
75 val ownIdentity1 = createOwnIdentity("o1")
76 val ownIdentity2 = createOwnIdentity("o2")
77 val webOfTrustConnector = object : TestWebOfTrustConnector() {
78 override fun loadAllOwnIdentities() = setOf(ownIdentity1, ownIdentity2)
79 override fun loadAllIdentities(ownIdentity: OwnIdentity, context: String?) = when (ownIdentity) {
80 ownIdentity1 -> setOf(createIdentity().setTrust(ownIdentity1, Trust(100, 50, 2)))
81 else -> setOf(createIdentity().setTrust(ownIdentity2, Trust(80, 40, 2)))
84 val identityLoader = IdentityLoader(webOfTrustConnector)
85 val allIdentities = identityLoader.loadAllIdentities()
86 assertThat(allIdentities[ownIdentity1]!!.first().trust[ownIdentity2], notNullValue())
90 fun `loading trusted identities merges remote identities’ trust values`() {
91 val ownIdentity1 = createOwnIdentity("o1")
92 val ownIdentity2 = createOwnIdentity("o2")
93 val webOfTrustConnector = object : TestWebOfTrustConnector() {
94 override fun loadAllOwnIdentities() = setOf(ownIdentity1, ownIdentity2)
95 override fun loadTrustedIdentities(ownIdentity: OwnIdentity, context: String?) = when (ownIdentity) {
96 ownIdentity1 -> setOf(createIdentity().setTrust(ownIdentity1, Trust(100, 50, 2)))
97 else -> setOf(createIdentity().setTrust(ownIdentity2, Trust(80, 40, 2)))
100 val identityLoader = IdentityLoader(webOfTrustConnector)
101 val allIdentities = identityLoader.loadTrustedIdentities()
102 assertThat(allIdentities[ownIdentity1]!!.first().trust[ownIdentity2], notNullValue())
107 private fun createOwnIdentities() = listOf(
108 createOwnIdentity("O1", "ON1", "OR1", "OI1", setOf("Test", "Test2"), mapOf("KeyA" to "ValueA", "KeyB" to "ValueB")),
109 createOwnIdentity("O2", "ON2", "OR2", "OI2", setOf("Test"), mapOf("KeyC" to "ValueC")),
110 createOwnIdentity("O3", "ON3", "OR3", "OI3", setOf("Test2"), mapOf("KeyE" to "ValueE", "KeyD" to "ValueD")),
111 createOwnIdentity("O4", "ON4", "OR$", "OI4", setOf("Test"), mapOf("KeyA" to "ValueA", "KeyD" to "ValueD"))
114 private fun createTrustedIdentitiesForFirstOwnIdentity() = setOf(
115 createIdentity("I11", "IN11", "IR11", setOf("Test"), mapOf("KeyA" to "ValueA"))
118 private fun createTrustedIdentitiesForSecondOwnIdentity() = setOf(
119 createIdentity("I21", "IN21", "IR21", setOf("Test", "Test2"), mapOf("KeyB" to "ValueB"))
122 private fun createTrustedIdentitiesForThirdOwnIdentity() = setOf(
123 createIdentity("I31", "IN31", "IR31", setOf("Test", "Test3"), mapOf("KeyC" to "ValueC"))
126 private fun createTrustedIdentitiesForFourthOwnIdentity(): Set<Identity> = emptySet()
128 private fun createOwnIdentity(id: String = "", nickname: String = "", requestUri: String = "", insertUri: String = "", contexts: Set<String> = setOf(), properties: Map<String, String> = mapOf()): OwnIdentity =
129 DefaultOwnIdentity(id, nickname, requestUri, insertUri).apply {
130 setContexts(contexts)
131 this.properties = properties
134 private fun createIdentity(id: String = "", nickname: String = "", requestUri: String = "", contexts: Set<String> = setOf(), properties: Map<String, String> = mapOf()): Identity =
135 DefaultIdentity(id, nickname, requestUri).apply {
136 setContexts(contexts)
137 this.properties = properties
140 private open class TestWebOfTrustConnector : WebOfTrustConnector {
142 override fun loadAllOwnIdentities() = emptySet<OwnIdentity>()
143 override fun loadTrustedIdentities(ownIdentity: OwnIdentity, context: String?) = emptySet<Identity>()
144 override fun loadAllIdentities(ownIdentity: OwnIdentity, context: String?) = emptySet<Identity>()
145 override fun addContext(ownIdentity: OwnIdentity, context: String) = Unit
146 override fun removeContext(ownIdentity: OwnIdentity, context: String) = Unit
147 override fun setProperty(ownIdentity: OwnIdentity, name: String, value: String) = Unit
148 override fun removeProperty(ownIdentity: OwnIdentity, name: String) = Unit
149 override fun ping() = Unit