hosts_test.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package opts
  2. import (
  3. "fmt"
  4. "strings"
  5. "testing"
  6. )
  7. func TestParseHost(t *testing.T) {
  8. invalid := []string{
  9. "something with spaces",
  10. "://",
  11. "unknown://",
  12. "tcp://:port",
  13. "tcp://invalid:port",
  14. }
  15. valid := map[string]string{
  16. "": DefaultHost,
  17. " ": DefaultHost,
  18. " ": DefaultHost,
  19. "fd://": "fd://",
  20. "fd://something": "fd://something",
  21. "tcp://host:": fmt.Sprintf("tcp://host:%d", DefaultHTTPPort),
  22. "tcp://": DefaultTCPHost,
  23. "tcp://:2375": fmt.Sprintf("tcp://%s:2375", DefaultHTTPHost),
  24. "tcp://:2376": fmt.Sprintf("tcp://%s:2376", DefaultHTTPHost),
  25. "tcp://0.0.0.0:8080": "tcp://0.0.0.0:8080",
  26. "tcp://192.168.0.0:12000": "tcp://192.168.0.0:12000",
  27. "tcp://192.168:8080": "tcp://192.168:8080",
  28. "tcp://0.0.0.0:1234567890": "tcp://0.0.0.0:1234567890", // yeah it's valid :P
  29. " tcp://:7777/path ": fmt.Sprintf("tcp://%s:7777/path", DefaultHTTPHost),
  30. "tcp://docker.com:2375": "tcp://docker.com:2375",
  31. "unix://": "unix://" + DefaultUnixSocket,
  32. "unix://path/to/socket": "unix://path/to/socket",
  33. "npipe://": "npipe://" + DefaultNamedPipe,
  34. "npipe:////./pipe/foo": "npipe:////./pipe/foo",
  35. }
  36. for _, value := range invalid {
  37. if _, err := ParseHost(false, value); err == nil {
  38. t.Errorf("Expected an error for %v, got [nil]", value)
  39. }
  40. }
  41. for value, expected := range valid {
  42. if actual, err := ParseHost(false, value); err != nil || actual != expected {
  43. t.Errorf("Expected for %v [%v], got [%v, %v]", value, expected, actual, err)
  44. }
  45. }
  46. }
  47. func TestParseDockerDaemonHost(t *testing.T) {
  48. invalids := map[string]string{
  49. "tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d",
  50. "tcp:a.b.c.d/path": "Invalid bind address format: tcp:a.b.c.d/path",
  51. "udp://127.0.0.1": "Invalid bind address format: udp://127.0.0.1",
  52. "udp://127.0.0.1:2375": "Invalid bind address format: udp://127.0.0.1:2375",
  53. "tcp://unix:///run/docker.sock": "Invalid proto, expected tcp: unix:///run/docker.sock",
  54. " tcp://:7777/path ": "Invalid bind address format: tcp://:7777/path ",
  55. "": "Invalid bind address format: ",
  56. }
  57. valids := map[string]string{
  58. "0.0.0.1:": "tcp://0.0.0.1:2375",
  59. "0.0.0.1:5555": "tcp://0.0.0.1:5555",
  60. "0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path",
  61. "[::1]:": "tcp://[::1]:2375",
  62. "[::1]:5555/path": "tcp://[::1]:5555/path",
  63. "[0:0:0:0:0:0:0:1]:": "tcp://[0:0:0:0:0:0:0:1]:2375",
  64. "[0:0:0:0:0:0:0:1]:5555/path": "tcp://[0:0:0:0:0:0:0:1]:5555/path",
  65. ":6666": fmt.Sprintf("tcp://%s:6666", DefaultHTTPHost),
  66. ":6666/path": fmt.Sprintf("tcp://%s:6666/path", DefaultHTTPHost),
  67. "tcp://": DefaultTCPHost,
  68. "tcp://:7777": fmt.Sprintf("tcp://%s:7777", DefaultHTTPHost),
  69. "tcp://:7777/path": fmt.Sprintf("tcp://%s:7777/path", DefaultHTTPHost),
  70. "unix:///run/docker.sock": "unix:///run/docker.sock",
  71. "unix://": "unix://" + DefaultUnixSocket,
  72. "fd://": "fd://",
  73. "fd://something": "fd://something",
  74. "localhost:": "tcp://localhost:2375",
  75. "localhost:5555": "tcp://localhost:5555",
  76. "localhost:5555/path": "tcp://localhost:5555/path",
  77. }
  78. for invalidAddr, expectedError := range invalids {
  79. if addr, err := parseDockerDaemonHost(invalidAddr); err == nil || err.Error() != expectedError {
  80. t.Errorf("tcp %v address expected error %q return, got %q and addr %v", invalidAddr, expectedError, err, addr)
  81. }
  82. }
  83. for validAddr, expectedAddr := range valids {
  84. if addr, err := parseDockerDaemonHost(validAddr); err != nil || addr != expectedAddr {
  85. t.Errorf("%v -> expected %v, got (%v) addr (%v)", validAddr, expectedAddr, err, addr)
  86. }
  87. }
  88. }
  89. func TestParseTCP(t *testing.T) {
  90. var (
  91. defaultHTTPHost = "tcp://127.0.0.1:2376"
  92. )
  93. invalids := map[string]string{
  94. "tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d",
  95. "tcp:a.b.c.d/path": "Invalid bind address format: tcp:a.b.c.d/path",
  96. "udp://127.0.0.1": "Invalid proto, expected tcp: udp://127.0.0.1",
  97. "udp://127.0.0.1:2375": "Invalid proto, expected tcp: udp://127.0.0.1:2375",
  98. }
  99. valids := map[string]string{
  100. "": defaultHTTPHost,
  101. "tcp://": defaultHTTPHost,
  102. "0.0.0.1:": "tcp://0.0.0.1:2376",
  103. "0.0.0.1:5555": "tcp://0.0.0.1:5555",
  104. "0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path",
  105. ":6666": "tcp://127.0.0.1:6666",
  106. ":6666/path": "tcp://127.0.0.1:6666/path",
  107. "tcp://:7777": "tcp://127.0.0.1:7777",
  108. "tcp://:7777/path": "tcp://127.0.0.1:7777/path",
  109. "[::1]:": "tcp://[::1]:2376",
  110. "[::1]:5555": "tcp://[::1]:5555",
  111. "[::1]:5555/path": "tcp://[::1]:5555/path",
  112. "[0:0:0:0:0:0:0:1]:": "tcp://[0:0:0:0:0:0:0:1]:2376",
  113. "[0:0:0:0:0:0:0:1]:5555": "tcp://[0:0:0:0:0:0:0:1]:5555",
  114. "[0:0:0:0:0:0:0:1]:5555/path": "tcp://[0:0:0:0:0:0:0:1]:5555/path",
  115. "localhost:": "tcp://localhost:2376",
  116. "localhost:5555": "tcp://localhost:5555",
  117. "localhost:5555/path": "tcp://localhost:5555/path",
  118. }
  119. for invalidAddr, expectedError := range invalids {
  120. if addr, err := ParseTCPAddr(invalidAddr, defaultHTTPHost); err == nil || err.Error() != expectedError {
  121. t.Errorf("tcp %v address expected error %v return, got %s and addr %v", invalidAddr, expectedError, err, addr)
  122. }
  123. }
  124. for validAddr, expectedAddr := range valids {
  125. if addr, err := ParseTCPAddr(validAddr, defaultHTTPHost); err != nil || addr != expectedAddr {
  126. t.Errorf("%v -> expected %v, got %v and addr %v", validAddr, expectedAddr, err, addr)
  127. }
  128. }
  129. }
  130. func TestParseInvalidUnixAddrInvalid(t *testing.T) {
  131. if _, err := parseSimpleProtoAddr("unix", "tcp://127.0.0.1", "unix:///var/run/docker.sock"); err == nil || err.Error() != "Invalid proto, expected unix: tcp://127.0.0.1" {
  132. t.Fatalf("Expected an error, got %v", err)
  133. }
  134. if _, err := parseSimpleProtoAddr("unix", "unix://tcp://127.0.0.1", "/var/run/docker.sock"); err == nil || err.Error() != "Invalid proto, expected unix: tcp://127.0.0.1" {
  135. t.Fatalf("Expected an error, got %v", err)
  136. }
  137. if v, err := parseSimpleProtoAddr("unix", "", "/var/run/docker.sock"); err != nil || v != "unix:///var/run/docker.sock" {
  138. t.Fatalf("Expected an %v, got %v", v, "unix:///var/run/docker.sock")
  139. }
  140. }
  141. func TestValidateExtraHosts(t *testing.T) {
  142. valid := []string{
  143. `myhost:192.168.0.1`,
  144. `thathost:10.0.2.1`,
  145. `anipv6host:2003:ab34:e::1`,
  146. `ipv6local:::1`,
  147. }
  148. invalid := map[string]string{
  149. `myhost:192.notanipaddress.1`: `invalid IP`,
  150. `thathost-nosemicolon10.0.0.1`: `bad format`,
  151. `anipv6host:::::1`: `invalid IP`,
  152. `ipv6local:::0::`: `invalid IP`,
  153. }
  154. for _, extrahost := range valid {
  155. if _, err := ValidateExtraHost(extrahost); err != nil {
  156. t.Fatalf("ValidateExtraHost(`"+extrahost+"`) should succeed: error %v", err)
  157. }
  158. }
  159. for extraHost, expectedError := range invalid {
  160. if _, err := ValidateExtraHost(extraHost); err == nil {
  161. t.Fatalf("ValidateExtraHost(`%q`) should have failed validation", extraHost)
  162. } else {
  163. if !strings.Contains(err.Error(), expectedError) {
  164. t.Fatalf("ValidateExtraHost(`%q`) error should contain %q", extraHost, expectedError)
  165. }
  166. }
  167. }
  168. }