4188adf3e3b2a0fe5e0475a9447091c8f77c84e5
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / freenet / wot / IdentityLoaderTest.kt
1 /*
2  * Sone - IdentityLoaderTest.kt - Copyright © 2013–2020 David Roden
3  *
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.
8  *
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.
13  *
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/>.
16  */
17
18 package net.pterodactylus.sone.freenet.wot
19
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
27 import org.junit.Test
28
29 /**
30  * Unit test for [IdentityLoader].
31  */
32 class IdentityLoaderTest {
33
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?) =
38                                 when (ownIdentity) {
39                                         ownIdentities[0] -> createTrustedIdentitiesForFirstOwnIdentity()
40                                         ownIdentities[1] -> createTrustedIdentitiesForSecondOwnIdentity()
41                                         ownIdentities[2] -> createTrustedIdentitiesForThirdOwnIdentity()
42                                         ownIdentities[3] -> createTrustedIdentitiesForFourthOwnIdentity()
43                                         else -> throw RuntimeException()
44                                 }
45         }
46
47         @Test
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())
57         }
58
59         @Test
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())
69         }
70
71         private fun verifyIdentitiesForOwnIdentity(identities: Map<OwnIdentity, Collection<Identity>>, ownIdentity: OwnIdentity, trustedIdentities: Set<Identity>) {
72                 assertThat(identities[ownIdentity], equalTo<Collection<Identity>>(trustedIdentities))
73         }
74
75         @Test
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)))
84                         }
85                 }
86                 val identityLoader = IdentityLoader(webOfTrustConnector)
87                 val allIdentities = identityLoader.loadAllIdentities()
88                 assertThat(allIdentities[ownIdentity1]!!.first().trust[ownIdentity2], notNullValue())
89         }
90
91         @Test
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)))
100                         }
101                 }
102                 val identityLoader = IdentityLoader(webOfTrustConnector)
103                 val allIdentities = identityLoader.loadTrustedIdentities()
104                 assertThat(allIdentities[ownIdentity1]!!.first().trust[ownIdentity2], notNullValue())
105         }
106
107 }
108
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"))
114 )
115
116 private fun createTrustedIdentitiesForFirstOwnIdentity() = setOf(
117                 createIdentity("I11", "IN11", "IR11", setOf("Test"), mapOf("KeyA" to "ValueA"))
118 )
119
120 private fun createTrustedIdentitiesForSecondOwnIdentity() = setOf(
121                 createIdentity("I21", "IN21", "IR21", setOf("Test", "Test2"), mapOf("KeyB" to "ValueB"))
122 )
123
124 private fun createTrustedIdentitiesForThirdOwnIdentity() = setOf(
125                 createIdentity("I31", "IN31", "IR31", setOf("Test", "Test3"), mapOf("KeyC" to "ValueC"))
126 )
127
128 private fun createTrustedIdentitiesForFourthOwnIdentity(): Set<Identity> = emptySet()
129
130 private open class TestWebOfTrustConnector : WebOfTrustConnector {
131
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
140
141 }