|
|
@@ -23,6 +23,7 @@ import (
|
|
|
"net/netip"
|
|
|
"os"
|
|
|
"path/filepath"
|
|
|
+ "reflect"
|
|
|
"strings"
|
|
|
"sync"
|
|
|
"testing"
|
|
|
@@ -470,6 +471,57 @@ func TestListenerCleanup(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// tests https://github.com/tailscale/tailscale/issues/6973 -- that we can start a tsnet server,
|
|
|
+// stop it, and restart it, even on Windows.
|
|
|
+func TestStartStopStartGetsSameIP(t *testing.T) {
|
|
|
+ controlURL := startControl(t)
|
|
|
+
|
|
|
+ tmp := t.TempDir()
|
|
|
+ tmps1 := filepath.Join(tmp, "s1")
|
|
|
+ os.MkdirAll(tmps1, 0755)
|
|
|
+
|
|
|
+ newServer := func() *Server {
|
|
|
+ return &Server{
|
|
|
+ Dir: tmps1,
|
|
|
+ ControlURL: controlURL,
|
|
|
+ Hostname: "s1",
|
|
|
+ Logf: logger.TestLogger(t),
|
|
|
+ }
|
|
|
+ }
|
|
|
+ s1 := newServer()
|
|
|
+ defer s1.Close()
|
|
|
+
|
|
|
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
|
+ defer cancel()
|
|
|
+
|
|
|
+ s1status, err := s1.Up(ctx)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ firstIPs := s1status.TailscaleIPs
|
|
|
+ t.Logf("IPs: %v", firstIPs)
|
|
|
+
|
|
|
+ if err := s1.Close(); err != nil {
|
|
|
+ t.Fatalf("Close: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ s2 := newServer()
|
|
|
+ defer s2.Close()
|
|
|
+
|
|
|
+ s2status, err := s2.Up(ctx)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("second Up: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ secondIPs := s2status.TailscaleIPs
|
|
|
+ t.Logf("IPs: %v", secondIPs)
|
|
|
+
|
|
|
+ if !reflect.DeepEqual(firstIPs, secondIPs) {
|
|
|
+ t.Fatalf("got %v but later %v", firstIPs, secondIPs)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func TestFunnel(t *testing.T) {
|
|
|
ctx, dialCancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
|
defer dialCancel()
|