...
Run Format

Source file src/net/packetconn_test.go

Documentation: net

  // Copyright 2012 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.
  
  // This file implements API tests across platforms and will never have a build
  // tag.
  
  package net
  
  import (
  	"os"
  	"testing"
  	"time"
  )
  
  // 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
  
  func packetConnTestData(t *testing.T, network string) ([]byte, func()) {
  	if !testableNetwork(network) {
  		return nil, func() { t.Logf("skipping %s test", network) }
  	}
  	return []byte("PACKETCONN TEST"), nil
  }
  
  var packetConnTests = []struct {
  	net   string
  	addr1 string
  	addr2 string
  }{
  	{"udp", "127.0.0.1:0", "127.0.0.1:0"},
  	{"unixgram", testUnixAddr(), testUnixAddr()},
  }
  
  func TestPacketConn(t *testing.T) {
  	closer := func(c PacketConn, net, addr1, addr2 string) {
  		c.Close()
  		switch net {
  		case "unixgram":
  			os.Remove(addr1)
  			os.Remove(addr2)
  		}
  	}
  
  	for _, tt := range packetConnTests {
  		wb, skipOrFatalFn := packetConnTestData(t, tt.net)
  		if skipOrFatalFn != nil {
  			skipOrFatalFn()
  			continue
  		}
  
  		c1, err := ListenPacket(tt.net, tt.addr1)
  		if err != nil {
  			t.Fatal(err)
  		}
  		defer closer(c1, tt.net, tt.addr1, tt.addr2)
  		c1.LocalAddr()
  		c1.SetDeadline(time.Now().Add(500 * time.Millisecond))
  		c1.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
  		c1.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
  
  		c2, err := ListenPacket(tt.net, tt.addr2)
  		if err != nil {
  			t.Fatal(err)
  		}
  		defer closer(c2, tt.net, tt.addr1, tt.addr2)
  		c2.LocalAddr()
  		c2.SetDeadline(time.Now().Add(500 * time.Millisecond))
  		c2.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
  		c2.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
  		rb2 := make([]byte, 128)
  
  		if _, err := c1.WriteTo(wb, c2.LocalAddr()); err != nil {
  			t.Fatal(err)
  		}
  		if _, _, err := c2.ReadFrom(rb2); err != nil {
  			t.Fatal(err)
  		}
  		if _, err := c2.WriteTo(wb, c1.LocalAddr()); err != nil {
  			t.Fatal(err)
  		}
  		rb1 := make([]byte, 128)
  		if _, _, err := c1.ReadFrom(rb1); err != nil {
  			t.Fatal(err)
  		}
  	}
  }
  
  func TestConnAndPacketConn(t *testing.T) {
  	closer := func(c PacketConn, net, addr1, addr2 string) {
  		c.Close()
  		switch net {
  		case "unixgram":
  			os.Remove(addr1)
  			os.Remove(addr2)
  		}
  	}
  
  	for _, tt := range packetConnTests {
  		var wb []byte
  		wb, skipOrFatalFn := packetConnTestData(t, tt.net)
  		if skipOrFatalFn != nil {
  			skipOrFatalFn()
  			continue
  		}
  
  		c1, err := ListenPacket(tt.net, tt.addr1)
  		if err != nil {
  			t.Fatal(err)
  		}
  		defer closer(c1, tt.net, tt.addr1, tt.addr2)
  		c1.LocalAddr()
  		c1.SetDeadline(time.Now().Add(500 * time.Millisecond))
  		c1.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
  		c1.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
  
  		c2, err := Dial(tt.net, c1.LocalAddr().String())
  		if err != nil {
  			t.Fatal(err)
  		}
  		defer c2.Close()
  		c2.LocalAddr()
  		c2.RemoteAddr()
  		c2.SetDeadline(time.Now().Add(500 * time.Millisecond))
  		c2.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
  		c2.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
  
  		if _, err := c2.Write(wb); err != nil {
  			t.Fatal(err)
  		}
  		rb1 := make([]byte, 128)
  		if _, _, err := c1.ReadFrom(rb1); err != nil {
  			t.Fatal(err)
  		}
  		var dst Addr
  		switch tt.net {
  		case "unixgram":
  			continue
  		default:
  			dst = c2.LocalAddr()
  		}
  		if _, err := c1.WriteTo(wb, dst); err != nil {
  			t.Fatal(err)
  		}
  		rb2 := make([]byte, 128)
  		if _, err := c2.Read(rb2); err != nil {
  			t.Fatal(err)
  		}
  	}
  }
  

View as plain text