c5751b75a9
Replace assignments to individual fields of wire.NetAddress with creating the entire object at once, as one would do if the type was immutable. In some places this replaces the creation of a NetAddress with a high-precision timestamp with a call to a 'constructor' that converts the timestamp to single second precision. For consistency, the tests have also been changed to use single-precision timestamps. Lastly, the number of allocations in readNetAddress have been reduced by reading the services directly into the NetAddress instead of first into a temporary variable.
114 lines
4.4 KiB
Go
114 lines
4.4 KiB
Go
// Copyright (c) 2013-2015 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package addrmgr_test
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/btcsuite/btcd/addrmgr"
|
|
"github.com/btcsuite/btcd/wire"
|
|
)
|
|
|
|
func TestChance(t *testing.T) {
|
|
now := time.Unix(time.Now().Unix(), 0)
|
|
var tests = []struct {
|
|
addr *addrmgr.KnownAddress
|
|
expected float64
|
|
}{
|
|
{
|
|
//Test normal case
|
|
addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)},
|
|
0, time.Now().Add(-30*time.Minute), time.Now(), false, 0),
|
|
1.0,
|
|
}, {
|
|
//Test case in which lastseen < 0
|
|
addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(20 * time.Second)},
|
|
0, time.Now().Add(-30*time.Minute), time.Now(), false, 0),
|
|
1.0,
|
|
}, {
|
|
//Test case in which lastattempt < 0
|
|
addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)},
|
|
0, time.Now().Add(30*time.Minute), time.Now(), false, 0),
|
|
1.0 * .01,
|
|
}, {
|
|
//Test case in which lastattempt < ten minutes
|
|
addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)},
|
|
0, time.Now().Add(-5*time.Minute), time.Now(), false, 0),
|
|
1.0 * .01,
|
|
}, {
|
|
//Test case with several failed attempts.
|
|
addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)},
|
|
2, time.Now().Add(-30*time.Minute), time.Now(), false, 0),
|
|
1 / 1.5 / 1.5,
|
|
},
|
|
}
|
|
|
|
err := .0001
|
|
for i, test := range tests {
|
|
chance := addrmgr.TstKnownAddressChance(test.addr)
|
|
if math.Abs(test.expected-chance) >= err {
|
|
t.Errorf("case %d: got %f, expected %f", i, chance, test.expected)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestIsBad(t *testing.T) {
|
|
now := time.Unix(time.Now().Unix(), 0)
|
|
future := now.Add(35 * time.Minute)
|
|
monthOld := now.Add(-43 * time.Hour * 24)
|
|
secondsOld := now.Add(-2 * time.Second)
|
|
minutesOld := now.Add(-27 * time.Minute)
|
|
hoursOld := now.Add(-5 * time.Hour)
|
|
zeroTime := time.Time{}
|
|
|
|
futureNa := &wire.NetAddress{Timestamp: future}
|
|
minutesOldNa := &wire.NetAddress{Timestamp: minutesOld}
|
|
monthOldNa := &wire.NetAddress{Timestamp: monthOld}
|
|
currentNa := &wire.NetAddress{Timestamp: secondsOld}
|
|
|
|
//Test addresses that have been tried in the last minute.
|
|
if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(futureNa, 3, secondsOld, zeroTime, false, 0)) {
|
|
t.Errorf("test case 1: addresses that have been tried in the last minute are not bad.")
|
|
}
|
|
if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(monthOldNa, 3, secondsOld, zeroTime, false, 0)) {
|
|
t.Errorf("test case 2: addresses that have been tried in the last minute are not bad.")
|
|
}
|
|
if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 3, secondsOld, zeroTime, false, 0)) {
|
|
t.Errorf("test case 3: addresses that have been tried in the last minute are not bad.")
|
|
}
|
|
if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 3, secondsOld, monthOld, true, 0)) {
|
|
t.Errorf("test case 4: addresses that have been tried in the last minute are not bad.")
|
|
}
|
|
if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 2, secondsOld, secondsOld, true, 0)) {
|
|
t.Errorf("test case 5: addresses that have been tried in the last minute are not bad.")
|
|
}
|
|
|
|
//Test address that claims to be from the future.
|
|
if !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(futureNa, 0, minutesOld, hoursOld, true, 0)) {
|
|
t.Errorf("test case 6: addresses that claim to be from the future are bad.")
|
|
}
|
|
|
|
//Test address that has not been seen in over a month.
|
|
if !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(monthOldNa, 0, minutesOld, hoursOld, true, 0)) {
|
|
t.Errorf("test case 7: addresses more than a month old are bad.")
|
|
}
|
|
|
|
//It has failed at least three times and never succeeded.
|
|
if !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 3, minutesOld, zeroTime, true, 0)) {
|
|
t.Errorf("test case 8: addresses that have never succeeded are bad.")
|
|
}
|
|
|
|
//It has failed ten times in the last week
|
|
if !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 10, minutesOld, monthOld, true, 0)) {
|
|
t.Errorf("test case 9: addresses that have not succeeded in too long are bad.")
|
|
}
|
|
|
|
//Test an address that should work.
|
|
if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 2, minutesOld, hoursOld, true, 0)) {
|
|
t.Errorf("test case 10: This should be a valid address.")
|
|
}
|
|
}
|