✅ Use dummy WOT connector for identity loader test
[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 = dummyWebOfTrustConnector
36                         .overrideLoadAllOwnIdentities { ownIdentities.toSet() }
37                         .overrideLoadTrustedIdentities { ownIdentity, _ ->
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 = dummyWebOfTrustConnector
80                                 .overrideLoadAllOwnIdentities { setOf(ownIdentity1, ownIdentity2) }
81                                 .overrideLoadAllIdentities { ownIdentity, _ ->
82                                         when (ownIdentity) {
83                                                 ownIdentity1 -> setOf(createIdentity().setTrust(ownIdentity1, Trust(100, 50, 2)))
84                                                 else -> setOf(createIdentity().setTrust(ownIdentity2, Trust(80, 40, 2)))
85                                         }
86                                 }
87                 val identityLoader = IdentityLoader(webOfTrustConnector)
88                 val allIdentities = identityLoader.loadAllIdentities()
89                 assertThat(allIdentities[ownIdentity1]!!.first().trust[ownIdentity2], notNullValue())
90         }
91
92         @Test
93         fun `loading trusted identities merges remote identities’ trust values`() {
94                 val ownIdentity1 = createOwnIdentity("o1")
95                 val ownIdentity2 = createOwnIdentity("o2")
96                 val webOfTrustConnector = dummyWebOfTrustConnector
97                                 .overrideLoadAllOwnIdentities { setOf(ownIdentity1, ownIdentity2) }
98                                 .overrideLoadTrustedIdentities { ownIdentity, _ ->
99                                         when (ownIdentity) {
100                                                 ownIdentity1 -> setOf(createIdentity().setTrust(ownIdentity1, Trust(100, 50, 2)))
101                                                 else -> setOf(createIdentity().setTrust(ownIdentity2, Trust(80, 40, 2)))
102                                         }
103                                 }
104                 val identityLoader = IdentityLoader(webOfTrustConnector)
105                 val allIdentities = identityLoader.loadTrustedIdentities()
106                 assertThat(allIdentities[ownIdentity1]!!.first().trust[ownIdentity2], notNullValue())
107         }
108
109 }
110
111 private fun createOwnIdentities() = listOf(
112                 createOwnIdentity("O1", "ON1", "OR1", "OI1", setOf("Test", "Test2"), mapOf("KeyA" to "ValueA", "KeyB" to "ValueB")),
113                 createOwnIdentity("O2", "ON2", "OR2", "OI2", setOf("Test"), mapOf("KeyC" to "ValueC")),
114                 createOwnIdentity("O3", "ON3", "OR3", "OI3", setOf("Test2"), mapOf("KeyE" to "ValueE", "KeyD" to "ValueD")),
115                 createOwnIdentity("O4", "ON4", "OR$", "OI4", setOf("Test"), mapOf("KeyA" to "ValueA", "KeyD" to "ValueD"))
116 )
117
118 private fun createTrustedIdentitiesForFirstOwnIdentity() = setOf(
119                 createIdentity("I11", "IN11", "IR11", setOf("Test"), mapOf("KeyA" to "ValueA"))
120 )
121
122 private fun createTrustedIdentitiesForSecondOwnIdentity() = setOf(
123                 createIdentity("I21", "IN21", "IR21", setOf("Test", "Test2"), mapOf("KeyB" to "ValueB"))
124 )
125
126 private fun createTrustedIdentitiesForThirdOwnIdentity() = setOf(
127                 createIdentity("I31", "IN31", "IR31", setOf("Test", "Test3"), mapOf("KeyC" to "ValueC"))
128 )
129
130 private fun createTrustedIdentitiesForFourthOwnIdentity(): Set<Identity> = emptySet()