getport_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package getport
  15. import (
  16. "net"
  17. "testing"
  18. "time"
  19. "github.com/stretchr/testify/assert"
  20. "yunion.io/x/log"
  21. )
  22. func TestGetPort(t *testing.T) {
  23. t.Run("gets empty tcp port", func(t *testing.T) {
  24. portResult, err := GetPort(TCP, "127.0.0.1")
  25. assert.NoError(t, err)
  26. assert.Contains(t, []string{"127.0.0.1", "::1"}, portResult.IP)
  27. assert.Greater(t, portResult.Port, 0)
  28. })
  29. t.Run("get by empty address", func(t *testing.T) {
  30. result, err := GetPort(TCP4, "")
  31. assert.NoError(t, err)
  32. log.Infof("result: %#v", result)
  33. })
  34. t.Run("gets empty tcp4 port", func(t *testing.T) {
  35. portResult, err := GetPort(TCP4, "127.0.0.1")
  36. assert.NoError(t, err)
  37. assert.Equal(t, portResult.IP, "127.0.0.1")
  38. assert.Greater(t, portResult.Port, 0)
  39. })
  40. t.Run("gets empty tcp6 port", func(t *testing.T) {
  41. portResult, err := GetPort(TCP6, "::1")
  42. assert.NoError(t, err)
  43. assert.Equal(t, portResult.IP, "::1")
  44. assert.Greater(t, portResult.Port, 0)
  45. })
  46. t.Run("gets empty udp port", func(t *testing.T) {
  47. portResult, err := GetPort(UDP, "127.0.0.1")
  48. assert.NoError(t, err)
  49. assert.Contains(t, []string{"127.0.0.1", "::1"}, portResult.IP)
  50. assert.Greater(t, portResult.Port, 0)
  51. })
  52. t.Run("gets empty udp4 port", func(t *testing.T) {
  53. portResult, err := GetPort(UDP4, "127.0.0.1")
  54. assert.NoError(t, err)
  55. assert.Equal(t, portResult.IP, "127.0.0.1")
  56. assert.Greater(t, portResult.Port, 0)
  57. })
  58. t.Run("gets empty udp6 port", func(t *testing.T) {
  59. portResult, err := GetPort(UDP6, "::1")
  60. assert.NoError(t, err)
  61. assert.Equal(t, portResult.IP, "::1")
  62. assert.Greater(t, portResult.Port, 0)
  63. })
  64. t.Run("errors for bad protocol", func(t *testing.T) {
  65. portResult, err := GetPort(-1, "127.0.0.1")
  66. assert.Equal(t, portResult.IP, "")
  67. assert.Equal(t, portResult.Port, -1)
  68. assert.Error(t, err, "stack not recognized")
  69. })
  70. t.Run("get port within 30000 to 31000", func(t *testing.T) {
  71. portResult, err := GetPortByRange(TCP4, 30000, 31000)
  72. assert.NoError(t, err)
  73. log.Infof("port result: %#v", portResult)
  74. assert.Greater(t, portResult.Port, 30000)
  75. })
  76. t.Run("get port within 30000 to 30001 except 30001", func(t *testing.T) {
  77. var l net.Listener
  78. var err error
  79. go func() {
  80. l, err = net.Listen("tcp4", net.JoinHostPort("", "30001"))
  81. if err != nil {
  82. t.Fatalf("listen 30001 tcp port: %v", err)
  83. }
  84. log.Infof("listen port 30001")
  85. }()
  86. time.Sleep(1 * time.Second)
  87. portResult, err := GetPortByRange(TCP4, 30000, 30001)
  88. assert.NoError(t, err)
  89. log.Infof("port result: %#v", portResult)
  90. assert.Equal(t, portResult.Port, 30000)
  91. l.Close()
  92. })
  93. }
  94. func TestGetTcpPort(t *testing.T) {
  95. portResult, err := GetTcpPort()
  96. assert.NoError(t, err)
  97. assert.Greater(t, portResult.Port, 0)
  98. }
  99. func TestGetTcp4Port(t *testing.T) {
  100. portResult, err := GetTcp4Port()
  101. assert.NoError(t, err)
  102. assert.Greater(t, portResult.Port, 0)
  103. }
  104. func TestGetTcp6Port(t *testing.T) {
  105. portResult, err := GetTcp6Port()
  106. assert.NoError(t, err)
  107. assert.Greater(t, portResult.Port, 0)
  108. }
  109. func TestGetUdpPort(t *testing.T) {
  110. portResult, err := GetUdpPort()
  111. assert.NoError(t, err)
  112. assert.Greater(t, portResult.Port, 0)
  113. }
  114. func TestGetUdp4Port(t *testing.T) {
  115. portResult, err := GetUdp4Port()
  116. assert.NoError(t, err)
  117. assert.Greater(t, portResult.Port, 0)
  118. }
  119. func TestGetUdp6Port(t *testing.T) {
  120. portResult, err := GetUdp6Port()
  121. assert.NoError(t, err)
  122. assert.Greater(t, portResult.Port, 0)
  123. }
  124. func TestGetTcpPortForAddress(t *testing.T) {
  125. portResult, err := GetTcpPortForAddress("127.0.0.1")
  126. assert.NoError(t, err)
  127. assert.Greater(t, portResult.Port, 0)
  128. }
  129. func TestGetTcp4PortForAddress(t *testing.T) {
  130. portResult, err := GetTcp4PortForAddress("127.0.0.1")
  131. assert.NoError(t, err)
  132. assert.Greater(t, portResult.Port, 0)
  133. }
  134. func TestGetTcp6PortForAddress(t *testing.T) {
  135. portResult, err := GetTcp6PortForAddress("::1")
  136. assert.NoError(t, err)
  137. assert.Greater(t, portResult.Port, 0)
  138. }
  139. func TestGetUdpPortForAddress(t *testing.T) {
  140. portResult, err := GetUdpPortForAddress("127.0.0.1")
  141. assert.NoError(t, err)
  142. assert.Greater(t, portResult.Port, 0)
  143. }
  144. func TestGetUdp4PortForAddress(t *testing.T) {
  145. portResult, err := GetUdp4PortForAddress("127.0.0.1")
  146. assert.NoError(t, err)
  147. assert.Greater(t, portResult.Port, 0)
  148. }
  149. func TestGetUdp6PortForAddress(t *testing.T) {
  150. portResult, err := GetUdp6PortForAddress("::1")
  151. assert.NoError(t, err)
  152. assert.Greater(t, portResult.Port, 0)
  153. }
  154. func TestPortResultToAddress(t *testing.T) {
  155. portResult := PortResult{
  156. IP: "::1",
  157. Port: 3000,
  158. }
  159. address := PortResultToAddress(portResult)
  160. assert.Equal(t, address, "[::1]:3000")
  161. }
  162. func TestListen(t *testing.T) {
  163. t.Run("errors for bad tcp stack", func(t *testing.T) {
  164. addr, err := listen("tcp-bad", "127.0.0.1:0")
  165. assert.Empty(t, addr)
  166. assert.Error(t, err, "listen tcp-bad: unknown network tcp-bad")
  167. })
  168. t.Run("errors for bad udp stack", func(t *testing.T) {
  169. addr, err := listen("udp-bad", "127.0.0.1:0")
  170. assert.Empty(t, addr)
  171. assert.Error(t, err, "listen udp-bad: unknown network udp-bad")
  172. })
  173. t.Run("errors for bad stack", func(t *testing.T) {
  174. addr, err := listen("unix", "127.0.0.1:0")
  175. assert.Empty(t, addr)
  176. assert.Error(t, err, "stack not recognized")
  177. })
  178. }