// Copyright (c) 2020 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 controlclient

import (
	"testing"

	"tailscale.com/tailcfg"
)

func TestNetworkMapConcise(t *testing.T) {
	nodekey := func(b byte) (ret tailcfg.NodeKey) {
		for i := range ret {
			ret[i] = b
		}
		return
	}
	for _, tt := range []struct {
		name string
		nm   *NetworkMap
		want string
	}{
		{
			name: "basic",
			nm: &NetworkMap{
				NodeKey: nodekey(1),
				Peers: []*tailcfg.Node{
					{
						Key:       nodekey(2),
						DERP:      "127.3.3.40:2",
						Endpoints: []string{"192.168.0.100:12", "192.168.0.100:12354"},
					},
					{
						Key:       nodekey(3),
						DERP:      "127.3.3.40:4",
						Endpoints: []string{"10.2.0.100:12", "10.1.0.100:12345"},
					},
				},
			},
			want: "netmap: self: [AQEBA] auth=machine-unknown []\n [AgICA] D2                 :    192.168.0.100:12     192.168.0.100:12354\n [AwMDA] D4                 :       10.2.0.100:12        10.1.0.100:12345\n",
		},
		{
			name: "debug_non_nil",
			nm: &NetworkMap{
				NodeKey: nodekey(1),
				Debug:   &tailcfg.Debug{},
			},
			want: "netmap: self: [AQEBA] auth=machine-unknown debug={} []\n",
		},
		{
			name: "debug_values",
			nm: &NetworkMap{
				NodeKey: nodekey(1),
				Debug:   &tailcfg.Debug{LogHeapPprof: true},
			},
			want: "netmap: self: [AQEBA] auth=machine-unknown debug={\"LogHeapPprof\":true} []\n",
		},
	} {
		t.Run(tt.name, func(t *testing.T) {
			var got string
			n := int(testing.AllocsPerRun(1000, func() {
				got = tt.nm.Concise()
			}))
			t.Logf("Allocs = %d", n)
			if got != tt.want {
				t.Errorf("Wrong output\n Got: %q\nWant: %q\n## Got (unescaped):\n%s\n## Want (unescaped):\n%s\n", got, tt.want, got, tt.want)
			}
		})
	}
}