1 package addrmgr_test
2 3 import (
4 "math"
5 "testing"
6 "time"
7 8 "github.com/p9c/p9/pkg/addrmgr"
9 "github.com/p9c/p9/pkg/wire"
10 )
11 12 func TestChance(t *testing.T) {
13 now := time.Unix(time.Now().Unix(), 0)
14 var tests = []struct {
15 addr *addrmgr.KnownAddress
16 expected float64
17 }{
18 {
19 // Test normal case
20 addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)},
21 0, time.Now().Add(-30*time.Minute), time.Now(), false, 0,
22 ),
23 1.0,
24 }, {
25 // Test case in which lastseen < 0
26 addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(20 * time.Second)},
27 0, time.Now().Add(-30*time.Minute), time.Now(), false, 0,
28 ),
29 1.0,
30 }, {
31 // Test case in which lastattempt < 0
32 addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)},
33 0, time.Now().Add(30*time.Minute), time.Now(), false, 0,
34 ),
35 1.0 * .01,
36 }, {
37 // Test case in which lastattempt < ten minutes
38 addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)},
39 0, time.Now().Add(-5*time.Minute), time.Now(), false, 0,
40 ),
41 1.0 * .01,
42 }, {
43 // Test case with several failed attempts.
44 addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)},
45 2, time.Now().Add(-30*time.Minute), time.Now(), false, 0,
46 ),
47 1 / 1.5 / 1.5,
48 },
49 }
50 e := .0001
51 for i, test := range tests {
52 chance := addrmgr.TstKnownAddressChance(test.addr)
53 if math.Abs(test.expected-chance) >= e {
54 t.Errorf("case %d: got %f, expected %f", i, chance, test.expected)
55 }
56 }
57 }
58 func TestIsBad(t *testing.T) {
59 now := time.Unix(time.Now().Unix(), 0)
60 future := now.Add(35 * time.Minute)
61 monthOld := now.Add(-43 * time.Hour * 24)
62 secondsOld := now.Add(-2 * time.Second)
63 minutesOld := now.Add(-27 * time.Minute)
64 hoursOld := now.Add(-5 * time.Hour)
65 zeroTime := time.Time{}
66 futureNa := &wire.NetAddress{Timestamp: future}
67 minutesOldNa := &wire.NetAddress{Timestamp: minutesOld}
68 monthOldNa := &wire.NetAddress{Timestamp: monthOld}
69 currentNa := &wire.NetAddress{Timestamp: secondsOld}
70 // Test addresses that have been tried in the last minute.
71 if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(futureNa, 3, secondsOld, zeroTime, false, 0)) {
72 t.Errorf("test case 1: addresses that have been tried in the last minute are not bad.")
73 }
74 if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(monthOldNa, 3, secondsOld, zeroTime, false, 0)) {
75 t.Errorf("test case 2: addresses that have been tried in the last minute are not bad.")
76 }
77 if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 3, secondsOld, zeroTime, false, 0)) {
78 t.Errorf("test case 3: addresses that have been tried in the last minute are not bad.")
79 }
80 if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 3, secondsOld, monthOld, true, 0)) {
81 t.Errorf("test case 4: addresses that have been tried in the last minute are not bad.")
82 }
83 if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 2, secondsOld, secondsOld, true, 0)) {
84 t.Errorf("test case 5: addresses that have been tried in the last minute are not bad.")
85 }
86 // Test address that claims to be from the future.
87 if !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(futureNa, 0, minutesOld, hoursOld, true, 0)) {
88 t.Errorf("test case 6: addresses that claim to be from the future are bad.")
89 }
90 // Test address that has not been seen in over a month.
91 if !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(monthOldNa, 0, minutesOld, hoursOld, true, 0)) {
92 t.Errorf("test case 7: addresses more than a month old are bad.")
93 }
94 // It has failed at least three times and never succeeded.
95 if !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 3, minutesOld, zeroTime, true, 0)) {
96 t.Errorf("test case 8: addresses that have never succeeded are bad.")
97 }
98 // It has failed ten times in the last week
99 if !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 10, minutesOld, monthOld, true, 0)) {
100 t.Errorf("test case 9: addresses that have not succeeded in too long are bad.")
101 }
102 // Test an address that should work.
103 if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 2, minutesOld, hoursOld, true, 0)) {
104 t.Errorf("test case 10: This should be a valid address.")
105 }
106 }
107