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  }