channeldb/migrations_test: assert locally-sourced circuits...
in the circuit map are marked StatusInFlight. We also check that hashes contained in forwarded circuits are not updated.
This commit is contained in:
1 file changed
+118
@@ -2,7 +2,10 @@ package channeldb
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
"encoding/binary"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/coreos/bbolt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TestPaymentStatusesMigration checks that already completed payments will have
|
// TestPaymentStatusesMigration checks that already completed payments will have
|
||||||
@@ -40,6 +43,82 @@ func TestPaymentStatusesMigration(t *testing.T) {
|
|||||||
t.Fatalf("wrong payment status: expected %v, got %v",
|
t.Fatalf("wrong payment status: expected %v, got %v",
|
||||||
StatusGrounded.String(), paymentStatus.String())
|
StatusGrounded.String(), paymentStatus.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lastly, we'll add a locally-sourced circuit and
|
||||||
|
// non-locally-sourced circuit to the circuit map. The
|
||||||
|
// locally-sourced payment should end up with an InFlight
|
||||||
|
// status, while the other should remain unchanged, which
|
||||||
|
// defaults to Grounded.
|
||||||
|
err = d.Update(func(tx *bolt.Tx) error {
|
||||||
|
circuits, err := tx.CreateBucketIfNotExists(
|
||||||
|
[]byte("circuit-adds"),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
groundedKey := make([]byte, 16)
|
||||||
|
binary.BigEndian.PutUint64(groundedKey[:8], 1)
|
||||||
|
binary.BigEndian.PutUint64(groundedKey[8:], 1)
|
||||||
|
|
||||||
|
// Generated using TestHalfCircuitSerialization with nil
|
||||||
|
// ErrorEncrypter, which is the case for locally-sourced
|
||||||
|
// payments. No payment status should end up being set
|
||||||
|
// for this circuit, since the short channel id of the
|
||||||
|
// key is non-zero (e.g., a forwarded circuit). This
|
||||||
|
// will default it to Grounded.
|
||||||
|
groundedCircuit := []byte{
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x01,
|
||||||
|
// start payment hash
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
// end payment hash
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
|
||||||
|
0x42, 0x40, 0x00,
|
||||||
|
}
|
||||||
|
|
||||||
|
err = circuits.Put(groundedKey, groundedCircuit)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
inFlightKey := make([]byte, 16)
|
||||||
|
binary.BigEndian.PutUint64(inFlightKey[:8], 0)
|
||||||
|
binary.BigEndian.PutUint64(inFlightKey[8:], 1)
|
||||||
|
|
||||||
|
// Generated using TestHalfCircuitSerialization with nil
|
||||||
|
// ErrorEncrypter, which is not the case for forwarded
|
||||||
|
// payments, but should have no impact on the
|
||||||
|
// correctness of the test. The payment status for this
|
||||||
|
// circuit should be set to InFlight, since the short
|
||||||
|
// channel id in the key is 0 (sourceHop).
|
||||||
|
inFlightCircuit := []byte{
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x01,
|
||||||
|
// start payment hash
|
||||||
|
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
// end payment hash
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
|
||||||
|
0x42, 0x40, 0x00,
|
||||||
|
}
|
||||||
|
|
||||||
|
return circuits.Put(inFlightKey, inFlightCircuit)
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to add circuit map entry: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify that the created payment status is "Completed" for our one
|
// Verify that the created payment status is "Completed" for our one
|
||||||
@@ -54,6 +133,7 @@ func TestPaymentStatusesMigration(t *testing.T) {
|
|||||||
t.Fatal("migration 'paymentStatusesMigration' wasn't applied")
|
t.Fatal("migration 'paymentStatusesMigration' wasn't applied")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that our completed payments were migrated.
|
||||||
paymentStatus, err := d.FetchPaymentStatus(paymentHash)
|
paymentStatus, err := d.FetchPaymentStatus(paymentHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unable to fetch payment status: %v", err)
|
t.Fatalf("unable to fetch payment status: %v", err)
|
||||||
@@ -63,6 +143,44 @@ func TestPaymentStatusesMigration(t *testing.T) {
|
|||||||
t.Fatalf("wrong payment status: expected %v, got %v",
|
t.Fatalf("wrong payment status: expected %v, got %v",
|
||||||
StatusCompleted.String(), paymentStatus.String())
|
StatusCompleted.String(), paymentStatus.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inFlightHash := [32]byte{
|
||||||
|
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that the locally sourced payment was transitioned to
|
||||||
|
// InFlight.
|
||||||
|
paymentStatus, err = d.FetchPaymentStatus(inFlightHash)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to fetch payment status: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if paymentStatus != StatusInFlight {
|
||||||
|
t.Fatalf("wrong payment status: expected %v, got %v",
|
||||||
|
StatusInFlight.String(), paymentStatus.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
groundedHash := [32]byte{
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that non-locally sourced payments remain in the default
|
||||||
|
// Grounded state.
|
||||||
|
paymentStatus, err = d.FetchPaymentStatus(groundedHash)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to fetch payment status: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if paymentStatus != StatusGrounded {
|
||||||
|
t.Fatalf("wrong payment status: expected %v, got %v",
|
||||||
|
StatusGrounded.String(), paymentStatus.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
applyMigration(t,
|
applyMigration(t,
|
||||||
|
|||||||
Reference in new issue
Block a user