| // Copyright 2018 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // +build windows | |
| package net | |
| import ( | |
| "internal/syscall/windows/registry" | |
| "os" | |
| "reflect" | |
| "runtime" | |
| "strconv" | |
| "testing" | |
| ) | |
| func isBuild17063() bool { | |
| k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.READ) | |
| if err != nil { | |
| return false | |
| } | |
| defer k.Close() | |
| s, _, err := k.GetStringValue("CurrentBuild") | |
| if err != nil { | |
| return false | |
| } | |
| ver, err := strconv.Atoi(s) | |
| if err != nil { | |
| return false | |
| } | |
| return ver >= 17063 | |
| } | |
| func TestUnixConnLocalWindows(t *testing.T) { | |
| switch runtime.GOARCH { | |
| case "386": | |
| t.Skip("not supported on windows/386, see golang.org/issue/27943") | |
| case "arm": | |
| t.Skip("not supported on windows/arm, see golang.org/issue/28061") | |
| } | |
| if !isBuild17063() { | |
| t.Skip("unix test") | |
| } | |
| handler := func(ls *localServer, ln Listener) {} | |
| for _, laddr := range []string{"", testUnixAddr()} { | |
| laddr := laddr | |
| taddr := testUnixAddr() | |
| ta, err := ResolveUnixAddr("unix", taddr) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| ln, err := ListenUnix("unix", ta) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| ls, err := (&streamListener{Listener: ln}).newLocalServer() | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| defer ls.teardown() | |
| if err := ls.buildup(handler); err != nil { | |
| t.Fatal(err) | |
| } | |
| la, err := ResolveUnixAddr("unix", laddr) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| c, err := DialUnix("unix", la, ta) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| defer func() { | |
| c.Close() | |
| if la != nil { | |
| defer os.Remove(laddr) | |
| } | |
| }() | |
| if _, err := c.Write([]byte("UNIXCONN LOCAL AND REMOTE NAME TEST")); err != nil { | |
| t.Fatal(err) | |
| } | |
| if laddr == "" { | |
| laddr = "@" | |
| } | |
| var connAddrs = [3]struct{ got, want Addr }{ | |
| {ln.Addr(), ta}, | |
| {c.LocalAddr(), &UnixAddr{Name: laddr, Net: "unix"}}, | |
| {c.RemoteAddr(), ta}, | |
| } | |
| for _, ca := range connAddrs { | |
| if !reflect.DeepEqual(ca.got, ca.want) { | |
| t.Fatalf("got %#v, expected %#v", ca.got, ca.want) | |
| } | |
| } | |
| } | |
| } |