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 net.pterodactylus.sone.test.createIdentity
21 import net.pterodactylus.sone.test.createOwnIdentity
22 import org.hamcrest.MatcherAssert.assertThat
23 import org.hamcrest.Matchers.containsInAnyOrder
24 import org.hamcrest.Matchers.equalTo
25 import org.hamcrest.Matchers.hasSize
26 import org.hamcrest.Matchers.notNullValue
30 * Unit test for [IdentityLoader].
32 class IdentityLoaderTest {
34 private val ownIdentities = createOwnIdentities()
35 private val webOfTrustConnector = object : TestWebOfTrustConnector() {
36 override fun loadAllOwnIdentities() = ownIdentities.toSet()
37 override fun loadTrustedIdentities(ownIdentity: OwnIdentity, context: String?) =
39 ownIdentities[0] -> createTrustedIdentitiesForFirstOwnIdentity()
40 ownIdentities[1] -> createTrustedIdentitiesForSecondOwnIdentity()
41 ownIdentities[2] -> createTrustedIdentitiesForThirdOwnIdentity()
42 ownIdentities[3] -> createTrustedIdentitiesForFourthOwnIdentity()
43 else -> throw RuntimeException()
48 fun loadingIdentities() {
49 val identityLoader = IdentityLoader(webOfTrustConnector, Context("Test"))
50 val identities = identityLoader.loadTrustedIdentities()
51 assertThat(identities.keys, hasSize(4))
52 assertThat(identities.keys, containsInAnyOrder(ownIdentities[0], ownIdentities[1], ownIdentities[2], ownIdentities[3]))
53 verifyIdentitiesForOwnIdentity(identities, ownIdentities[0], createTrustedIdentitiesForFirstOwnIdentity())
54 verifyIdentitiesForOwnIdentity(identities, ownIdentities[1], createTrustedIdentitiesForSecondOwnIdentity())
55 verifyIdentitiesForOwnIdentity(identities, ownIdentities[2], emptySet())
56 verifyIdentitiesForOwnIdentity(identities, ownIdentities[3], createTrustedIdentitiesForFourthOwnIdentity())
60 fun loadingIdentitiesWithoutContext() {
61 val identityLoaderWithoutContext = IdentityLoader(webOfTrustConnector)
62 val identities = identityLoaderWithoutContext.loadTrustedIdentities()
63 assertThat(identities.keys, hasSize(4))
64 assertThat(identities.keys, containsInAnyOrder(ownIdentities[0], ownIdentities[1], ownIdentities[2], ownIdentities[3]))
65 verifyIdentitiesForOwnIdentity(identities, ownIdentities[0], createTrustedIdentitiesForFirstOwnIdentity())
66 verifyIdentitiesForOwnIdentity(identities, ownIdentities[1], createTrustedIdentitiesForSecondOwnIdentity())
67 verifyIdentitiesForOwnIdentity(identities, ownIdentities[2], createTrustedIdentitiesForThirdOwnIdentity())
68 verifyIdentitiesForOwnIdentity(identities, ownIdentities[3], createTrustedIdentitiesForFourthOwnIdentity())
71 private fun verifyIdentitiesForOwnIdentity(identities: Map<OwnIdentity, Collection<Identity>>, ownIdentity: OwnIdentity, trustedIdentities: Set<Identity>) {
72 assertThat(identities[ownIdentity], equalTo<Collection<Identity>>(trustedIdentities))
76 fun `loading all identities merges remote identities’ trust values`() {
77 val ownIdentity1 = createOwnIdentity("o1")
78 val ownIdentity2 = createOwnIdentity("o2")
79 val webOfTrustConnector = object : TestWebOfTrustConnector() {
80 override fun loadAllOwnIdentities() = setOf(ownIdentity1, ownIdentity2)
81 override fun loadAllIdentities(ownIdentity: OwnIdentity, context: String?) = when (ownIdentity) {
82 ownIdentity1 -> setOf(createIdentity().setTrust(ownIdentity1, Trust(100, 50, 2)))
83 else -> setOf(createIdentity().setTrust(ownIdentity2, Trust(80, 40, 2)))
86 val identityLoader = IdentityLoader(webOfTrustConnector)
87 val allIdentities = identityLoader.loadAllIdentities()
88 assertThat(allIdentities[ownIdentity1]!!.first().trust[ownIdentity2], notNullValue())
92 fun `loading trusted identities merges remote identities’ trust values`() {
93 val ownIdentity1 = createOwnIdentity("o1")
94 val ownIdentity2 = createOwnIdentity("o2")
95 val webOfTrustConnector = object : TestWebOfTrustConnector() {
96 override fun loadAllOwnIdentities() = setOf(ownIdentity1, ownIdentity2)
97 override fun loadTrustedIdentities(ownIdentity: OwnIdentity, context: String?) = when (ownIdentity) {
98 ownIdentity1 -> setOf(createIdentity().setTrust(ownIdentity1, Trust(100, 50, 2)))
99 else -> setOf(createIdentity().setTrust(ownIdentity2, Trust(80, 40, 2)))
102 val identityLoader = IdentityLoader(webOfTrustConnector)
103 val allIdentities = identityLoader.loadTrustedIdentities()
104 assertThat(allIdentities[ownIdentity1]!!.first().trust[ownIdentity2], notNullValue())
109 private fun createOwnIdentities() = listOf(
110 createOwnIdentity("O1", "ON1", "OR1", "OI1", setOf("Test", "Test2"), mapOf("KeyA" to "ValueA", "KeyB" to "ValueB")),
111 createOwnIdentity("O2", "ON2", "OR2", "OI2", setOf("Test"), mapOf("KeyC" to "ValueC")),
112 createOwnIdentity("O3", "ON3", "OR3", "OI3", setOf("Test2"), mapOf("KeyE" to "ValueE", "KeyD" to "ValueD")),
113 createOwnIdentity("O4", "ON4", "OR$", "OI4", setOf("Test"), mapOf("KeyA" to "ValueA", "KeyD" to "ValueD"))
116 private fun createTrustedIdentitiesForFirstOwnIdentity() = setOf(
117 createIdentity("I11", "IN11", "IR11", setOf("Test"), mapOf("KeyA" to "ValueA"))
120 private fun createTrustedIdentitiesForSecondOwnIdentity() = setOf(
121 createIdentity("I21", "IN21", "IR21", setOf("Test", "Test2"), mapOf("KeyB" to "ValueB"))
124 private fun createTrustedIdentitiesForThirdOwnIdentity() = setOf(
125 createIdentity("I31", "IN31", "IR31", setOf("Test", "Test3"), mapOf("KeyC" to "ValueC"))
128 private fun createTrustedIdentitiesForFourthOwnIdentity(): Set<Identity> = emptySet()
130 private open class TestWebOfTrustConnector : WebOfTrustConnector {
132 override fun loadAllOwnIdentities() = emptySet<OwnIdentity>()
133 override fun loadTrustedIdentities(ownIdentity: OwnIdentity, context: String?) = emptySet<Identity>()
134 override fun loadAllIdentities(ownIdentity: OwnIdentity, context: String?) = emptySet<Identity>()
135 override fun addContext(ownIdentity: OwnIdentity, context: String) = Unit
136 override fun removeContext(ownIdentity: OwnIdentity, context: String) = Unit
137 override fun setProperty(ownIdentity: OwnIdentity, name: String, value: String) = Unit
138 override fun removeProperty(ownIdentity: OwnIdentity, name: String) = Unit
139 override fun ping() = Unit