✨ Add “show metrics” debug information flag
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / main / SoneModuleTest.kt
1 package net.pterodactylus.sone.main
2
3 import com.codahale.metrics.*
4 import com.google.common.base.*
5 import com.google.common.eventbus.*
6 import com.google.inject.Guice.*
7 import com.google.inject.name.Names.*
8 import freenet.l10n.*
9 import freenet.pluginmanager.*
10 import net.pterodactylus.sone.core.*
11 import net.pterodactylus.sone.database.*
12 import net.pterodactylus.sone.database.memory.*
13 import net.pterodactylus.sone.freenet.wot.*
14 import net.pterodactylus.sone.test.*
15 import net.pterodactylus.util.config.*
16 import net.pterodactylus.util.version.Version
17 import org.hamcrest.MatcherAssert.*
18 import org.hamcrest.Matchers.*
19 import org.mockito.Mockito.*
20 import java.io.*
21 import java.util.concurrent.atomic.*
22 import kotlin.test.*
23
24 const val versionString = "v80"
25
26 class SoneModuleTest {
27
28         private val currentDir: File = File(".")
29         private val pluginVersion = Version("", 80)
30         private val pluginYear = 2019
31         private val pluginHomepage = "home://page"
32         private val l10n = deepMock<PluginL10n>()
33         private val sonePlugin = mock<SonePlugin>().apply {
34                 whenever(version).thenReturn(versionString)
35                 whenever(year).thenReturn(pluginYear)
36                 whenever(homepage).thenReturn(pluginHomepage)
37                 whenever(l10n()).thenReturn(l10n)
38         }
39
40         private val injector by lazy {
41                 createInjector(
42                                 SoneModule(sonePlugin, EventBus()),
43                                 FreenetInterface::class.isProvidedByDeepMock(),
44                                 PluginRespirator::class.isProvidedByDeepMock()
45                 )
46         }
47
48         @AfterTest
49         fun removePropertiesFromCurrentDirectory() {
50                 File(currentDir, "sone.properties").delete()
51         }
52
53         @Test
54         fun `creator binds configuration when no file is present`() {
55                 File(currentDir, "sone.properties").delete()
56                 assertThat(injector.getInstance<Configuration>(), notNullValue())
57         }
58
59         @Test
60         fun `creator binds first start to true when no file is present`() {
61                 File(currentDir, "sone.properties").delete()
62                 assertThat(injector.getInstance(named("FirstStart")), equalTo(true))
63         }
64
65         @Test
66         fun `config file is created in current directory if not present`() {
67                 File(currentDir, "sone.properties").delete()
68                 val configuration = injector.getInstance<Configuration>()
69                 configuration.save()
70                 assertThat(File(currentDir, "sone.properties").exists(), equalTo(true))
71         }
72
73         @Test
74         fun `creator binds configuration when file is present`() {
75                 File(currentDir, "sone.properties").writeText("Option=old")
76                 assertThat(injector.getInstance<Configuration>().getStringValue("Option").value, equalTo("old"))
77         }
78
79         @Test
80         fun `creator binds first start to false when file is present`() {
81                 File(currentDir, "sone.properties").writeText("Option=old")
82                 assertThat(injector.getInstance(named("FirstStart")), equalTo(false))
83         }
84
85         @Test
86         fun `invalid config file leads to new config being created`() {
87                 File(currentDir, "sone.properties").writeText("Option=old\nbroken")
88                 val configuration = injector.getInstance<Configuration>()
89                 assertThat(configuration.getStringValue("Option").getValue(null), nullValue())
90         }
91
92         @Test
93         fun `invalid config file leads to new config being set to true`() {
94                 File(currentDir, "sone.properties").writeText("Option=old\nbroken")
95                 assertThat(injector.getInstance(named("NewConfig")), equalTo(true))
96         }
97
98         @Test
99         fun `valid config file leads to new config being set to false`() {
100                 File(currentDir, "sone.properties").writeText("Option=old")
101                 assertThat(injector.getInstance(named("NewConfig")), equalTo(false))
102         }
103
104         @Test
105         fun `show version information debug information flag is read from config`() {
106                 File(currentDir, "sone.properties").writeText("Debug/ShowVersionInformation=true")
107                 assertThat(injector.getInstance<Core>().debugInformation.showVersionInformation, equalTo(true))
108         }
109
110         @Test
111         fun `show metrics debug information flag is read from config`() {
112                 File(currentDir, "sone.properties").writeText("Debug/ShowMetrics=true")
113                 assertThat(injector.getInstance<Core>().debugInformation.showMetrics, equalTo(true))
114         }
115
116         @Test
117         fun `event bus is bound`() {
118                 assertThat(injector.getInstance<EventBus>(), notNullValue())
119         }
120
121         @Test
122         fun `context is bound`() {
123                 assertThat(injector.getInstance<Context>().context, equalTo("Sone"))
124         }
125
126         @Test
127         fun `optional context is bound`() {
128                 assertThat(injector.getInstance<Optional<Context>>().get().context, equalTo("Sone"))
129         }
130
131         @Test
132         fun `sone plugin is bound`() {
133                 assertThat(injector.getInstance(), sameInstance(sonePlugin))
134         }
135
136         @Test
137         fun `version is bound`() {
138                 assertThat(injector.getInstance(), equalTo(pluginVersion))
139         }
140
141         @Test
142         fun `plugin version is bound`() {
143                 assertThat(injector.getInstance(), equalTo(PluginVersion(versionString)))
144         }
145
146         @Test
147         fun `plugin year is bound`() {
148                 assertThat(injector.getInstance(), equalTo(PluginYear(pluginYear)))
149         }
150
151         @Test
152         fun `plugin homepage in bound`() {
153                 assertThat(injector.getInstance(), equalTo(PluginHomepage(pluginHomepage)))
154         }
155
156         @Test
157         fun `database is bound correctly`() {
158                 assertThat(injector.getInstance<Database>(), instanceOf(MemoryDatabase::class.java))
159         }
160
161         @Test
162         fun `base l10n is bound correctly`() {
163                 assertThat(injector.getInstance(), sameInstance(l10n.base))
164         }
165
166         @Test
167         fun `default loader is used without dev options`() {
168                 assertThat(injector.getInstance<Loaders>(), instanceOf(DefaultLoaders::class.java))
169         }
170
171         @Test
172         fun `default loaders are used if no path is given`() {
173                 File(currentDir, "sone.properties").writeText("Developer.LoadFromFilesystem=true")
174                 assertThat(injector.getInstance<Loaders>(), instanceOf(DefaultLoaders::class.java))
175         }
176
177         @Test
178         fun `debug loaders are used if path is given`() {
179                 File(currentDir, "sone.properties").writeText("Developer.LoadFromFilesystem=true\nDeveloper.FilesystemPath=/tmp")
180                 assertThat(injector.getInstance<Loaders>(), instanceOf(DebugLoaders::class.java))
181         }
182
183         class TestObject {
184                 val ref: AtomicReference<Any?> = AtomicReference()
185                 @Subscribe
186                 fun testEvent(event: Any?) {
187                         ref.set(event)
188                 }
189         }
190
191         @Test
192         fun `created objects are registered with event bus`() {
193                 val eventBus: EventBus = injector.getInstance()
194                 val testObject = injector.getInstance<TestObject>()
195                 val event = Any()
196                 eventBus.post(event)
197                 assertThat(testObject.ref.get(), sameInstance(event))
198         }
199
200         @Test
201         fun `core is created as singleton`() {
202                 val firstCore = injector.getInstance<Core>()
203                 val secondCore = injector.getInstance<Core>()
204                 assertThat(secondCore, sameInstance(firstCore))
205         }
206
207         @Test
208         fun `core is registered with event bus`() {
209                 val eventBus = mock<EventBus>()
210                 val injector = createInjector(
211                                 SoneModule(sonePlugin, eventBus),
212                                 FreenetInterface::class.isProvidedByDeepMock(),
213                                 PluginRespirator::class.isProvidedByDeepMock()
214                 )
215                 val core = injector.getInstance<Core>()
216                 verify(eventBus).register(core)
217         }
218
219         @Test
220         fun `metrics registry can be created`() {
221                 assertThat(injector.getInstance<MetricRegistry>(), notNullValue())
222         }
223
224         @Test
225         fun `metrics registry is created as singleton`() {
226                 val firstMetricRegistry = injector.getInstance<MetricRegistry>()
227                 val secondMetricRegistry = injector.getInstance<MetricRegistry>()
228                 assertThat(firstMetricRegistry, sameInstance(secondMetricRegistry))
229         }
230
231 }