1 package net.pterodactylus.sone.core
4 import net.pterodactylus.sone.data.*
5 import net.pterodactylus.sone.test.*
6 import org.hamcrest.MatcherAssert.*
7 import org.hamcrest.Matchers.equalTo
8 import org.mockito.ArgumentMatchers.any
9 import org.mockito.ArgumentMatchers.eq
10 import org.mockito.Mockito.doAnswer
11 import org.mockito.Mockito.never
12 import org.mockito.Mockito.verify
13 import kotlin.test.Test
16 * Unit test for [SoneRescuer].
18 class SoneRescuerTest {
20 private val core = mock<Core>()
21 private val soneDownloader = mock<SoneDownloader>()
22 private val sone = mock<Sone>().apply {
23 val soneUri = mock<FreenetURI>()
24 whenever(soneUri.edition).thenReturn(currentEdition)
25 whenever(requestUri).thenReturn(soneUri)
27 private val soneRescuer = SoneRescuer(core, soneDownloader, sone)
30 fun newSoneRescuerIsNotFetchingAnything() {
31 assertThat(soneRescuer.isFetching, equalTo(false))
35 fun newSoneRescuerStartsAtCurrentEditionOfSone() {
36 assertThat(soneRescuer.currentEdition, equalTo(currentEdition))
40 fun newSoneRescuerHasANextEditionToGet() {
41 assertThat(soneRescuer.hasNextEdition(), equalTo(true))
45 fun soneRescuerDoesNotHaveANextEditionIfCurrentEditionIsZero() {
46 whenever(sone.requestUri.edition).thenReturn(0L)
47 val soneRescuer = SoneRescuer(core, soneDownloader, sone)
48 assertThat(soneRescuer.hasNextEdition(), equalTo(false))
52 fun nextEditionIsOneSmallerThanTheCurrentEdition() {
53 assertThat(soneRescuer.nextEdition, equalTo(currentEdition - 1))
57 fun lastFetchOfANewSoneRescuerWasSuccessful() {
58 assertThat(soneRescuer.isLastFetchSuccessful, equalTo(true))
62 fun mainLoopStopsWhenItShould() {
64 soneRescuer.serviceRun()
68 fun successfulInsert() {
69 val fetchedSone = mock<Sone>()
70 returnUriOnInsert(fetchedSone, currentEdition - 1)
71 soneRescuer.startNextFetch()
72 soneRescuer.serviceRun()
73 verify(core).lockSone(eq(sone))
74 verify(core).updateSone(eq(fetchedSone), eq(true))
75 assertThat(soneRescuer.isLastFetchSuccessful, equalTo(true))
76 assertThat(soneRescuer.isFetching, equalTo(false))
77 assertThat(soneRescuer.currentEdition, equalTo(currentEdition - 1))
81 fun `starting fetch with skipping one edition skips one edition`() {
82 val fetchedSone = mock<Sone>()
83 returnUriOnInsert(fetchedSone, currentEdition - 2)
84 soneRescuer.startNextFetchWithSkip()
85 soneRescuer.serviceRun()
86 verify(core).lockSone(eq(sone))
87 verify(core).updateSone(eq(fetchedSone), eq(true))
88 assertThat(soneRescuer.isLastFetchSuccessful, equalTo(true))
89 assertThat(soneRescuer.isFetching, equalTo(false))
90 assertThat(soneRescuer.currentEdition, equalTo(currentEdition - 2))
94 fun nonSuccessfulInsertIsRecognized() {
95 returnUriOnInsert(null, (currentEdition - 1))
96 soneRescuer.startNextFetch()
97 soneRescuer.serviceRun()
98 verify(core).lockSone(eq(sone))
99 verify(core, never()).updateSone(any(Sone::class.java), eq(true))
100 assertThat(soneRescuer.isLastFetchSuccessful, equalTo(false))
101 assertThat(soneRescuer.isFetching, equalTo(false))
102 assertThat(soneRescuer.currentEdition, equalTo(currentEdition))
105 private fun returnUriOnInsert(fetchedSone: Sone?, edition: Long) {
106 val keyWithMetaStrings = setupFreenetUri(edition)
110 }.whenever(soneDownloader).fetchSone(eq(sone), eq(keyWithMetaStrings), eq(true))
113 private fun setupFreenetUri(edition: Long): FreenetURI {
114 val sskKey = mock<FreenetURI>()
115 val keyWithDocName = mock<FreenetURI>()
116 val keyWithMetaStrings = mock<FreenetURI>()
117 whenever(keyWithDocName.setMetaString(eq(arrayOf("sone.xml")))).thenReturn(keyWithMetaStrings)
118 whenever(sskKey.setDocName(eq("Sone-" + edition))).thenReturn(keyWithDocName)
119 whenever(sone.requestUri.setKeyType(eq("SSK"))).thenReturn(sskKey)
120 return keyWithMetaStrings
125 private const val currentEdition = 12L