portallocator_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package portallocator
  2. import (
  3. "net"
  4. "testing"
  5. )
  6. func resetPortAllocator() {
  7. instance = newInstance()
  8. }
  9. func TestRequestNewPort(t *testing.T) {
  10. p := New()
  11. defer resetPortAllocator()
  12. port, err := p.RequestPort(defaultIP, "tcp", 0)
  13. if err != nil {
  14. t.Fatal(err)
  15. }
  16. if expected := p.Begin; port != expected {
  17. t.Fatalf("Expected port %d got %d", expected, port)
  18. }
  19. }
  20. func TestRequestSpecificPort(t *testing.T) {
  21. p := New()
  22. defer resetPortAllocator()
  23. port, err := p.RequestPort(defaultIP, "tcp", 5000)
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. if port != 5000 {
  28. t.Fatalf("Expected port 5000 got %d", port)
  29. }
  30. }
  31. func TestReleasePort(t *testing.T) {
  32. p := New()
  33. port, err := p.RequestPort(defaultIP, "tcp", 5000)
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. if port != 5000 {
  38. t.Fatalf("Expected port 5000 got %d", port)
  39. }
  40. if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil {
  41. t.Fatal(err)
  42. }
  43. }
  44. func TestReuseReleasedPort(t *testing.T) {
  45. p := New()
  46. defer resetPortAllocator()
  47. port, err := p.RequestPort(defaultIP, "tcp", 5000)
  48. if err != nil {
  49. t.Fatal(err)
  50. }
  51. if port != 5000 {
  52. t.Fatalf("Expected port 5000 got %d", port)
  53. }
  54. if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil {
  55. t.Fatal(err)
  56. }
  57. port, err = p.RequestPort(defaultIP, "tcp", 5000)
  58. if err != nil {
  59. t.Fatal(err)
  60. }
  61. }
  62. func TestReleaseUnreadledPort(t *testing.T) {
  63. p := New()
  64. defer resetPortAllocator()
  65. port, err := p.RequestPort(defaultIP, "tcp", 5000)
  66. if err != nil {
  67. t.Fatal(err)
  68. }
  69. if port != 5000 {
  70. t.Fatalf("Expected port 5000 got %d", port)
  71. }
  72. port, err = p.RequestPort(defaultIP, "tcp", 5000)
  73. switch err.(type) {
  74. case ErrPortAlreadyAllocated:
  75. default:
  76. t.Fatalf("Expected port allocation error got %s", err)
  77. }
  78. }
  79. func TestUnknowProtocol(t *testing.T) {
  80. if _, err := New().RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol {
  81. t.Fatalf("Expected error %s got %s", ErrUnknownProtocol, err)
  82. }
  83. }
  84. func TestAllocateAllPorts(t *testing.T) {
  85. p := New()
  86. defer resetPortAllocator()
  87. for i := 0; i <= p.End-p.Begin; i++ {
  88. port, err := p.RequestPort(defaultIP, "tcp", 0)
  89. if err != nil {
  90. t.Fatal(err)
  91. }
  92. if expected := p.Begin + i; port != expected {
  93. t.Fatalf("Expected port %d got %d", expected, port)
  94. }
  95. }
  96. if _, err := p.RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated {
  97. t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err)
  98. }
  99. _, err := p.RequestPort(defaultIP, "udp", 0)
  100. if err != nil {
  101. t.Fatal(err)
  102. }
  103. // release a port in the middle and ensure we get another tcp port
  104. port := p.Begin + 5
  105. if err := p.ReleasePort(defaultIP, "tcp", port); err != nil {
  106. t.Fatal(err)
  107. }
  108. newPort, err := p.RequestPort(defaultIP, "tcp", 0)
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. if newPort != port {
  113. t.Fatalf("Expected port %d got %d", port, newPort)
  114. }
  115. // now pm.last == newPort, release it so that it's the only free port of
  116. // the range, and ensure we get it back
  117. if err := p.ReleasePort(defaultIP, "tcp", newPort); err != nil {
  118. t.Fatal(err)
  119. }
  120. port, err = p.RequestPort(defaultIP, "tcp", 0)
  121. if err != nil {
  122. t.Fatal(err)
  123. }
  124. if newPort != port {
  125. t.Fatalf("Expected port %d got %d", newPort, port)
  126. }
  127. }
  128. func BenchmarkAllocatePorts(b *testing.B) {
  129. p := New()
  130. defer resetPortAllocator()
  131. for i := 0; i < b.N; i++ {
  132. for i := 0; i <= p.End-p.Begin; i++ {
  133. port, err := p.RequestPort(defaultIP, "tcp", 0)
  134. if err != nil {
  135. b.Fatal(err)
  136. }
  137. if expected := p.Begin + i; port != expected {
  138. b.Fatalf("Expected port %d got %d", expected, port)
  139. }
  140. }
  141. p.ReleaseAll()
  142. }
  143. }
  144. func TestPortAllocation(t *testing.T) {
  145. p := New()
  146. defer resetPortAllocator()
  147. ip := net.ParseIP("192.168.0.1")
  148. ip2 := net.ParseIP("192.168.0.2")
  149. if port, err := p.RequestPort(ip, "tcp", 80); err != nil {
  150. t.Fatal(err)
  151. } else if port != 80 {
  152. t.Fatalf("Acquire(80) should return 80, not %d", port)
  153. }
  154. port, err := p.RequestPort(ip, "tcp", 0)
  155. if err != nil {
  156. t.Fatal(err)
  157. }
  158. if port <= 0 {
  159. t.Fatalf("Acquire(0) should return a non-zero port")
  160. }
  161. if _, err := p.RequestPort(ip, "tcp", port); err == nil {
  162. t.Fatalf("Acquiring a port already in use should return an error")
  163. }
  164. if newPort, err := p.RequestPort(ip, "tcp", 0); err != nil {
  165. t.Fatal(err)
  166. } else if newPort == port {
  167. t.Fatalf("Acquire(0) allocated the same port twice: %d", port)
  168. }
  169. if _, err := p.RequestPort(ip, "tcp", 80); err == nil {
  170. t.Fatalf("Acquiring a port already in use should return an error")
  171. }
  172. if _, err := p.RequestPort(ip2, "tcp", 80); err != nil {
  173. t.Fatalf("It should be possible to allocate the same port on a different interface")
  174. }
  175. if _, err := p.RequestPort(ip2, "tcp", 80); err == nil {
  176. t.Fatalf("Acquiring a port already in use should return an error")
  177. }
  178. if err := p.ReleasePort(ip, "tcp", 80); err != nil {
  179. t.Fatal(err)
  180. }
  181. if _, err := p.RequestPort(ip, "tcp", 80); err != nil {
  182. t.Fatal(err)
  183. }
  184. port, err = p.RequestPort(ip, "tcp", 0)
  185. if err != nil {
  186. t.Fatal(err)
  187. }
  188. port2, err := p.RequestPort(ip, "tcp", port+1)
  189. if err != nil {
  190. t.Fatal(err)
  191. }
  192. port3, err := p.RequestPort(ip, "tcp", 0)
  193. if err != nil {
  194. t.Fatal(err)
  195. }
  196. if port3 == port2 {
  197. t.Fatal("Requesting a dynamic port should never allocate a used port")
  198. }
  199. }
  200. func TestNoDuplicateBPR(t *testing.T) {
  201. p := New()
  202. defer resetPortAllocator()
  203. if port, err := p.RequestPort(defaultIP, "tcp", p.Begin); err != nil {
  204. t.Fatal(err)
  205. } else if port != p.Begin {
  206. t.Fatalf("Expected port %d got %d", p.Begin, port)
  207. }
  208. if port, err := p.RequestPort(defaultIP, "tcp", 0); err != nil {
  209. t.Fatal(err)
  210. } else if port == p.Begin {
  211. t.Fatalf("Acquire(0) allocated the same port twice: %d", port)
  212. }
  213. }