mocktransponder_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright 2013 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. package ipv6_test
  5. import (
  6. "net"
  7. "testing"
  8. )
  9. func isLinkLocalUnicast(ip net.IP) bool {
  10. return ip.To4() == nil && ip.To16() != nil && ip.IsLinkLocalUnicast()
  11. }
  12. func loopbackInterface() *net.Interface {
  13. ift, err := net.Interfaces()
  14. if err != nil {
  15. return nil
  16. }
  17. for _, ifi := range ift {
  18. if ifi.Flags&net.FlagLoopback == 0 || ifi.Flags&net.FlagUp == 0 {
  19. continue
  20. }
  21. ifat, err := ifi.Addrs()
  22. if err != nil {
  23. continue
  24. }
  25. for _, ifa := range ifat {
  26. switch ifa := ifa.(type) {
  27. case *net.IPAddr:
  28. if isLinkLocalUnicast(ifa.IP) {
  29. return &ifi
  30. }
  31. case *net.IPNet:
  32. if isLinkLocalUnicast(ifa.IP) {
  33. return &ifi
  34. }
  35. }
  36. }
  37. }
  38. return nil
  39. }
  40. func isMulticastAvailable(ifi *net.Interface) (net.IP, bool) {
  41. if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 {
  42. return nil, false
  43. }
  44. ifat, err := ifi.Addrs()
  45. if err != nil {
  46. return nil, false
  47. }
  48. for _, ifa := range ifat {
  49. switch ifa := ifa.(type) {
  50. case *net.IPAddr:
  51. if isLinkLocalUnicast(ifa.IP) {
  52. return ifa.IP, true
  53. }
  54. case *net.IPNet:
  55. if isLinkLocalUnicast(ifa.IP) {
  56. return ifa.IP, true
  57. }
  58. }
  59. }
  60. return nil, false
  61. }
  62. func connector(t *testing.T, network, addr string, done chan<- bool) {
  63. defer func() { done <- true }()
  64. c, err := net.Dial(network, addr)
  65. if err != nil {
  66. t.Errorf("net.Dial failed: %v", err)
  67. return
  68. }
  69. c.Close()
  70. }
  71. func acceptor(t *testing.T, ln net.Listener, done chan<- bool) {
  72. defer func() { done <- true }()
  73. c, err := ln.Accept()
  74. if err != nil {
  75. t.Errorf("net.Listener.Accept failed: %v", err)
  76. return
  77. }
  78. c.Close()
  79. }
  80. func transponder(t *testing.T, ln net.Listener, done chan<- bool) {
  81. defer func() { done <- true }()
  82. c, err := ln.Accept()
  83. if err != nil {
  84. t.Errorf("net.Listener.Accept failed: %v", err)
  85. return
  86. }
  87. defer c.Close()
  88. b := make([]byte, 128)
  89. n, err := c.Read(b)
  90. if err != nil {
  91. t.Errorf("net.Conn.Read failed: %v", err)
  92. return
  93. }
  94. if _, err := c.Write(b[:n]); err != nil {
  95. t.Errorf("net.Conn.Write failed: %v", err)
  96. return
  97. }
  98. }