mocktransponder_test.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. package ipv4_test
  5. import (
  6. "net"
  7. "testing"
  8. )
  9. func isUnicast(ip net.IP) bool {
  10. return ip.To4() != nil && (ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsGlobalUnicast())
  11. }
  12. // LoopbackInterface returns a logical network interface for loopback
  13. // tests.
  14. func loopbackInterface() *net.Interface {
  15. ift, err := net.Interfaces()
  16. if err != nil {
  17. return nil
  18. }
  19. for _, ifi := range ift {
  20. if ifi.Flags&net.FlagLoopback == 0 || ifi.Flags&net.FlagUp == 0 {
  21. continue
  22. }
  23. ifat, err := ifi.Addrs()
  24. if err != nil {
  25. continue
  26. }
  27. for _, ifa := range ifat {
  28. switch ifa := ifa.(type) {
  29. case *net.IPAddr:
  30. if isUnicast(ifa.IP) {
  31. return &ifi
  32. }
  33. case *net.IPNet:
  34. if isUnicast(ifa.IP) {
  35. return &ifi
  36. }
  37. }
  38. }
  39. }
  40. return nil
  41. }
  42. // isMulticastAvailable returns true if ifi is a multicast access
  43. // enabled network interface. It also returns a unicast IPv4 address
  44. // that can be used for listening on ifi.
  45. func isMulticastAvailable(ifi *net.Interface) (net.IP, bool) {
  46. if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 {
  47. return nil, false
  48. }
  49. ifat, err := ifi.Addrs()
  50. if err != nil {
  51. return nil, false
  52. }
  53. for _, ifa := range ifat {
  54. switch ifa := ifa.(type) {
  55. case *net.IPAddr:
  56. if isUnicast(ifa.IP) {
  57. return ifa.IP, true
  58. }
  59. case *net.IPNet:
  60. if isUnicast(ifa.IP) {
  61. return ifa.IP, true
  62. }
  63. }
  64. }
  65. return nil, false
  66. }
  67. func acceptor(t *testing.T, ln net.Listener, done chan<- bool) {
  68. defer func() { done <- true }()
  69. c, err := ln.Accept()
  70. if err != nil {
  71. t.Errorf("net.Listener.Accept failed: %v", err)
  72. return
  73. }
  74. c.Close()
  75. }