|
|
@@ -12,6 +12,7 @@ import (
|
|
|
"testing"
|
|
|
"time"
|
|
|
|
|
|
+ "go4.org/mem"
|
|
|
"tailscale.com/tailcfg"
|
|
|
"tailscale.com/types/key"
|
|
|
"tailscale.com/types/netmap"
|
|
|
@@ -192,7 +193,90 @@ func TestUndeltaPeers(t *testing.T) {
|
|
|
},
|
|
|
want: peers(n(1, "foo", withDERP("127.3.3.40:2"), withEP("1.2.3.4:56"))),
|
|
|
},
|
|
|
- }
|
|
|
+ {
|
|
|
+ name: "change_key",
|
|
|
+ prev: peers(n(1, "foo")),
|
|
|
+ mapRes: &tailcfg.MapResponse{
|
|
|
+ PeersChangedPatch: []*tailcfg.PeerChange{{
|
|
|
+ NodeID: 1,
|
|
|
+ Key: ptrTo(key.NodePublicFromRaw32(mem.B(append(make([]byte, 31), 'A')))),
|
|
|
+ }},
|
|
|
+ }, want: peers(&tailcfg.Node{
|
|
|
+ ID: 1,
|
|
|
+ Name: "foo",
|
|
|
+ Key: key.NodePublicFromRaw32(mem.B(append(make([]byte, 31), 'A'))),
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "change_disco_key",
|
|
|
+ prev: peers(n(1, "foo")),
|
|
|
+ mapRes: &tailcfg.MapResponse{
|
|
|
+ PeersChangedPatch: []*tailcfg.PeerChange{{
|
|
|
+ NodeID: 1,
|
|
|
+ DiscoKey: ptrTo(key.DiscoPublicFromRaw32(mem.B(append(make([]byte, 31), 'A')))),
|
|
|
+ }},
|
|
|
+ }, want: peers(&tailcfg.Node{
|
|
|
+ ID: 1,
|
|
|
+ Name: "foo",
|
|
|
+ DiscoKey: key.DiscoPublicFromRaw32(mem.B(append(make([]byte, 31), 'A'))),
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "change_online",
|
|
|
+ prev: peers(n(1, "foo")),
|
|
|
+ mapRes: &tailcfg.MapResponse{
|
|
|
+ PeersChangedPatch: []*tailcfg.PeerChange{{
|
|
|
+ NodeID: 1,
|
|
|
+ Online: ptrTo(true),
|
|
|
+ }},
|
|
|
+ }, want: peers(&tailcfg.Node{
|
|
|
+ ID: 1,
|
|
|
+ Name: "foo",
|
|
|
+ Online: ptrTo(true),
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "change_last_seen",
|
|
|
+ prev: peers(n(1, "foo")),
|
|
|
+ mapRes: &tailcfg.MapResponse{
|
|
|
+ PeersChangedPatch: []*tailcfg.PeerChange{{
|
|
|
+ NodeID: 1,
|
|
|
+ LastSeen: ptrTo(time.Unix(123, 0).UTC()),
|
|
|
+ }},
|
|
|
+ }, want: peers(&tailcfg.Node{
|
|
|
+ ID: 1,
|
|
|
+ Name: "foo",
|
|
|
+ LastSeen: ptrTo(time.Unix(123, 0).UTC()),
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "change_key_expiry",
|
|
|
+ prev: peers(n(1, "foo")),
|
|
|
+ mapRes: &tailcfg.MapResponse{
|
|
|
+ PeersChangedPatch: []*tailcfg.PeerChange{{
|
|
|
+ NodeID: 1,
|
|
|
+ KeyExpiry: ptrTo(time.Unix(123, 0).UTC()),
|
|
|
+ }},
|
|
|
+ }, want: peers(&tailcfg.Node{
|
|
|
+ ID: 1,
|
|
|
+ Name: "foo",
|
|
|
+ KeyExpiry: time.Unix(123, 0).UTC(),
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "change_capabilities",
|
|
|
+ prev: peers(n(1, "foo")),
|
|
|
+ mapRes: &tailcfg.MapResponse{
|
|
|
+ PeersChangedPatch: []*tailcfg.PeerChange{{
|
|
|
+ NodeID: 1,
|
|
|
+ Capabilities: ptrTo([]string{"foo"}),
|
|
|
+ }},
|
|
|
+ }, want: peers(&tailcfg.Node{
|
|
|
+ ID: 1,
|
|
|
+ Name: "foo",
|
|
|
+ Capabilities: []string{"foo"},
|
|
|
+ }),
|
|
|
+ }}
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
@@ -207,6 +291,10 @@ func TestUndeltaPeers(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func ptrTo[T any](v T) *T {
|
|
|
+ return &v
|
|
|
+}
|
|
|
+
|
|
|
func formatNodes(nodes []*tailcfg.Node) string {
|
|
|
var sb strings.Builder
|
|
|
for i, n := range nodes {
|