Skip to content

Commit 7b98465

Browse files
switchrpc: update TrackOnion rpc for new error handling
1 parent d265452 commit 7b98465

File tree

3 files changed

+356
-183
lines changed

3 files changed

+356
-183
lines changed

itest/lnd_sendonion_test.go

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func testSendOnion(ht *lntest.HarnessTest) {
9393
HopPubkeys: onionResp.HopPubkeys,
9494
}
9595
trackResp := alice.RPC.TrackOnion(trackReq)
96-
require.Equal(ht, invoices[0].RPreimage, trackResp.Preimage)
96+
require.Equal(ht, invoices[0].RPreimage, trackResp.GetPreimage())
9797

9898
// The invoice should show as settled for Dave.
9999
ht.AssertInvoiceSettled(dave, invoices[0].PaymentAddr)
@@ -200,7 +200,7 @@ func testSendOnionTwice(ht *lntest.HarnessTest) {
200200
HopPubkeys: onionResp.HopPubkeys,
201201
}
202202
trackResp := alice.RPC.TrackOnion(trackReq)
203-
require.Equal(ht, preimage[:], trackResp.Preimage)
203+
require.Equal(ht, preimage[:], trackResp.GetPreimage())
204204

205205
// Now that the original HTLC attempt has settled, we'll send the same
206206
// onion again with the same attempt ID.
@@ -275,9 +275,6 @@ func testTrackOnion(ht *lntest.HarnessTest) {
275275
require.True(ht, resp.Success, "expected successful onion send")
276276
require.Empty(ht, resp.ErrorMessage, "unexpected failure to send onion")
277277

278-
serverErrorStr := ""
279-
clientErrorStr := ""
280-
281278
// Track the payment providing all necessary information to delegate
282279
// error decryption to the server. We expect this to fail as Dave is not
283280
// expecting payment.
@@ -288,10 +285,11 @@ func testTrackOnion(ht *lntest.HarnessTest) {
288285
HopPubkeys: onionResp.HopPubkeys,
289286
}
290287
trackResp := alice.RPC.TrackOnion(trackReq)
291-
require.NotEmpty(ht, trackResp.ErrorMessage,
292-
"expected onion tracking error")
288+
serverFailure := trackResp.GetFailureDetails()
289+
require.NotNil(ht, serverFailure, "expected onion tracking error")
293290

294-
serverErrorStr = trackResp.ErrorMessage
291+
serverFwdFailure := serverFailure.GetForwardingFailure()
292+
require.NotNil(ht, serverFwdFailure, "expected forwarding failure")
295293

296294
// Now we'll track the same payment attempt, but we'll specify that
297295
// we want to handle the error decryption ourselves client side.
@@ -300,16 +298,18 @@ func testTrackOnion(ht *lntest.HarnessTest) {
300298
PaymentHash: paymentHash,
301299
}
302300
trackResp = alice.RPC.TrackOnion(trackReq)
303-
require.NotNil(ht, trackResp.EncryptedError, "expected encrypted error")
301+
clientFailure := trackResp.GetFailureDetails()
302+
require.NotNil(ht, clientFailure, "expected client tracking error")
303+
304+
encryptedErrorBytes := clientFailure.GetEncryptedErrorData()
305+
require.NotNil(ht, encryptedErrorBytes, "expected encrypted error")
304306

305307
// Decrypt and inspect the error from the TrackOnion RPC response.
306308
sessionKey, _ := btcec.PrivKeyFromBytes(onionResp.SessionKey)
307309
var pubKeys []*btcec.PublicKey
308310
for _, keyBytes := range onionResp.HopPubkeys {
309311
pubKey, err := btcec.ParsePubKey(keyBytes)
310-
if err != nil {
311-
ht.Fatalf("Failed to parse public key: %v", err)
312-
}
312+
require.NoError(ht, err, "Failed to parse public key")
313313
pubKeys = append(pubKeys, pubKey)
314314
}
315315

@@ -323,14 +323,19 @@ func testTrackOnion(ht *lntest.HarnessTest) {
323323
}
324324

325325
// Simulate an RPC client decrypting the onion error.
326-
encryptedError := lnwire.OpaqueReason(trackResp.EncryptedError)
327-
forwardingError, err := errorDecryptor.DecryptError(encryptedError)
328-
require.Nil(ht, err, "unable to decrypt error")
329-
330-
clientErrorStr = forwardingError.Error()
326+
encryptedError := lnwire.OpaqueReason(encryptedErrorBytes)
327+
clientFwdErr, err := errorDecryptor.DecryptError(encryptedError)
328+
require.NoError(ht, err, "unable to decrypt error")
329+
330+
// Finally, assert that the structured forwarding failure is the same
331+
// whether it was decrypted on the server or on the client.
332+
serverFwdErr, err := switchrpc.UnmarshallForwardingError(
333+
serverFwdFailure,
334+
)
335+
require.NoError(ht, err, "unable to decode server forwarding failure")
331336

332-
serverFwdErr, err := switchrpc.ParseForwardingError(serverErrorStr)
333-
require.Nil(ht, err, "expected to parse forwarding error from server")
334-
require.Equal(ht, serverFwdErr.Error(), clientErrorStr, "expect error "+
335-
"message to match whether handled by client or server")
337+
require.Equal(ht, serverFwdFailure.FailureSourceIndex,
338+
uint32(clientFwdErr.FailureSourceIdx), "source index mismatch")
339+
require.Equal(ht, serverFwdErr.WireMessage(),
340+
clientFwdErr.WireMessage(), "wire message mismatch")
336341
}

0 commit comments

Comments
 (0)