zcash-android-wallet-sdk/lightwallet-client-lib/src/androidTest/java/co/electriccoin/lightwallet/client/internal/GrpcStatusResolverTest.kt

59 lines
2.1 KiB
Kotlin
Raw Normal View History

[#615] Refactor lightwalletd client * [#615] Refactor lightwalletd client This moves the lightwalletd client code to a separate Gradle module, but does not yet do much clean up the public API (e.g. hiding generated GRPC objects). That will be a followon change via #673 I’ve prototyped a safer version of the API that would be implemented for #673 for two specific calls: obtaining the current block height and obtaining the light wallet info. These were the easiest endpoints to update and they provide a useful exploration for the future changes needed. * Fix benchmarking for networking module - Moved to fixture and build type check components to the new networking module, so it's accessible from all needed parts of the projects - Changed fixture return type to fit to all needed usages * Align with previous review comment * Fix wrong merge * Add basic sanity test - To satisfy tests requirements on emulators.wtf service * Remove grpc dependency from sdk-lib module * Repackage cash.z.wallet.sdk.rpc to cash.z.wallet.sdk.internal.rpc * Fix BuildConfig path * Update demo-app paths to rpc * Fix broken grpc services locations - Our aim here is to change only the local services location (package name), the server location can't be changed due to backward compatibility. * Enhance GRPC Response model * Adopt enhanced GRPC response model - Adopted in a few endpoints * Enhance Connection failure type * Add simple fixture test * Refactor fetchTransaction() to work with Response - Refactored this server call to adopt our new Response mechanism - GrpsStatusResolver.resolveFailureFromStatus() now accepts Throwable input - Added Response.Failure.toThrowable() to satisfy subsequent server calls results processing - A few other minor refactoring changes * Remove commented out log * Unify return type of collection returning methods - Switched fetchUtxos() to return Sequence instead of List - Added a check on empty tAddress input * fetchUtxos returns flow - Switched fetchUtxos() to return Flow of Service.GetAddressUtxosReply - Internally it calls getAddressUtxosStream() instead of getAddressUtxos() from GRPC layer * Update unsafe suffix documentation * Address several minor change requests * Remove code parameter - Removed from the locally triggered failures with default codes. * Rename local variable * Switch from empty response to exception - Our server calls now rather throw IllegalArgumentException than return an empty response - Removed commented out log message - Updated javadocs * Update proto files - Plus related api changes adoption * Unify new clients instances name * AGP 7.4.0 changes - packagingOptions -> androidComponents in sdk-lib and lightwallet-client-lib modules * SDK version bump * Response resolver tests * Release build upload timeout increase * Release build upload timeout increase fix * Revert timeout - As Github has some infrastructure troubles and we need to wait * Add migrations documentation * Sort packaging filters * Remove private field from public documentation * Hide private variables * Remove package from Android Manifest * Throw exception instead of custom error - This step unify our approach to validation on client side across all server calls * Replace setAddresses index const with number * Fix indentation in proto file --------- Co-authored-by: Honza <rychnovsky.honza@gmail.com>
2023-02-01 02:14:55 -08:00
package co.electriccoin.lightwallet.client.internal
import androidx.test.filters.SmallTest
import co.electriccoin.lightwallet.client.fixture.StatusExceptionFixture
import co.electriccoin.lightwallet.client.model.Response
import io.grpc.Status
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull
import kotlin.test.assertTrue
class GrpcStatusResolverTest {
@Test
@SmallTest
fun resolve_explicitly_caught_server_error_test() {
GrpcStatusResolver.resolveFailureFromStatus<Unit>(
StatusExceptionFixture.new(Status.NOT_FOUND)
).also { resolvedResponse ->
assertTrue(resolvedResponse is Response.Failure.Server.NotFound<Unit>)
assertEquals(resolvedResponse.code, Status.NOT_FOUND.code.value())
assertNull(resolvedResponse.description)
}
}
@Test
@SmallTest
fun resolve_explicitly_caught_error_client_test() {
GrpcStatusResolver.resolveFailureFromStatus<Unit>(
StatusExceptionFixture.new(Status.CANCELLED)
).also { resolvedResponse ->
assertTrue(resolvedResponse is Response.Failure.Client.Canceled<Unit>)
assertEquals(resolvedResponse.code, Status.CANCELLED.code.value())
assertNull(resolvedResponse.description)
}
}
@Test
@SmallTest
fun resolve_other_test() {
GrpcStatusResolver.resolveFailureFromStatus<Unit>(
StatusExceptionFixture.new(Status.INTERNAL)
).also { resolvedResponse ->
assertTrue(resolvedResponse is Response.Failure.Server.Other<Unit>)
assertEquals(resolvedResponse.code, Status.INTERNAL.code.value())
assertNull(resolvedResponse.description)
}
}
@Test
@SmallTest
fun resolve_unexpected_error_test() {
GrpcStatusResolver.resolveFailureFromStatus<Unit>(
IllegalArgumentException("This should not come into the resolver.")
).also { resolvedResponse ->
assertTrue(resolvedResponse is Response.Failure.Server.Unknown<Unit>)
}
}
}