|  | // 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) | 
|  | } | 
|  | } | 
|  | } | 
|  | } |