mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			294 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			294 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
// Copyright 2011 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.
 | 
						|
 | 
						|
package net
 | 
						|
 | 
						|
import (
 | 
						|
	"os"
 | 
						|
	"reflect"
 | 
						|
	"runtime"
 | 
						|
	"sync"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
// The full stack test cases for IPConn have been moved to the
 | 
						|
// following:
 | 
						|
//      golang.org/x/net/ipv4
 | 
						|
//      golang.org/x/net/ipv6
 | 
						|
//      golang.org/x/net/icmp
 | 
						|
 | 
						|
var fileConnTests = []struct {
 | 
						|
	network string
 | 
						|
}{
 | 
						|
	{"tcp"},
 | 
						|
	{"udp"},
 | 
						|
	{"unix"},
 | 
						|
	{"unixpacket"},
 | 
						|
}
 | 
						|
 | 
						|
func TestFileConn(t *testing.T) {
 | 
						|
	switch runtime.GOOS {
 | 
						|
	case "nacl", "plan9", "windows":
 | 
						|
		t.Skipf("not supported on %s", runtime.GOOS)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tt := range fileConnTests {
 | 
						|
		if !testableNetwork(tt.network) {
 | 
						|
			t.Logf("skipping %s test", tt.network)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		var network, address string
 | 
						|
		switch tt.network {
 | 
						|
		case "udp":
 | 
						|
			c, err := newLocalPacketListener(tt.network)
 | 
						|
			if err != nil {
 | 
						|
				t.Fatal(err)
 | 
						|
			}
 | 
						|
			defer c.Close()
 | 
						|
			network = c.LocalAddr().Network()
 | 
						|
			address = c.LocalAddr().String()
 | 
						|
		default:
 | 
						|
			handler := func(ls *localServer, ln Listener) {
 | 
						|
				c, err := ln.Accept()
 | 
						|
				if err != nil {
 | 
						|
					return
 | 
						|
				}
 | 
						|
				defer c.Close()
 | 
						|
				var b [1]byte
 | 
						|
				c.Read(b[:])
 | 
						|
			}
 | 
						|
			ls, err := newLocalServer(tt.network)
 | 
						|
			if err != nil {
 | 
						|
				t.Fatal(err)
 | 
						|
			}
 | 
						|
			defer ls.teardown()
 | 
						|
			if err := ls.buildup(handler); err != nil {
 | 
						|
				t.Fatal(err)
 | 
						|
			}
 | 
						|
			network = ls.Listener.Addr().Network()
 | 
						|
			address = ls.Listener.Addr().String()
 | 
						|
		}
 | 
						|
 | 
						|
		c1, err := Dial(network, address)
 | 
						|
		if err != nil {
 | 
						|
			if perr := parseDialError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		addr := c1.LocalAddr()
 | 
						|
 | 
						|
		var f *os.File
 | 
						|
		switch c1 := c1.(type) {
 | 
						|
		case *TCPConn:
 | 
						|
			f, err = c1.File()
 | 
						|
		case *UDPConn:
 | 
						|
			f, err = c1.File()
 | 
						|
		case *UnixConn:
 | 
						|
			f, err = c1.File()
 | 
						|
		}
 | 
						|
		if err := c1.Close(); err != nil {
 | 
						|
			if perr := parseCloseError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Error(err)
 | 
						|
		}
 | 
						|
		if err != nil {
 | 
						|
			if perr := parseCommonError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
 | 
						|
		c2, err := FileConn(f)
 | 
						|
		if err := f.Close(); err != nil {
 | 
						|
			t.Error(err)
 | 
						|
		}
 | 
						|
		if err != nil {
 | 
						|
			if perr := parseCommonError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		defer c2.Close()
 | 
						|
 | 
						|
		if _, err := c2.Write([]byte("FILECONN TEST")); err != nil {
 | 
						|
			if perr := parseWriteError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		if !reflect.DeepEqual(c2.LocalAddr(), addr) {
 | 
						|
			t.Fatalf("got %#v; want %#v", c2.LocalAddr(), addr)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
var fileListenerTests = []struct {
 | 
						|
	network string
 | 
						|
}{
 | 
						|
	{"tcp"},
 | 
						|
	{"unix"},
 | 
						|
	{"unixpacket"},
 | 
						|
}
 | 
						|
 | 
						|
func TestFileListener(t *testing.T) {
 | 
						|
	switch runtime.GOOS {
 | 
						|
	case "nacl", "plan9", "windows":
 | 
						|
		t.Skipf("not supported on %s", runtime.GOOS)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tt := range fileListenerTests {
 | 
						|
		if !testableNetwork(tt.network) {
 | 
						|
			t.Logf("skipping %s test", tt.network)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		ln1, err := newLocalListener(tt.network)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		switch tt.network {
 | 
						|
		case "unix", "unixpacket":
 | 
						|
			defer os.Remove(ln1.Addr().String())
 | 
						|
		}
 | 
						|
		addr := ln1.Addr()
 | 
						|
 | 
						|
		var f *os.File
 | 
						|
		switch ln1 := ln1.(type) {
 | 
						|
		case *TCPListener:
 | 
						|
			f, err = ln1.File()
 | 
						|
		case *UnixListener:
 | 
						|
			f, err = ln1.File()
 | 
						|
		}
 | 
						|
		switch tt.network {
 | 
						|
		case "unix", "unixpacket":
 | 
						|
			defer ln1.Close() // UnixListener.Close calls syscall.Unlink internally
 | 
						|
		default:
 | 
						|
			if err := ln1.Close(); err != nil {
 | 
						|
				t.Error(err)
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if err != nil {
 | 
						|
			if perr := parseCommonError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
 | 
						|
		ln2, err := FileListener(f)
 | 
						|
		if err := f.Close(); err != nil {
 | 
						|
			t.Error(err)
 | 
						|
		}
 | 
						|
		if err != nil {
 | 
						|
			if perr := parseCommonError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		defer ln2.Close()
 | 
						|
 | 
						|
		var wg sync.WaitGroup
 | 
						|
		wg.Add(1)
 | 
						|
		go func() {
 | 
						|
			defer wg.Done()
 | 
						|
			c, err := Dial(ln2.Addr().Network(), ln2.Addr().String())
 | 
						|
			if err != nil {
 | 
						|
				if perr := parseDialError(err); perr != nil {
 | 
						|
					t.Error(perr)
 | 
						|
				}
 | 
						|
				t.Error(err)
 | 
						|
				return
 | 
						|
			}
 | 
						|
			c.Close()
 | 
						|
		}()
 | 
						|
		c, err := ln2.Accept()
 | 
						|
		if err != nil {
 | 
						|
			if perr := parseAcceptError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		c.Close()
 | 
						|
		wg.Wait()
 | 
						|
		if !reflect.DeepEqual(ln2.Addr(), addr) {
 | 
						|
			t.Fatalf("got %#v; want %#v", ln2.Addr(), addr)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
var filePacketConnTests = []struct {
 | 
						|
	network string
 | 
						|
}{
 | 
						|
	{"udp"},
 | 
						|
	{"unixgram"},
 | 
						|
}
 | 
						|
 | 
						|
func TestFilePacketConn(t *testing.T) {
 | 
						|
	switch runtime.GOOS {
 | 
						|
	case "nacl", "plan9", "windows":
 | 
						|
		t.Skipf("not supported on %s", runtime.GOOS)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tt := range filePacketConnTests {
 | 
						|
		if !testableNetwork(tt.network) {
 | 
						|
			t.Logf("skipping %s test", tt.network)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		c1, err := newLocalPacketListener(tt.network)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		switch tt.network {
 | 
						|
		case "unixgram":
 | 
						|
			defer os.Remove(c1.LocalAddr().String())
 | 
						|
		}
 | 
						|
		addr := c1.LocalAddr()
 | 
						|
 | 
						|
		var f *os.File
 | 
						|
		switch c1 := c1.(type) {
 | 
						|
		case *UDPConn:
 | 
						|
			f, err = c1.File()
 | 
						|
		case *UnixConn:
 | 
						|
			f, err = c1.File()
 | 
						|
		}
 | 
						|
		if err := c1.Close(); err != nil {
 | 
						|
			if perr := parseCloseError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Error(err)
 | 
						|
		}
 | 
						|
		if err != nil {
 | 
						|
			if perr := parseCommonError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
 | 
						|
		c2, err := FilePacketConn(f)
 | 
						|
		if err := f.Close(); err != nil {
 | 
						|
			t.Error(err)
 | 
						|
		}
 | 
						|
		if err != nil {
 | 
						|
			if perr := parseCommonError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		defer c2.Close()
 | 
						|
 | 
						|
		if _, err := c2.WriteTo([]byte("FILEPACKETCONN TEST"), addr); err != nil {
 | 
						|
			if perr := parseWriteError(err); perr != nil {
 | 
						|
				t.Error(perr)
 | 
						|
			}
 | 
						|
			t.Fatal(err)
 | 
						|
		}
 | 
						|
		if !reflect.DeepEqual(c2.LocalAddr(), addr) {
 | 
						|
			t.Fatalf("got %#v; want %#v", c2.LocalAddr(), addr)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |