diff --git a/lsat/interceptor_test.go b/lsat/interceptor_test.go index 2e16a3c..42a26a3 100644 --- a/lsat/interceptor_test.go +++ b/lsat/interceptor_test.go @@ -50,6 +50,7 @@ func TestInterceptor(t *testing.T) { testTimeout = 5 * time.Second interceptor = NewInterceptor( &lnd.LndServices, store, testTimeout, + DefaultMaxCostSats, DefaultMaxRoutingFeeSats, ) testMac = makeMac(t) testMacBytes = serializeMac(t, testMac) @@ -84,11 +85,13 @@ func TestInterceptor(t *testing.T) { testCases := []struct { name string initialToken *Token + interceptor *Interceptor resetCb func() expectLndCall bool sendPaymentCb func(msg test.PaymentChannelMessage) trackPaymentCb func(msg test.TrackPaymentMessage) expectToken bool + expectInterceptErr string expectBackendCalls int expectMacaroonCall1 bool expectMacaroonCall2 bool @@ -96,6 +99,7 @@ func TestInterceptor(t *testing.T) { { name: "no auth required happy path", initialToken: nil, + interceptor: interceptor, resetCb: func() { resetBackend(nil, "") }, expectLndCall: false, expectToken: false, @@ -106,6 +110,7 @@ func TestInterceptor(t *testing.T) { { name: "auth required, no token yet", initialToken: nil, + interceptor: interceptor, resetCb: func() { resetBackend( status.New( @@ -140,6 +145,7 @@ func TestInterceptor(t *testing.T) { { name: "auth required, has token", initialToken: paidToken, + interceptor: interceptor, resetCb: func() { resetBackend(nil, "") }, expectLndCall: false, expectToken: true, @@ -150,6 +156,7 @@ func TestInterceptor(t *testing.T) { { name: "auth required, has pending token", initialToken: pendingToken, + interceptor: interceptor, resetCb: func() { resetBackend( status.New( @@ -177,6 +184,30 @@ func TestInterceptor(t *testing.T) { expectMacaroonCall1: false, expectMacaroonCall2: true, }, + { + name: "auth required, no token yet, cost limit", + initialToken: nil, + interceptor: NewInterceptor( + &lnd.LndServices, store, testTimeout, + 100, DefaultMaxRoutingFeeSats, + ), + resetCb: func() { + resetBackend( + status.New( + GRPCErrCode, GRPCErrMessage, + ).Err(), + makeAuthHeader(testMacBytes), + ) + }, + expectLndCall: false, + expectToken: false, + expectInterceptErr: "cannot pay for LSAT " + + "automatically, cost of 500000 msat exceeds " + + "configured max cost of 100000 msat", + expectBackendCalls: 1, + expectMacaroonCall1: false, + expectMacaroonCall2: false, + }, } // The invoker is a simple function that simulates the actual call to @@ -219,11 +250,14 @@ func TestInterceptor(t *testing.T) { backendWg.Add(1) overallWg.Add(1) go func() { - err := interceptor.UnaryInterceptor( + err := tc.interceptor.UnaryInterceptor( ctx, "", nil, nil, nil, invoker, nil, ) - if err != nil { - panic(err) + if err != nil && tc.expectInterceptErr != "" && + err.Error() != tc.expectInterceptErr { + panic(fmt.Errorf("unexpected error '%s', "+ + "expected '%s'", err.Error(), + tc.expectInterceptErr)) } overallWg.Done() }() @@ -318,12 +352,12 @@ func serializeMac(t *testing.T, mac *macaroon.Macaroon) []byte { } func makeAuthHeader(macBytes []byte) string { - // Testnet invoice, copied from lnd/zpay32/invoice_test.go - invoice := "lntb20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqc" + - "yq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy04" + - "3l2ahrqsfpp3x9et2e20v6pu37c5d9vax37wxq72un98k6vcx9fz94w0qf23" + - "7cm2rqv9pmn5lnexfvf5579slr4zq3u8kmczecytdx0xg9rwzngp7e6guwqp" + - "qlhssu04sucpnz4axcv2dstmknqq6jsk2l" + // Testnet invoice over 500 sats. + invoice := "lntb5u1p0pskpmpp5jzw9xvdast2g5lm5tswq6n64t2epe3f4xav43dyd" + + "239qr8h3yllqdqqcqzpgsp5m8sfjqgugthk66q3tr4gsqr5rh740jrq9x4l0" + + "kvj5e77nmwqvpnq9qy9qsq72afzu7sfuppzqg3q2pn49hlh66rv7w60h2rua" + + "hx857g94s066yzxcjn4yccqc79779sd232v9ewluvu0tmusvht6r99rld8xs" + + "k287cpyac79r" return fmt.Sprintf("LSAT macaroon=\"%s\", invoice=\"%s\"", base64.StdEncoding.EncodeToString(macBytes), invoice) }