github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/go/net/packetconn_test.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // This file implements API tests across platforms and will never have a build
     6  // tag.
     7  
     8  // +build !js
     9  
    10  package net
    11  
    12  import (
    13  	"os"
    14  	"testing"
    15  	"time"
    16  )
    17  
    18  // The full stack test cases for IPConn have been moved to the
    19  // following:
    20  //	golang.org/x/net/ipv4
    21  //	golang.org/x/net/ipv6
    22  //	golang.org/x/net/icmp
    23  
    24  func packetConnTestData(t *testing.T, network string) ([]byte, func()) {
    25  	if !testableNetwork(network) {
    26  		return nil, func() { t.Logf("skipping %s test", network) }
    27  	}
    28  	return []byte("PACKETCONN TEST"), nil
    29  }
    30  
    31  var packetConnTests = []struct {
    32  	net   string
    33  	addr1 string
    34  	addr2 string
    35  }{
    36  	{"udp", "127.0.0.1:0", "127.0.0.1:0"},
    37  	{"unixgram", testUnixAddr(), testUnixAddr()},
    38  }
    39  
    40  func TestPacketConn(t *testing.T) {
    41  	closer := func(c PacketConn, net, addr1, addr2 string) {
    42  		c.Close()
    43  		switch net {
    44  		case "unixgram":
    45  			os.Remove(addr1)
    46  			os.Remove(addr2)
    47  		}
    48  	}
    49  
    50  	for _, tt := range packetConnTests {
    51  		wb, skipOrFatalFn := packetConnTestData(t, tt.net)
    52  		if skipOrFatalFn != nil {
    53  			skipOrFatalFn()
    54  			continue
    55  		}
    56  
    57  		c1, err := ListenPacket(tt.net, tt.addr1)
    58  		if err != nil {
    59  			t.Fatal(err)
    60  		}
    61  		defer closer(c1, tt.net, tt.addr1, tt.addr2)
    62  		c1.LocalAddr()
    63  		c1.SetDeadline(time.Now().Add(500 * time.Millisecond))
    64  		c1.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
    65  		c1.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
    66  
    67  		c2, err := ListenPacket(tt.net, tt.addr2)
    68  		if err != nil {
    69  			t.Fatal(err)
    70  		}
    71  		defer closer(c2, tt.net, tt.addr1, tt.addr2)
    72  		c2.LocalAddr()
    73  		c2.SetDeadline(time.Now().Add(500 * time.Millisecond))
    74  		c2.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
    75  		c2.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
    76  		rb2 := make([]byte, 128)
    77  
    78  		if _, err := c1.WriteTo(wb, c2.LocalAddr()); err != nil {
    79  			t.Fatal(err)
    80  		}
    81  		if _, _, err := c2.ReadFrom(rb2); err != nil {
    82  			t.Fatal(err)
    83  		}
    84  		if _, err := c2.WriteTo(wb, c1.LocalAddr()); err != nil {
    85  			t.Fatal(err)
    86  		}
    87  		rb1 := make([]byte, 128)
    88  		if _, _, err := c1.ReadFrom(rb1); err != nil {
    89  			t.Fatal(err)
    90  		}
    91  	}
    92  }
    93  
    94  func TestConnAndPacketConn(t *testing.T) {
    95  	closer := func(c PacketConn, net, addr1, addr2 string) {
    96  		c.Close()
    97  		switch net {
    98  		case "unixgram":
    99  			os.Remove(addr1)
   100  			os.Remove(addr2)
   101  		}
   102  	}
   103  
   104  	for _, tt := range packetConnTests {
   105  		var wb []byte
   106  		wb, skipOrFatalFn := packetConnTestData(t, tt.net)
   107  		if skipOrFatalFn != nil {
   108  			skipOrFatalFn()
   109  			continue
   110  		}
   111  
   112  		c1, err := ListenPacket(tt.net, tt.addr1)
   113  		if err != nil {
   114  			t.Fatal(err)
   115  		}
   116  		defer closer(c1, tt.net, tt.addr1, tt.addr2)
   117  		c1.LocalAddr()
   118  		c1.SetDeadline(time.Now().Add(500 * time.Millisecond))
   119  		c1.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
   120  		c1.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
   121  
   122  		c2, err := Dial(tt.net, c1.LocalAddr().String())
   123  		if err != nil {
   124  			t.Fatal(err)
   125  		}
   126  		defer c2.Close()
   127  		c2.LocalAddr()
   128  		c2.RemoteAddr()
   129  		c2.SetDeadline(time.Now().Add(500 * time.Millisecond))
   130  		c2.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
   131  		c2.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
   132  
   133  		if _, err := c2.Write(wb); err != nil {
   134  			t.Fatal(err)
   135  		}
   136  		rb1 := make([]byte, 128)
   137  		if _, _, err := c1.ReadFrom(rb1); err != nil {
   138  			t.Fatal(err)
   139  		}
   140  		var dst Addr
   141  		switch tt.net {
   142  		case "unixgram":
   143  			continue
   144  		default:
   145  			dst = c2.LocalAddr()
   146  		}
   147  		if _, err := c1.WriteTo(wb, dst); err != nil {
   148  			t.Fatal(err)
   149  		}
   150  		rb2 := make([]byte, 128)
   151  		if _, err := c2.Read(rb2); err != nil {
   152  			t.Fatal(err)
   153  		}
   154  	}
   155  }