From 1d89353744cd68b46fcae02afb82bb97665dac21 Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Sat, 26 Mar 2022 20:36:00 +0100 Subject: [PATCH] get policy for non-local channel --- .../lndmanagej/service/PolicyService.java | 40 ++---- .../lndmanagej/service/PolicyServiceTest.java | 77 ++++++------ .../lndmanagej/grpc/GrpcChannelPolicy.java | 26 ++-- .../de/cotto/lndmanagej/grpc/GrpcFees.java | 51 -------- .../grpc/GrpcChannelPolicyTest.java | 26 ++-- .../cotto/lndmanagej/grpc/GrpcFeesTest.java | 118 ------------------ 6 files changed, 91 insertions(+), 247 deletions(-) delete mode 100644 grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcFees.java delete mode 100644 grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcFeesTest.java diff --git a/backend/src/main/java/de/cotto/lndmanagej/service/PolicyService.java b/backend/src/main/java/de/cotto/lndmanagej/service/PolicyService.java index 9e932866..539a45ee 100644 --- a/backend/src/main/java/de/cotto/lndmanagej/service/PolicyService.java +++ b/backend/src/main/java/de/cotto/lndmanagej/service/PolicyService.java @@ -1,52 +1,38 @@ package de.cotto.lndmanagej.service; import com.codahale.metrics.annotation.Timed; -import de.cotto.lndmanagej.grpc.GrpcFees; +import de.cotto.lndmanagej.grpc.GrpcChannelPolicy; import de.cotto.lndmanagej.model.ChannelId; -import de.cotto.lndmanagej.model.Coins; import de.cotto.lndmanagej.model.LocalChannel; import de.cotto.lndmanagej.model.PoliciesForLocalChannel; import de.cotto.lndmanagej.model.Policy; +import de.cotto.lndmanagej.model.Pubkey; import org.springframework.stereotype.Component; +import java.util.Optional; + @Component public class PolicyService { - private final GrpcFees grpcFees; + private final GrpcChannelPolicy grpcChannelPolicy; - public PolicyService(GrpcFees grpcFees) { - this.grpcFees = grpcFees; + public PolicyService(GrpcChannelPolicy grpcChannelPolicy) { + this.grpcChannelPolicy = grpcChannelPolicy; } @Timed public PoliciesForLocalChannel getPolicies(LocalChannel localChannel) { ChannelId channelId = localChannel.getId(); return new PoliciesForLocalChannel( - new Policy(getOutgoingFeeRate(channelId), getOutgoingBaseFee(channelId), isEnabledLocal(channelId)), - new Policy(getIncomingFeeRate(channelId), getIncomingBaseFee(channelId), isEnabledRemote(channelId)) + grpcChannelPolicy.getLocalPolicy(channelId).orElseThrow(IllegalStateException::new), + grpcChannelPolicy.getRemotePolicy(channelId).orElseThrow(IllegalStateException::new) ); } - private long getIncomingFeeRate(ChannelId channelId) { - return grpcFees.getIncomingFeeRate(channelId).orElseThrow(IllegalStateException::new); + public Optional getPolicyFrom(ChannelId channelId, Pubkey pubkey) { + return grpcChannelPolicy.getPolicyFrom(channelId, pubkey); } - private long getOutgoingFeeRate(ChannelId channelId) { - return grpcFees.getOutgoingFeeRate(channelId).orElseThrow(IllegalStateException::new); - } - - private Coins getOutgoingBaseFee(ChannelId channelId) { - return grpcFees.getOutgoingBaseFee(channelId).orElseThrow(IllegalStateException::new); - } - - private Coins getIncomingBaseFee(ChannelId channelId) { - return grpcFees.getIncomingBaseFee(channelId).orElseThrow(IllegalStateException::new); - } - - private boolean isEnabledLocal(ChannelId channelId) { - return grpcFees.isEnabledLocal(channelId).orElseThrow(IllegalStateException::new); - } - - private boolean isEnabledRemote(ChannelId channelId) { - return grpcFees.isEnabledRemote(channelId).orElseThrow(IllegalStateException::new); + public Optional getPolicyTo(ChannelId channelId, Pubkey pubkey) { + return grpcChannelPolicy.getPolicyTo(channelId, pubkey); } } diff --git a/backend/src/test/java/de/cotto/lndmanagej/service/PolicyServiceTest.java b/backend/src/test/java/de/cotto/lndmanagej/service/PolicyServiceTest.java index 2668b660..4f6f9f19 100644 --- a/backend/src/test/java/de/cotto/lndmanagej/service/PolicyServiceTest.java +++ b/backend/src/test/java/de/cotto/lndmanagej/service/PolicyServiceTest.java @@ -1,9 +1,8 @@ package de.cotto.lndmanagej.service; -import de.cotto.lndmanagej.grpc.GrpcFees; -import de.cotto.lndmanagej.model.Coins; +import de.cotto.lndmanagej.grpc.GrpcChannelPolicy; import de.cotto.lndmanagej.model.PoliciesForLocalChannel; -import de.cotto.lndmanagej.model.Policy; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -14,6 +13,9 @@ import java.util.Optional; import static de.cotto.lndmanagej.model.ChannelIdFixtures.CHANNEL_ID; import static de.cotto.lndmanagej.model.LocalOpenChannelFixtures.LOCAL_OPEN_CHANNEL; +import static de.cotto.lndmanagej.model.PolicyFixtures.POLICY_1; +import static de.cotto.lndmanagej.model.PolicyFixtures.POLICY_2; +import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.Mockito.when; @@ -24,45 +26,50 @@ class PolicyServiceTest { private PolicyService policyService; @Mock - private GrpcFees grpcFees; + private GrpcChannelPolicy grpcChannelPolicy; - @Test - void getPolicies() { - PoliciesForLocalChannel expected = new PoliciesForLocalChannel( - new Policy(789, Coins.ofMilliSatoshis(111), true), - new Policy(123, Coins.ofMilliSatoshis(456), false) - ); + @Nested + class ForLocalChannel { + @Test + void getPolicies() { + PoliciesForLocalChannel expected = new PoliciesForLocalChannel(POLICY_1, POLICY_2); - mockFees(); - when(grpcFees.isEnabledLocal(CHANNEL_ID)).thenReturn(Optional.of(true)); - when(grpcFees.isEnabledRemote(CHANNEL_ID)).thenReturn(Optional.of(false)); + when(grpcChannelPolicy.getLocalPolicy(LOCAL_OPEN_CHANNEL.getId())).thenReturn(Optional.of(POLICY_1)); + when(grpcChannelPolicy.getRemotePolicy(LOCAL_OPEN_CHANNEL.getId())).thenReturn(Optional.of(POLICY_2)); - assertThat(policyService.getPolicies(LOCAL_OPEN_CHANNEL)).isEqualTo(expected); + assertThat(policyService.getPolicies(LOCAL_OPEN_CHANNEL)).isEqualTo(expected); + } + + @Test + void getPolicies_not_found() { + assertThatIllegalStateException().isThrownBy(() -> policyService.getPolicies(LOCAL_OPEN_CHANNEL)); + } } - @Test - void getPolicies_enabled_disabled_swapped() { - PoliciesForLocalChannel expected = new PoliciesForLocalChannel( - new Policy(789, Coins.ofMilliSatoshis(111), false), - new Policy(123, Coins.ofMilliSatoshis(456), true) - ); + @Nested + class ForDirectedChannel { + @Test + void getPolicyFrom_edge_not_found() { + when(grpcChannelPolicy.getPolicyFrom(CHANNEL_ID, PUBKEY)).thenReturn(Optional.empty()); + assertThat(policyService.getPolicyFrom(CHANNEL_ID, PUBKEY)).isEmpty(); + } - mockFees(); - when(grpcFees.isEnabledLocal(CHANNEL_ID)).thenReturn(Optional.of(false)); - when(grpcFees.isEnabledRemote(CHANNEL_ID)).thenReturn(Optional.of(true)); + @Test + void getPolicyFrom() { + when(grpcChannelPolicy.getPolicyFrom(CHANNEL_ID, PUBKEY)).thenReturn(Optional.of(POLICY_1)); + assertThat(policyService.getPolicyFrom(CHANNEL_ID, PUBKEY)).contains(POLICY_1); + } - assertThat(policyService.getPolicies(LOCAL_OPEN_CHANNEL)).isEqualTo(expected); - } + @Test + void getPolicyTo_edge_not_found() { + when(grpcChannelPolicy.getPolicyTo(CHANNEL_ID, PUBKEY)).thenReturn(Optional.empty()); + assertThat(policyService.getPolicyTo(CHANNEL_ID, PUBKEY)).isEmpty(); + } - @Test - void getPolicies_not_found() { - assertThatIllegalStateException().isThrownBy(() -> policyService.getPolicies(LOCAL_OPEN_CHANNEL)); - } - - private void mockFees() { - when(grpcFees.getOutgoingFeeRate(CHANNEL_ID)).thenReturn(Optional.of(789L)); - when(grpcFees.getOutgoingBaseFee(CHANNEL_ID)).thenReturn(Optional.of(Coins.ofMilliSatoshis(111))); - when(grpcFees.getIncomingFeeRate(CHANNEL_ID)).thenReturn(Optional.of(123L)); - when(grpcFees.getIncomingBaseFee(CHANNEL_ID)).thenReturn(Optional.of(Coins.ofMilliSatoshis(456))); + @Test + void getPolicyTo() { + when(grpcChannelPolicy.getPolicyTo(CHANNEL_ID, PUBKEY)).thenReturn(Optional.of(POLICY_1)); + assertThat(policyService.getPolicyTo(CHANNEL_ID, PUBKEY)).contains(POLICY_1); + } } } diff --git a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcChannelPolicy.java b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcChannelPolicy.java index 19589e6e..029a622a 100644 --- a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcChannelPolicy.java +++ b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcChannelPolicy.java @@ -3,6 +3,8 @@ package de.cotto.lndmanagej.grpc; import com.github.benmanes.caffeine.cache.LoadingCache; import de.cotto.lndmanagej.caching.CacheBuilder; import de.cotto.lndmanagej.model.ChannelId; +import de.cotto.lndmanagej.model.Coins; +import de.cotto.lndmanagej.model.Policy; import de.cotto.lndmanagej.model.Pubkey; import lnrpc.ChannelEdge; import lnrpc.RoutingPolicy; @@ -40,24 +42,24 @@ public class GrpcChannelPolicy { return Optional.empty(); } - public Optional getLocalPolicy(ChannelId channelId) { + public Optional getLocalPolicy(ChannelId channelId) { Pubkey ownPubkey = grpcGetInfo.getPubkey(); return getPolicyFrom(channelId, ownPubkey); } - public Optional getRemotePolicy(ChannelId channelId) { + public Optional getRemotePolicy(ChannelId channelId) { Pubkey ownPubkey = grpcGetInfo.getPubkey(); return getPolicyTo(channelId, ownPubkey); } - public Optional getPolicyFrom(ChannelId channelId, Pubkey source) { + public Optional getPolicyFrom(ChannelId channelId, Pubkey source) { String sourcePubkey = source.toString(); return getChannelEdge(channelId).map( channelEdge -> { if (sourcePubkey.equals(channelEdge.getNode1Pub())) { - return channelEdge.getNode1Policy(); + return toPolicy(channelEdge.getNode1Policy()); } else if (sourcePubkey.equals(channelEdge.getNode2Pub())) { - return channelEdge.getNode2Policy(); + return toPolicy(channelEdge.getNode2Policy()); } else { return null; } @@ -65,14 +67,14 @@ public class GrpcChannelPolicy { ); } - public Optional getPolicyTo(ChannelId channelId, Pubkey target) { + public Optional getPolicyTo(ChannelId channelId, Pubkey target) { String targetPubkey = target.toString(); return getChannelEdge(channelId).map( channelEdge -> { if (targetPubkey.equals(channelEdge.getNode2Pub())) { - return channelEdge.getNode1Policy(); + return toPolicy(channelEdge.getNode1Policy()); } else if (targetPubkey.equals(channelEdge.getNode1Pub())) { - return channelEdge.getNode2Policy(); + return toPolicy(channelEdge.getNode2Policy()); } else { return null; } @@ -80,6 +82,14 @@ public class GrpcChannelPolicy { ); } + private Policy toPolicy(RoutingPolicy routingPolicy) { + return new Policy( + routingPolicy.getFeeRateMilliMsat(), + Coins.ofMilliSatoshis(routingPolicy.getFeeBaseMsat()), + !routingPolicy.getDisabled() + ); + } + private Optional getChannelEdge(ChannelId channelId) { return channelEdgeCache.get(channelId); } diff --git a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcFees.java b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcFees.java deleted file mode 100644 index af511618..00000000 --- a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcFees.java +++ /dev/null @@ -1,51 +0,0 @@ -package de.cotto.lndmanagej.grpc; - -import de.cotto.lndmanagej.model.ChannelId; -import de.cotto.lndmanagej.model.Coins; -import lnrpc.RoutingPolicy; -import org.springframework.stereotype.Component; - -import java.util.Optional; - -@Component -public class GrpcFees { - private final GrpcChannelPolicy grpcChannelPolicy; - - public GrpcFees(GrpcChannelPolicy grpcChannelPolicy) { - this.grpcChannelPolicy = grpcChannelPolicy; - } - - public Optional getOutgoingFeeRate(ChannelId channelId) { - return grpcChannelPolicy.getLocalPolicy(channelId).map(RoutingPolicy::getFeeRateMilliMsat); - } - - public Optional getIncomingFeeRate(ChannelId channelId) { - return grpcChannelPolicy.getRemotePolicy(channelId).map(RoutingPolicy::getFeeRateMilliMsat); - } - - public Optional getOutgoingBaseFee(ChannelId channelId) { - return grpcChannelPolicy.getLocalPolicy(channelId) - .map(RoutingPolicy::getFeeBaseMsat) - .map(Coins::ofMilliSatoshis); - } - - public Optional getIncomingBaseFee(ChannelId channelId) { - return grpcChannelPolicy.getRemotePolicy(channelId) - .map(RoutingPolicy::getFeeBaseMsat) - .map(Coins::ofMilliSatoshis); - } - - @SuppressWarnings("PMD.LinguisticNaming") - public Optional isEnabledLocal(ChannelId channelId) { - return grpcChannelPolicy.getLocalPolicy(channelId) - .map(RoutingPolicy::getDisabled) - .map(b -> !b); - } - - @SuppressWarnings("PMD.LinguisticNaming") - public Optional isEnabledRemote(ChannelId channelId) { - return grpcChannelPolicy.getRemotePolicy(channelId) - .map(RoutingPolicy::getDisabled) - .map(b -> !b); - } -} diff --git a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcChannelPolicyTest.java b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcChannelPolicyTest.java index c6b69e9b..4b294a8a 100644 --- a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcChannelPolicyTest.java +++ b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcChannelPolicyTest.java @@ -1,5 +1,7 @@ package de.cotto.lndmanagej.grpc; +import de.cotto.lndmanagej.model.Coins; +import de.cotto.lndmanagej.model.Policy; import de.cotto.lndmanagej.model.Pubkey; import lnrpc.ChannelEdge; import lnrpc.RoutingPolicy; @@ -43,13 +45,15 @@ class GrpcChannelPolicyTest { @Test void getLocalPolicy_local_first() { when(grpcService.getChannelEdge(CHANNEL_ID)).thenReturn(Optional.of(channelEdge(PUBKEY, PUBKEY_2))); - assertThat(grpcChannelPolicy.getLocalPolicy(CHANNEL_ID)).contains(routingPolicy(FEE_RATE_FIRST)); + assertThat(grpcChannelPolicy.getLocalPolicy(CHANNEL_ID)) + .contains(new Policy(FEE_RATE_FIRST, Coins.NONE, true)); } @Test void getLocalPolicy_local_second() { when(grpcService.getChannelEdge(CHANNEL_ID)).thenReturn(Optional.of(channelEdge(PUBKEY_2, PUBKEY))); - assertThat(grpcChannelPolicy.getLocalPolicy(CHANNEL_ID)).contains(routingPolicy(FEE_RATE_SECOND)); + assertThat(grpcChannelPolicy.getLocalPolicy(CHANNEL_ID)) + .contains(new Policy(FEE_RATE_SECOND, Coins.NONE, true)); } @Test @@ -66,13 +70,15 @@ class GrpcChannelPolicyTest { @Test void getRemotePolicy_local_first() { when(grpcService.getChannelEdge(CHANNEL_ID)).thenReturn(Optional.of(channelEdge(PUBKEY, PUBKEY_2))); - assertThat(grpcChannelPolicy.getRemotePolicy(CHANNEL_ID)).contains(routingPolicy(FEE_RATE_SECOND)); + assertThat(grpcChannelPolicy.getRemotePolicy(CHANNEL_ID)) + .contains(new Policy(FEE_RATE_SECOND, Coins.NONE, true)); } @Test void getRemotePolicy_local_second() { when(grpcService.getChannelEdge(CHANNEL_ID)).thenReturn(Optional.of(channelEdge(PUBKEY_2, PUBKEY))); - assertThat(grpcChannelPolicy.getRemotePolicy(CHANNEL_ID)).contains(routingPolicy(FEE_RATE_FIRST)); + assertThat(grpcChannelPolicy.getRemotePolicy(CHANNEL_ID)) + .contains(new Policy(FEE_RATE_FIRST, Coins.NONE, true)); } @Test @@ -84,13 +90,15 @@ class GrpcChannelPolicyTest { @Test void getPolicyFrom_first() { when(grpcService.getChannelEdge(CHANNEL_ID)).thenReturn(Optional.of(channelEdge(PUBKEY_2, PUBKEY_3))); - assertThat(grpcChannelPolicy.getPolicyFrom(CHANNEL_ID, PUBKEY_2)).contains(routingPolicy(FEE_RATE_FIRST)); + assertThat(grpcChannelPolicy.getPolicyFrom(CHANNEL_ID, PUBKEY_2)) + .contains(new Policy(FEE_RATE_FIRST, Coins.NONE, true)); } @Test void getPolicyFrom_second() { when(grpcService.getChannelEdge(CHANNEL_ID)).thenReturn(Optional.of(channelEdge(PUBKEY_2, PUBKEY_3))); - assertThat(grpcChannelPolicy.getPolicyFrom(CHANNEL_ID, PUBKEY_3)).contains(routingPolicy(FEE_RATE_SECOND)); + assertThat(grpcChannelPolicy.getPolicyFrom(CHANNEL_ID, PUBKEY_3)) + .contains(new Policy(FEE_RATE_SECOND, Coins.NONE, true)); } @Test @@ -102,13 +110,15 @@ class GrpcChannelPolicyTest { @Test void getPolicyTo_first() { when(grpcService.getChannelEdge(CHANNEL_ID)).thenReturn(Optional.of(channelEdge(PUBKEY_2, PUBKEY_3))); - assertThat(grpcChannelPolicy.getPolicyTo(CHANNEL_ID, PUBKEY_3)).contains(routingPolicy(FEE_RATE_FIRST)); + assertThat(grpcChannelPolicy.getPolicyTo(CHANNEL_ID, PUBKEY_3)) + .contains(new Policy(FEE_RATE_FIRST, Coins.NONE, true)); } @Test void getPolicyTo_second() { when(grpcService.getChannelEdge(CHANNEL_ID)).thenReturn(Optional.of(channelEdge(PUBKEY_2, PUBKEY_3))); - assertThat(grpcChannelPolicy.getPolicyTo(CHANNEL_ID, PUBKEY_2)).contains(routingPolicy(FEE_RATE_SECOND)); + assertThat(grpcChannelPolicy.getPolicyTo(CHANNEL_ID, PUBKEY_2)) + .contains(new Policy(FEE_RATE_SECOND, Coins.NONE, true)); } @Test diff --git a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcFeesTest.java b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcFeesTest.java deleted file mode 100644 index 7cb8b2d2..00000000 --- a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcFeesTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package de.cotto.lndmanagej.grpc; - -import de.cotto.lndmanagej.model.Coins; -import lnrpc.RoutingPolicy; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.util.Optional; - -import static de.cotto.lndmanagej.model.ChannelIdFixtures.CHANNEL_ID; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -class GrpcFeesTest { - private static final Coins BASE_FEE = Coins.ofMilliSatoshis(1L); - private static final long FEE_RATE = 123L; - - @InjectMocks - private GrpcFees grpcFees; - - @Mock - private GrpcChannelPolicy grpcChannelPolicy; - - @Test - void getOutgoingFeeRate() { - when(grpcChannelPolicy.getLocalPolicy(CHANNEL_ID)).thenReturn(Optional.of(routingPolicy())); - assertThat(grpcFees.getOutgoingFeeRate(CHANNEL_ID)).contains(FEE_RATE); - } - - @Test - void getOutgoingFeeRate_empty() { - assertThat(grpcFees.getOutgoingFeeRate(CHANNEL_ID)).isEmpty(); - } - - @Test - void getIncomingFeeRate() { - when(grpcChannelPolicy.getRemotePolicy(CHANNEL_ID)).thenReturn(Optional.of(routingPolicy())); - assertThat(grpcFees.getIncomingFeeRate(CHANNEL_ID)).contains(FEE_RATE); - } - - @Test - void getIncomingFeeRate_empty() { - assertThat(grpcFees.getIncomingFeeRate(CHANNEL_ID)).isEmpty(); - } - - @Test - void getOutgoingBaseFee() { - when(grpcChannelPolicy.getLocalPolicy(CHANNEL_ID)).thenReturn(Optional.of(routingPolicy())); - assertThat(grpcFees.getOutgoingBaseFee(CHANNEL_ID)).contains(BASE_FEE); - } - - @Test - void getOutgoingBaseFee_empty() { - assertThat(grpcFees.getOutgoingBaseFee(CHANNEL_ID)).isEmpty(); - } - - @Test - void getIncomingBaseFee() { - when(grpcChannelPolicy.getRemotePolicy(CHANNEL_ID)).thenReturn(Optional.of(routingPolicy())); - assertThat(grpcFees.getIncomingBaseFee(CHANNEL_ID)).contains(BASE_FEE); - } - - @Test - void getIncomingBaseFee_empty() { - assertThat(grpcFees.getIncomingBaseFee(CHANNEL_ID)).isEmpty(); - } - - @Test - void isEnabledLocal_false() { - when(grpcChannelPolicy.getLocalPolicy(CHANNEL_ID)).thenReturn(Optional.of(routingPolicy(true))); - assertThat(grpcFees.isEnabledLocal(CHANNEL_ID)).contains(false); - } - - @Test - void isEnabledLocal_true() { - when(grpcChannelPolicy.getLocalPolicy(CHANNEL_ID)).thenReturn(Optional.of(routingPolicy(false))); - assertThat(grpcFees.isEnabledLocal(CHANNEL_ID)).contains(true); - } - - @Test - void isEnabledLocal_empty() { - assertThat(grpcFees.isEnabledLocal(CHANNEL_ID)).isEmpty(); - } - - @Test - void isEnabledRemote_false() { - when(grpcChannelPolicy.getRemotePolicy(CHANNEL_ID)).thenReturn(Optional.of(routingPolicy(true))); - assertThat(grpcFees.isEnabledRemote(CHANNEL_ID)).contains(false); - } - - @Test - void isEnabledRemote_true() { - when(grpcChannelPolicy.getRemotePolicy(CHANNEL_ID)).thenReturn(Optional.of(routingPolicy(false))); - assertThat(grpcFees.isEnabledRemote(CHANNEL_ID)).contains(true); - } - - @Test - void isEnabledRemote_empty() { - assertThat(grpcFees.isEnabledRemote(CHANNEL_ID)).isEmpty(); - } - - private RoutingPolicy routingPolicy() { - return routingPolicy(false); - } - - private RoutingPolicy routingPolicy(boolean disabled) { - return RoutingPolicy.newBuilder() - .setFeeRateMilliMsat(FEE_RATE) - .setFeeBaseMsat(BASE_FEE.milliSatoshis()) - .setDisabled(disabled) - .build(); - } - -} \ No newline at end of file