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 }