mirror of https://github.com/tailscale/tailscale/
ipn/ipnlocal: use views for Peer.PrimaryRoutes and Peer.Tags
RELNOTE=`tailscale status --json` now shows Tags and PrimaryRoutes Signed-off-by: Maisem Ali <maisem@tailscale.com>pull/4004/head
parent
9cbb0913be
commit
c7a8f0992d
@ -0,0 +1,73 @@
|
|||||||
|
// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package views
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"inet.af/netaddr"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestViewsJSON(t *testing.T) {
|
||||||
|
mustCIDR := func(cidrs ...string) (out []netaddr.IPPrefix) {
|
||||||
|
for _, cidr := range cidrs {
|
||||||
|
out = append(out, netaddr.MustParseIPPrefix(cidr))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
type viewStruct struct {
|
||||||
|
Addrs IPPrefixSlice
|
||||||
|
Strings StringSlice
|
||||||
|
AddrsPtr *IPPrefixSlice `json:",omitempty"`
|
||||||
|
StringsPtr *StringSlice `json:",omitempty"`
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
in viewStruct
|
||||||
|
wantJSON string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "empty",
|
||||||
|
in: viewStruct{},
|
||||||
|
wantJSON: `{"Addrs":null,"Strings":null}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "everything",
|
||||||
|
in: viewStruct{
|
||||||
|
Addrs: IPPrefixSliceOf(mustCIDR("192.168.0.0/24")),
|
||||||
|
AddrsPtr: &IPPrefixSlice{mustCIDR("192.168.0.0/24")},
|
||||||
|
StringsPtr: &StringSlice{[]string{"foo"}},
|
||||||
|
Strings: StringSlice{[]string{"bar"}},
|
||||||
|
},
|
||||||
|
wantJSON: `{"Addrs":["192.168.0.0/24"],"Strings":["bar"],"AddrsPtr":["192.168.0.0/24"],"StringsPtr":["foo"]}`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
encoder := json.NewEncoder(&buf)
|
||||||
|
encoder.SetIndent("", "")
|
||||||
|
for _, tc := range tests {
|
||||||
|
buf.Reset()
|
||||||
|
if err := encoder.Encode(&tc.in); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
b := buf.Bytes()
|
||||||
|
gotJSON := strings.TrimSpace(string(b))
|
||||||
|
if tc.wantJSON != gotJSON {
|
||||||
|
t.Fatalf("JSON: %v; want: %v", gotJSON, tc.wantJSON)
|
||||||
|
}
|
||||||
|
var got viewStruct
|
||||||
|
if err := json.Unmarshal(b, &got); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, tc.in) {
|
||||||
|
t.Fatalf("unmarshal resulted in different output: %+v; want %+v", got, tc.in)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue