packetconn_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. // This file implements API tests across platforms and will never have a build
  5. // tag.
  6. package net
  7. import (
  8. "os"
  9. "runtime"
  10. "strings"
  11. "testing"
  12. "time"
  13. )
  14. func packetConnTestData(t *testing.T, net string, i int) ([]byte, func()) {
  15. switch net {
  16. case "udp":
  17. return []byte("UDP PACKETCONN TEST"), nil
  18. case "ip":
  19. if skip, skipmsg := skipRawSocketTest(t); skip {
  20. return nil, func() {
  21. t.Logf(skipmsg)
  22. }
  23. }
  24. b, err := (&icmpMessage{
  25. Type: icmpv4EchoRequest, Code: 0,
  26. Body: &icmpEcho{
  27. ID: os.Getpid() & 0xffff, Seq: i + 1,
  28. Data: []byte("IP PACKETCONN TEST"),
  29. },
  30. }).Marshal()
  31. if err != nil {
  32. return nil, func() {
  33. t.Fatalf("icmpMessage.Marshal failed: %v", err)
  34. }
  35. }
  36. return b, nil
  37. case "unixgram":
  38. switch runtime.GOOS {
  39. case "nacl", "plan9", "windows":
  40. return nil, func() {
  41. t.Logf("skipping %q test on %q", net, runtime.GOOS)
  42. }
  43. default:
  44. return []byte("UNIXGRAM PACKETCONN TEST"), nil
  45. }
  46. default:
  47. return nil, func() {
  48. t.Logf("skipping %q test", net)
  49. }
  50. }
  51. }
  52. var packetConnTests = []struct {
  53. net string
  54. addr1 string
  55. addr2 string
  56. }{
  57. {"udp", "127.0.0.1:0", "127.0.0.1:0"},
  58. {"ip:icmp", "127.0.0.1", "127.0.0.1"},
  59. {"unixgram", testUnixAddr(), testUnixAddr()},
  60. }
  61. func TestPacketConn(t *testing.T) {
  62. closer := func(c PacketConn, net, addr1, addr2 string) {
  63. c.Close()
  64. switch net {
  65. case "unixgram":
  66. os.Remove(addr1)
  67. os.Remove(addr2)
  68. }
  69. }
  70. for i, tt := range packetConnTests {
  71. netstr := strings.Split(tt.net, ":")
  72. wb, skipOrFatalFn := packetConnTestData(t, netstr[0], i)
  73. if skipOrFatalFn != nil {
  74. skipOrFatalFn()
  75. continue
  76. }
  77. c1, err := ListenPacket(tt.net, tt.addr1)
  78. if err != nil {
  79. t.Fatalf("ListenPacket failed: %v", err)
  80. }
  81. defer closer(c1, netstr[0], tt.addr1, tt.addr2)
  82. c1.LocalAddr()
  83. c1.SetDeadline(time.Now().Add(100 * time.Millisecond))
  84. c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
  85. c1.SetWriteDeadline(time.Now().Add(100 * time.Millisecond))
  86. c2, err := ListenPacket(tt.net, tt.addr2)
  87. if err != nil {
  88. t.Fatalf("ListenPacket failed: %v", err)
  89. }
  90. defer closer(c2, netstr[0], tt.addr1, tt.addr2)
  91. c2.LocalAddr()
  92. c2.SetDeadline(time.Now().Add(100 * time.Millisecond))
  93. c2.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
  94. c2.SetWriteDeadline(time.Now().Add(100 * time.Millisecond))
  95. if _, err := c1.WriteTo(wb, c2.LocalAddr()); err != nil {
  96. t.Fatalf("PacketConn.WriteTo failed: %v", err)
  97. }
  98. rb2 := make([]byte, 128)
  99. if _, _, err := c2.ReadFrom(rb2); err != nil {
  100. t.Fatalf("PacketConn.ReadFrom failed: %v", err)
  101. }
  102. if _, err := c2.WriteTo(wb, c1.LocalAddr()); err != nil {
  103. t.Fatalf("PacketConn.WriteTo failed: %v", err)
  104. }
  105. rb1 := make([]byte, 128)
  106. if _, _, err := c1.ReadFrom(rb1); err != nil {
  107. t.Fatalf("PacketConn.ReadFrom failed: %v", err)
  108. }
  109. }
  110. }
  111. func TestConnAndPacketConn(t *testing.T) {
  112. closer := func(c PacketConn, net, addr1, addr2 string) {
  113. c.Close()
  114. switch net {
  115. case "unixgram":
  116. os.Remove(addr1)
  117. os.Remove(addr2)
  118. }
  119. }
  120. for i, tt := range packetConnTests {
  121. var wb []byte
  122. netstr := strings.Split(tt.net, ":")
  123. wb, skipOrFatalFn := packetConnTestData(t, netstr[0], i)
  124. if skipOrFatalFn != nil {
  125. skipOrFatalFn()
  126. continue
  127. }
  128. c1, err := ListenPacket(tt.net, tt.addr1)
  129. if err != nil {
  130. t.Fatalf("ListenPacket failed: %v", err)
  131. }
  132. defer closer(c1, netstr[0], tt.addr1, tt.addr2)
  133. c1.LocalAddr()
  134. c1.SetDeadline(time.Now().Add(100 * time.Millisecond))
  135. c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
  136. c1.SetWriteDeadline(time.Now().Add(100 * time.Millisecond))
  137. c2, err := Dial(tt.net, c1.LocalAddr().String())
  138. if err != nil {
  139. t.Fatalf("Dial failed: %v", err)
  140. }
  141. defer c2.Close()
  142. c2.LocalAddr()
  143. c2.RemoteAddr()
  144. c2.SetDeadline(time.Now().Add(100 * time.Millisecond))
  145. c2.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
  146. c2.SetWriteDeadline(time.Now().Add(100 * time.Millisecond))
  147. if _, err := c2.Write(wb); err != nil {
  148. t.Fatalf("Conn.Write failed: %v", err)
  149. }
  150. rb1 := make([]byte, 128)
  151. if _, _, err := c1.ReadFrom(rb1); err != nil {
  152. t.Fatalf("PacketConn.ReadFrom failed: %v", err)
  153. }
  154. var dst Addr
  155. switch netstr[0] {
  156. case "ip":
  157. dst = &IPAddr{IP: IPv4(127, 0, 0, 1)}
  158. case "unixgram":
  159. continue
  160. default:
  161. dst = c2.LocalAddr()
  162. }
  163. if _, err := c1.WriteTo(wb, dst); err != nil {
  164. t.Fatalf("PacketConn.WriteTo failed: %v", err)
  165. }
  166. rb2 := make([]byte, 128)
  167. if _, err := c2.Read(rb2); err != nil {
  168. t.Fatalf("Conn.Read failed: %v", err)
  169. }
  170. }
  171. }