@ -10,6 +10,7 @@ import (
"reflect"
"strings"
"testing"
"time"
"inet.af/netaddr"
"tailscale.com/tailcfg"
@ -17,15 +18,36 @@ import (
)
func TestUndeltaPeers ( t * testing . T ) {
n := func ( id tailcfg . NodeID , name string ) * tailcfg . Node {
return & tailcfg . Node { ID : id , Name : name }
defer func ( old func ( ) time . Time ) { clockNow = old } ( clockNow )
var curTime time . Time
clockNow = func ( ) time . Time {
return curTime
}
online := func ( v bool ) func ( * tailcfg . Node ) {
return func ( n * tailcfg . Node ) {
n . Online = & v
}
}
seenAt := func ( t time . Time ) func ( * tailcfg . Node ) {
return func ( n * tailcfg . Node ) {
n . LastSeen = & t
}
}
n := func ( id tailcfg . NodeID , name string , mod ... func ( * tailcfg . Node ) ) * tailcfg . Node {
n := & tailcfg . Node { ID : id , Name : name }
for _ , f := range mod {
f ( n )
}
return n
}
peers := func ( nv ... * tailcfg . Node ) [ ] * tailcfg . Node { return nv }
tests := [ ] struct {
name string
mapRes * tailcfg . MapResponse
prev [ ] * tailcfg . Node
want [ ] * tailcfg . Node
name string
mapRes * tailcfg . MapResponse
curTime time . Time
prev [ ] * tailcfg . Node
want [ ] * tailcfg . Node
} {
{
name : "full_peers" ,
@ -73,9 +95,54 @@ func TestUndeltaPeers(t *testing.T) {
mapRes : & tailcfg . MapResponse { } ,
want : peers ( n ( 1 , "foo" ) , n ( 2 , "bar" ) ) ,
} ,
{
name : "online_change" ,
prev : peers ( n ( 1 , "foo" ) , n ( 2 , "bar" ) ) ,
mapRes : & tailcfg . MapResponse {
OnlineChange : map [ tailcfg . NodeID ] bool {
1 : true ,
} ,
} ,
want : peers (
n ( 1 , "foo" , online ( true ) ) ,
n ( 2 , "bar" ) ,
) ,
} ,
{
name : "online_change_offline" ,
prev : peers ( n ( 1 , "foo" ) , n ( 2 , "bar" ) ) ,
mapRes : & tailcfg . MapResponse {
OnlineChange : map [ tailcfg . NodeID ] bool {
1 : false ,
2 : true ,
} ,
} ,
want : peers (
n ( 1 , "foo" , online ( false ) ) ,
n ( 2 , "bar" , online ( true ) ) ,
) ,
} ,
{
name : "peer_seen_at" ,
prev : peers ( n ( 1 , "foo" , seenAt ( time . Unix ( 111 , 0 ) ) ) , n ( 2 , "bar" ) ) ,
curTime : time . Unix ( 123 , 0 ) ,
mapRes : & tailcfg . MapResponse {
PeerSeenChange : map [ tailcfg . NodeID ] bool {
1 : false ,
2 : true ,
} ,
} ,
want : peers (
n ( 1 , "foo" ) ,
n ( 2 , "bar" , seenAt ( time . Unix ( 123 , 0 ) ) ) ,
) ,
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
if ! tt . curTime . IsZero ( ) {
curTime = tt . curTime
}
undeltaPeers ( tt . mapRes , tt . prev )
if ! reflect . DeepEqual ( tt . mapRes . Peers , tt . want ) {
t . Errorf ( "wrong results\n got: %s\nwant: %s" , formatNodes ( tt . mapRes . Peers ) , formatNodes ( tt . want ) )
@ -90,7 +157,14 @@ func formatNodes(nodes []*tailcfg.Node) string {
if i > 0 {
sb . WriteString ( ", " )
}
fmt . Fprintf ( & sb , "(%d, %q)" , n . ID , n . Name )
var extra string
if n . Online != nil {
extra += fmt . Sprintf ( ", online=%v" , * n . Online )
}
if n . LastSeen != nil {
extra += fmt . Sprintf ( ", lastSeen=%v" , n . LastSeen . Unix ( ) )
}
fmt . Fprintf ( & sb , "(%d, %q%s)" , n . ID , n . Name , extra )
}
return sb . String ( )
}