/** * Sone - AsyncFreenetInterfaceTest.kt - Copyright © 2019–2020 David ‘Bombe’ Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package net.pterodactylus.sone.freenet import freenet.client.* import freenet.keys.* import freenet.support.io.* import kotlinx.coroutines.* import net.pterodactylus.sone.core.* import org.hamcrest.MatcherAssert.* import org.hamcrest.Matchers.* import java.util.concurrent.atomic.* import kotlin.test.* class AsyncFreenetInterfaceTest { @Test fun `returned deferred is completed by success`() = runBlocking { val result = FetchResult(ClientMetadata(), NullBucket()) val freenetClient = object : FreenetClient { override fun fetch(freenetKey: FreenetURI) = result } val freenetInterface = AsyncFreenetInterface(freenetClient) val fetched = async { freenetInterface.fetchUri(FreenetURI("KSK@GPL.txt")) } withTimeout(1000) { assertThat(fetched.await(), equalTo(Fetched(FreenetURI("KSK@GPL.txt"), result))) } } @Test fun `permanent redircts are being followed`() = runBlocking { val result = FetchResult(ClientMetadata(), NullBucket()) val freenetClient = object : FreenetClient { val redirected = AtomicBoolean(false) override fun fetch(freenetKey: FreenetURI) = if (redirected.compareAndSet(false, true)) throw FetchException(FetchException.FetchExceptionMode.PERMANENT_REDIRECT, FreenetURI("KSK@GPLv3.txt")) else result } val freenetInterface = AsyncFreenetInterface(freenetClient) val fetched = async { freenetInterface.fetchUri(FreenetURI("KSK@GPL.txt")) } withTimeout(1000) { assertThat(fetched.await(), equalTo(Fetched(FreenetURI("KSK@GPLv3.txt"), result))) } } @Test fun `fetch errors are being re-thrown`() = runBlocking { val freenetClient = object : FreenetClient { override fun fetch(freenetKey: FreenetURI) = throw FetchException(FetchException.FetchExceptionMode.ALL_DATA_NOT_FOUND) } val freenetInterface = AsyncFreenetInterface(freenetClient) val fetched = supervisorScope { async { freenetInterface.fetchUri(FreenetURI("KSK@GPL.txt")) } } withTimeout(1000) { assertFailsWith(FetchException::class) { fetched.await() } } } }