decred.org/dcrdex@v1.0.5/tatanka/db/db_test.go (about)

     1  package db
     2  
     3  import (
     4  	"encoding/binary"
     5  	"os"
     6  	"testing"
     7  	"time"
     8  
     9  	"decred.org/dcrdex/dex"
    10  	"decred.org/dcrdex/dex/encode"
    11  	"decred.org/dcrdex/tatanka/tanka"
    12  )
    13  
    14  func TestReputation(t *testing.T) {
    15  	dir, _ := os.MkdirTemp("", "")
    16  	defer os.RemoveAll(dir)
    17  
    18  	log := dex.StdOutLogger("T", dex.LevelTrace)
    19  
    20  	d, err := New(dir, log)
    21  	if err != nil {
    22  		t.Fatalf("New error: %v", err)
    23  	}
    24  
    25  	var peerID tanka.PeerID
    26  	peerID[0] = 0x1
    27  	peerID[tanka.PeerIDLength-1] = 0x1
    28  
    29  	rep, err := d.Reputation(peerID)
    30  	if err != nil {
    31  		t.Fatalf("Error getting first reputation: %v", err)
    32  	}
    33  	if rep.Score != 0 {
    34  		t.Fatalf("non-zero initial score %d", rep.Score)
    35  	}
    36  
    37  	var n, penalties, decrement uint16
    38  	success := func() {
    39  		var refID [32]byte
    40  		copy(refID[:], encode.RandomBytes(32))
    41  		if err := d.RegisterSuccess(peerID, time.Now(), refID); err != nil {
    42  			t.Fatalf("RegisterSuccess error: %v", err)
    43  		}
    44  		n++
    45  	}
    46  	penalize := func(dec uint8) {
    47  		penalties++
    48  		decrement += uint16(dec)
    49  		penaltiesB := make([]byte, 2)
    50  		binary.BigEndian.PutUint16(penaltiesB, penalties)
    51  		var penaltyID [32]byte
    52  		copy(penaltyID[:], penaltiesB)
    53  		penaltyProof := make(dex.Bytes, 2)
    54  		if err := d.RegisterPenalty(peerID, time.Now(), penaltyID, dec, penaltyProof); err != nil {
    55  			t.Fatalf("RegisterPenalty error: %v", err)
    56  		}
    57  	}
    58  	checkScore := func(expScore int16) {
    59  		rep, err := d.Reputation(peerID)
    60  		if err != nil {
    61  			t.Fatalf("Reputation error: %v", err)
    62  		}
    63  		if rep.Score != expScore {
    64  			t.Fatalf("wanted score %d, got %d", expScore, rep.Score)
    65  		}
    66  	}
    67  
    68  	success()
    69  	checkScore(1)
    70  
    71  	var someoneElse tanka.PeerID
    72  	us := peerID
    73  	peerID = someoneElse
    74  	success()
    75  	peerID = us
    76  	checkScore(1)
    77  
    78  	for n < tanka.MaxReputationEntries*2 {
    79  		success()
    80  	}
    81  	checkScore(tanka.MaxReputationEntries)
    82  
    83  	penalize(10)
    84  	checkScore((tanka.MaxReputationEntries - 1) - 10)
    85  }