2019-02-14 11:37:47 +01:00
|
|
|
package autopilot_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
2022-02-23 14:48:00 +01:00
|
|
|
"github.com/btcsuite/btcd/btcec/v2"
|
|
|
|
"github.com/btcsuite/btcd/btcutil"
|
2019-02-14 11:37:47 +01:00
|
|
|
"github.com/lightningnetwork/lnd/autopilot"
|
|
|
|
)
|
|
|
|
|
|
|
|
// randKey returns a random public key.
|
|
|
|
func randKey() (*btcec.PublicKey, error) {
|
2022-02-23 14:48:00 +01:00
|
|
|
priv, err := btcec.NewPrivateKey()
|
2019-02-14 11:37:47 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return priv.PubKey(), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// TestSetNodeScores tests that the scores returned by the
|
|
|
|
// ExternalScoreAttachment correctly reflects the scores we set last.
|
|
|
|
func TestSetNodeScores(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
const name = "externalscore"
|
|
|
|
|
|
|
|
h := autopilot.NewExternalScoreAttachment()
|
|
|
|
|
|
|
|
// Create a list of random node IDs.
|
|
|
|
const numKeys = 20
|
|
|
|
var pubkeys []autopilot.NodeID
|
|
|
|
for i := 0; i < numKeys; i++ {
|
|
|
|
k, err := randKey()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
nID := autopilot.NewNodeID(k)
|
|
|
|
pubkeys = append(pubkeys, nID)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set the score of half of the nodes.
|
|
|
|
scores := make(map[autopilot.NodeID]float64)
|
|
|
|
for i := 0; i < numKeys/2; i++ {
|
|
|
|
nID := pubkeys[i]
|
|
|
|
scores[nID] = 0.05 * float64(i)
|
|
|
|
}
|
|
|
|
|
|
|
|
applied, err := h.SetNodeScores(name, scores)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !applied {
|
|
|
|
t.Fatalf("scores were not applied")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Query all scores, half should be set, half should be zero.
|
|
|
|
q := make(map[autopilot.NodeID]struct{})
|
|
|
|
for _, nID := range pubkeys {
|
|
|
|
q[nID] = struct{}{}
|
|
|
|
}
|
|
|
|
resp, err := h.NodeScores(
|
|
|
|
nil, nil, btcutil.Amount(btcutil.SatoshiPerBitcoin), q,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < numKeys; i++ {
|
|
|
|
var expected float64
|
|
|
|
if i < numKeys/2 {
|
|
|
|
expected = 0.05 * float64(i)
|
|
|
|
}
|
|
|
|
nID := pubkeys[i]
|
|
|
|
|
|
|
|
var score float64
|
|
|
|
if s, ok := resp[nID]; ok {
|
|
|
|
score = s.Score
|
|
|
|
}
|
|
|
|
|
|
|
|
if score != expected {
|
|
|
|
t.Fatalf("expected score %v, got %v",
|
|
|
|
expected, score)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Try to apply scores with bogus name, should not be applied.
|
|
|
|
applied, err = h.SetNodeScores("dummy", scores)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if applied {
|
|
|
|
t.Fatalf("scores were applied")
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|