github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/p2p/peer/addr_manager_test.go (about)

     1  package peer
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
     8  )
     9  
    10  func IDS(t *testing.T, ids string) ID {
    11  	id, err := IDB58Decode(ids)
    12  	if err != nil {
    13  		t.Fatal(err)
    14  	}
    15  	return id
    16  }
    17  
    18  func MA(t *testing.T, m string) ma.Multiaddr {
    19  	maddr, err := ma.NewMultiaddr(m)
    20  	if err != nil {
    21  		t.Fatal(err)
    22  	}
    23  	return maddr
    24  }
    25  
    26  func testHas(t *testing.T, exp, act []ma.Multiaddr) {
    27  	if len(exp) != len(act) {
    28  		t.Fatal("lengths not the same")
    29  	}
    30  
    31  	for _, a := range exp {
    32  		found := false
    33  
    34  		for _, b := range act {
    35  			if a.Equal(b) {
    36  				found = true
    37  				break
    38  			}
    39  		}
    40  
    41  		if !found {
    42  			t.Fatal("expected address %s not found", a)
    43  		}
    44  	}
    45  }
    46  
    47  func TestAddresses(t *testing.T) {
    48  
    49  	id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN")
    50  	id2 := IDS(t, "QmRmPL3FDZKE3Qiwv1RosLdwdvbvg17b2hB39QPScgWKKZ")
    51  	id3 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ6Kn")
    52  	id4 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ5Kn")
    53  	id5 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ5Km")
    54  
    55  	ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111")
    56  	ma21 := MA(t, "/ip4/2.2.3.2/tcp/1111")
    57  	ma22 := MA(t, "/ip4/2.2.3.2/tcp/2222")
    58  	ma31 := MA(t, "/ip4/3.2.3.3/tcp/1111")
    59  	ma32 := MA(t, "/ip4/3.2.3.3/tcp/2222")
    60  	ma33 := MA(t, "/ip4/3.2.3.3/tcp/3333")
    61  	ma41 := MA(t, "/ip4/4.2.3.3/tcp/1111")
    62  	ma42 := MA(t, "/ip4/4.2.3.3/tcp/2222")
    63  	ma43 := MA(t, "/ip4/4.2.3.3/tcp/3333")
    64  	ma44 := MA(t, "/ip4/4.2.3.3/tcp/4444")
    65  	ma51 := MA(t, "/ip4/5.2.3.3/tcp/1111")
    66  	ma52 := MA(t, "/ip4/5.2.3.3/tcp/2222")
    67  	ma53 := MA(t, "/ip4/5.2.3.3/tcp/3333")
    68  	ma54 := MA(t, "/ip4/5.2.3.3/tcp/4444")
    69  	ma55 := MA(t, "/ip4/5.2.3.3/tcp/5555")
    70  
    71  	ttl := time.Hour
    72  	m := AddrManager{}
    73  	m.AddAddr(id1, ma11, ttl)
    74  
    75  	m.AddAddrs(id2, []ma.Multiaddr{ma21, ma22}, ttl)
    76  	m.AddAddrs(id2, []ma.Multiaddr{ma21, ma22}, ttl) // idempotency
    77  
    78  	m.AddAddr(id3, ma31, ttl)
    79  	m.AddAddr(id3, ma32, ttl)
    80  	m.AddAddr(id3, ma33, ttl)
    81  	m.AddAddr(id3, ma33, ttl) // idempotency
    82  	m.AddAddr(id3, ma33, ttl)
    83  
    84  	m.AddAddrs(id4, []ma.Multiaddr{ma41, ma42, ma43, ma44}, ttl) // multiple
    85  
    86  	m.AddAddrs(id5, []ma.Multiaddr{ma21, ma22}, ttl)             // clearing
    87  	m.AddAddrs(id5, []ma.Multiaddr{ma41, ma42, ma43, ma44}, ttl) // clearing
    88  	m.ClearAddrs(id5)
    89  	m.AddAddrs(id5, []ma.Multiaddr{ma51, ma52, ma53, ma54, ma55}, ttl) // clearing
    90  
    91  	// test the Addresses return value
    92  	testHas(t, []ma.Multiaddr{ma11}, m.Addrs(id1))
    93  	testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2))
    94  	testHas(t, []ma.Multiaddr{ma31, ma32, ma33}, m.Addrs(id3))
    95  	testHas(t, []ma.Multiaddr{ma41, ma42, ma43, ma44}, m.Addrs(id4))
    96  	testHas(t, []ma.Multiaddr{ma51, ma52, ma53, ma54, ma55}, m.Addrs(id5))
    97  
    98  }
    99  
   100  func TestAddressesExpire(t *testing.T) {
   101  
   102  	id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN")
   103  	id2 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQM")
   104  	ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111")
   105  	ma12 := MA(t, "/ip4/2.2.3.2/tcp/2222")
   106  	ma13 := MA(t, "/ip4/3.2.3.3/tcp/3333")
   107  	ma24 := MA(t, "/ip4/4.2.3.3/tcp/4444")
   108  	ma25 := MA(t, "/ip4/5.2.3.3/tcp/5555")
   109  
   110  	m := AddrManager{}
   111  	m.AddAddr(id1, ma11, time.Hour)
   112  	m.AddAddr(id1, ma12, time.Hour)
   113  	m.AddAddr(id1, ma13, time.Hour)
   114  	m.AddAddr(id2, ma24, time.Hour)
   115  	m.AddAddr(id2, ma25, time.Hour)
   116  
   117  	testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1))
   118  	testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2))
   119  
   120  	m.SetAddr(id1, ma11, 2*time.Hour)
   121  	m.SetAddr(id1, ma12, 2*time.Hour)
   122  	m.SetAddr(id1, ma13, 2*time.Hour)
   123  	m.SetAddr(id2, ma24, 2*time.Hour)
   124  	m.SetAddr(id2, ma25, 2*time.Hour)
   125  
   126  	testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1))
   127  	testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2))
   128  
   129  	m.SetAddr(id1, ma11, time.Millisecond)
   130  	<-time.After(time.Millisecond)
   131  	testHas(t, []ma.Multiaddr{ma12, ma13}, m.Addrs(id1))
   132  	testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2))
   133  
   134  	m.SetAddr(id1, ma13, time.Millisecond)
   135  	<-time.After(time.Millisecond)
   136  	testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1))
   137  	testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2))
   138  
   139  	m.SetAddr(id2, ma24, time.Millisecond)
   140  	<-time.After(time.Millisecond)
   141  	testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1))
   142  	testHas(t, []ma.Multiaddr{ma25}, m.Addrs(id2))
   143  
   144  	m.SetAddr(id2, ma25, time.Millisecond)
   145  	<-time.After(time.Millisecond)
   146  	testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1))
   147  	testHas(t, nil, m.Addrs(id2))
   148  
   149  	m.SetAddr(id1, ma12, time.Millisecond)
   150  	<-time.After(time.Millisecond)
   151  	testHas(t, nil, m.Addrs(id1))
   152  	testHas(t, nil, m.Addrs(id2))
   153  }
   154  
   155  func TestClearWorks(t *testing.T) {
   156  
   157  	id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN")
   158  	id2 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQM")
   159  	ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111")
   160  	ma12 := MA(t, "/ip4/2.2.3.2/tcp/2222")
   161  	ma13 := MA(t, "/ip4/3.2.3.3/tcp/3333")
   162  	ma24 := MA(t, "/ip4/4.2.3.3/tcp/4444")
   163  	ma25 := MA(t, "/ip4/5.2.3.3/tcp/5555")
   164  
   165  	m := AddrManager{}
   166  	m.AddAddr(id1, ma11, time.Hour)
   167  	m.AddAddr(id1, ma12, time.Hour)
   168  	m.AddAddr(id1, ma13, time.Hour)
   169  	m.AddAddr(id2, ma24, time.Hour)
   170  	m.AddAddr(id2, ma25, time.Hour)
   171  
   172  	testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1))
   173  	testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2))
   174  
   175  	m.ClearAddrs(id1)
   176  	m.ClearAddrs(id2)
   177  
   178  	testHas(t, nil, m.Addrs(id1))
   179  	testHas(t, nil, m.Addrs(id2))
   180  }