knownaddress_test.go raw

   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