mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-11 16:47:19 +02:00
This changes the behavior of "tailscale up". Previously "tailscale up" always did a new Start and reset all the settings. Now "tailscale up" with no flags just brings the world [back] up. (The opposite of "tailscale down"). But with flags, "tailscale up" now only is allowed to change preferences if they're explicitly named in the flags. Otherwise it's an error. Or you need to use --reset to explicitly nuke everything. RELNOTE=tailscale up change Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
// Copyright (c) 2021 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 cli
|
|
|
|
import (
|
|
"flag"
|
|
"testing"
|
|
|
|
"tailscale.com/ipn"
|
|
)
|
|
|
|
// Test that checkForAccidentalSettingReverts's updateMaskedPrefsFromUpFlag can handle
|
|
// all flags. This will panic if a new flag creeps in that's unhandled.
|
|
func TestUpdateMaskedPrefsFromUpFlag(t *testing.T) {
|
|
mp := new(ipn.MaskedPrefs)
|
|
upFlagSet.VisitAll(func(f *flag.Flag) {
|
|
updateMaskedPrefsFromUpFlag(mp, f.Name)
|
|
})
|
|
}
|
|
|
|
func TestCheckForAccidentalSettingReverts(t *testing.T) {
|
|
f := func(flags ...string) map[string]bool {
|
|
m := make(map[string]bool)
|
|
for _, f := range flags {
|
|
m[f] = true
|
|
}
|
|
return m
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
flagSet map[string]bool
|
|
curPrefs *ipn.Prefs
|
|
mp *ipn.MaskedPrefs
|
|
want string
|
|
}{
|
|
{
|
|
name: "bare_up_means_up",
|
|
flagSet: f(),
|
|
curPrefs: &ipn.Prefs{
|
|
WantRunning: false,
|
|
Hostname: "foo",
|
|
},
|
|
mp: &ipn.MaskedPrefs{
|
|
Prefs: ipn.Prefs{
|
|
WantRunning: true,
|
|
},
|
|
WantRunningSet: true,
|
|
},
|
|
want: "",
|
|
},
|
|
{
|
|
name: "losing_hostname",
|
|
flagSet: f("accept-dns"),
|
|
curPrefs: &ipn.Prefs{
|
|
WantRunning: false,
|
|
Hostname: "foo",
|
|
CorpDNS: true,
|
|
},
|
|
mp: &ipn.MaskedPrefs{
|
|
Prefs: ipn.Prefs{
|
|
WantRunning: true,
|
|
CorpDNS: true,
|
|
},
|
|
WantRunningSet: true,
|
|
CorpDNSSet: true,
|
|
},
|
|
want: `'tailscale up' without --reset requires all preferences with changing values to be explicitly mentioned; --hostname is not specified but its default value of "" differs from current value "foo"`,
|
|
},
|
|
{
|
|
name: "hostname_changing_explicitly",
|
|
flagSet: f("hostname"),
|
|
curPrefs: &ipn.Prefs{
|
|
WantRunning: false,
|
|
Hostname: "foo",
|
|
},
|
|
mp: &ipn.MaskedPrefs{
|
|
Prefs: ipn.Prefs{
|
|
WantRunning: true,
|
|
Hostname: "bar",
|
|
},
|
|
WantRunningSet: true,
|
|
HostnameSet: true,
|
|
},
|
|
want: "",
|
|
},
|
|
{
|
|
name: "hostname_changing_empty_explicitly",
|
|
flagSet: f("hostname"),
|
|
curPrefs: &ipn.Prefs{
|
|
WantRunning: false,
|
|
Hostname: "foo",
|
|
},
|
|
mp: &ipn.MaskedPrefs{
|
|
Prefs: ipn.Prefs{
|
|
WantRunning: true,
|
|
Hostname: "",
|
|
},
|
|
WantRunningSet: true,
|
|
HostnameSet: true,
|
|
},
|
|
want: "",
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
var got string
|
|
if err := checkForAccidentalSettingReverts(tt.flagSet, tt.curPrefs, tt.mp); err != nil {
|
|
got = err.Error()
|
|
}
|
|
if got != tt.want {
|
|
t.Errorf("unexpected result\n got: %s\nwant: %s\n", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|