github.com/decred/politeia@v1.4.0/politeiawww/cmd/politeiavoter/trickle_test.go (about) 1 package main 2 3 import ( 4 "context" 5 "encoding/binary" 6 "os" 7 "path/filepath" 8 "testing" 9 "time" 10 11 pb "decred.org/dcrwallet/rpc/walletrpc" 12 ) 13 14 const keepFiles = false 15 16 func fakeTickets(x uint) (*pb.CommittedTicketsResponse, *pb.SignMessagesResponse) { 17 ctres := pb.CommittedTicketsResponse{ 18 TicketAddresses: make([]*pb.CommittedTicketsResponse_TicketAddress, x), 19 } 20 for k := range ctres.TicketAddresses { 21 ticket := make([]byte, 32) 22 binary.LittleEndian.PutUint64(ticket[:], uint64(k)) 23 ctres.TicketAddresses[k] = &pb.CommittedTicketsResponse_TicketAddress{ 24 Ticket: ticket, 25 } 26 } 27 smr := pb.SignMessagesResponse{ 28 Replies: make([]*pb.SignMessagesResponse_SignReply, x), 29 } 30 for k := range smr.Replies { 31 smr.Replies[k] = &pb.SignMessagesResponse_SignReply{ 32 Signature: make([]byte, 64), 33 } 34 } 35 36 return &ctres, &smr 37 } 38 39 func fakePiv(t *testing.T, d time.Duration, x uint) (*piv, func()) { 40 // Setup temp home dir 41 homeDir, err := os.MkdirTemp("", "politeiavoter.test") 42 if err != nil { 43 t.Fatal(err) 44 } 45 cleanup := func() { 46 if keepFiles { 47 t.Logf("Files not deleted from: %v", homeDir) 48 return 49 } 50 err = os.RemoveAll(homeDir) 51 if err != nil { 52 t.Fatal(err) 53 } 54 } 55 56 return &piv{ 57 ctx: context.Background(), 58 run: time.Now(), 59 cfg: &config{ 60 HomeDir: homeDir, 61 voteDir: filepath.Join(homeDir, defaultVoteDirname), 62 voteDuration: d, 63 Bunches: x, 64 testing: true, 65 }, 66 }, cleanup 67 } 68 69 func TestTrickleWorkers(t *testing.T) { 70 bunches := uint(3) 71 c, cleanup := fakePiv(t, time.Minute, bunches) 72 defer cleanup() 73 74 nrVotes := uint(20) 75 ctres, smr := fakeTickets(nrVotes) 76 err := c.alarmTrickler("token", "voteBit", ctres, smr) 77 if err != nil { 78 t.Fatal(err) 79 } 80 } 81 82 func TestUnrecoverableTrickleWorkers(t *testing.T) { 83 c, cleanup := fakePiv(t, 10*time.Second, 1) 84 defer cleanup() 85 86 c.cfg.testingMode = testFailUnrecoverable 87 88 ctres, smr := fakeTickets(1) 89 err := c.alarmTrickler("token", "voteBit", ctres, smr) 90 if err == nil { 91 t.Fatal("expected unrecoverable error") 92 } 93 } 94 95 func TestManyTrickleWorkers(t *testing.T) { 96 if testing.Short() { 97 t.Skip("TestManyTrickleWorkers: skipping test in short mode.") 98 } 99 100 bunches := uint(10) 101 c, cleanup := fakePiv(t, 2*time.Minute, bunches) 102 defer cleanup() 103 104 nrVotes := uint(20000) 105 ctres, smr := fakeTickets(nrVotes) 106 err := c.alarmTrickler("token", "voteBit", ctres, smr) 107 if err != nil { 108 t.Fatal(err) 109 } 110 }