github.com/decred/dcrlnd@v0.7.6/autopilot/externalscoreattach_test.go (about) 1 package autopilot_test 2 3 import ( 4 "testing" 5 6 "github.com/decred/dcrd/dcrec/secp256k1/v4" 7 "github.com/decred/dcrd/dcrutil/v4" 8 "github.com/decred/dcrlnd/autopilot" 9 ) 10 11 // randKey returns a random public key. 12 func randKey() (*secp256k1.PublicKey, error) { 13 priv, err := secp256k1.GeneratePrivateKey() 14 if err != nil { 15 return nil, err 16 } 17 18 return priv.PubKey(), nil 19 } 20 21 // TestSetNodeScores tests that the scores returned by the 22 // ExternalScoreAttachment correctly reflects the scores we set last. 23 func TestSetNodeScores(t *testing.T) { 24 t.Parallel() 25 26 const name = "externalscore" 27 28 h := autopilot.NewExternalScoreAttachment() 29 30 // Create a list of random node IDs. 31 const numKeys = 20 32 var pubkeys []autopilot.NodeID 33 for i := 0; i < numKeys; i++ { 34 k, err := randKey() 35 if err != nil { 36 t.Fatal(err) 37 } 38 39 nID := autopilot.NewNodeID(k) 40 pubkeys = append(pubkeys, nID) 41 } 42 43 // Set the score of half of the nodes. 44 scores := make(map[autopilot.NodeID]float64) 45 for i := 0; i < numKeys/2; i++ { 46 nID := pubkeys[i] 47 scores[nID] = 0.05 * float64(i) 48 } 49 50 applied, err := h.SetNodeScores(name, scores) 51 if err != nil { 52 t.Fatal(err) 53 } 54 55 if !applied { 56 t.Fatalf("scores were not applied") 57 } 58 59 // Query all scores, half should be set, half should be zero. 60 q := make(map[autopilot.NodeID]struct{}) 61 for _, nID := range pubkeys { 62 q[nID] = struct{}{} 63 } 64 resp, err := h.NodeScores( 65 nil, nil, dcrutil.Amount(dcrutil.AtomsPerCoin), q, 66 ) 67 if err != nil { 68 t.Fatal(err) 69 } 70 71 for i := 0; i < numKeys; i++ { 72 var expected float64 73 if i < numKeys/2 { 74 expected = 0.05 * float64(i) 75 } 76 nID := pubkeys[i] 77 78 var score float64 79 if s, ok := resp[nID]; ok { 80 score = s.Score 81 } 82 83 if score != expected { 84 t.Fatalf("expected score %v, got %v", 85 expected, score) 86 } 87 88 } 89 90 // Try to apply scores with bogus name, should not be applied. 91 applied, err = h.SetNodeScores("dummy", scores) 92 if err != nil { 93 t.Fatal(err) 94 } 95 96 if applied { 97 t.Fatalf("scores were applied") 98 } 99 100 }