2018-02-05 21:05:59 +00:00
package opts // import "github.com/docker/docker/opts"
2015-12-16 01:53:17 +00:00
import (
2016-01-31 02:45:49 +00:00
"fmt"
2016-12-23 19:09:12 +00:00
"strings"
2015-12-16 01:53:17 +00:00
"testing"
)
func TestParseHost ( t * testing . T ) {
2016-02-18 00:05:52 +00:00
invalid := [ ] string {
"something with spaces" ,
"://" ,
"unknown://" ,
"tcp://:port" ,
"tcp://invalid:port" ,
2015-12-16 01:53:17 +00:00
}
2016-02-18 00:05:52 +00:00
2015-12-16 01:53:17 +00:00
valid := map [ string ] string {
2016-01-31 02:45:49 +00:00
"" : DefaultHost ,
" " : DefaultHost ,
" " : DefaultHost ,
2015-12-16 01:53:17 +00:00
"fd://" : "fd://" ,
"fd://something" : "fd://something" ,
2016-01-31 02:45:49 +00:00
"tcp://host:" : fmt . Sprintf ( "tcp://host:%d" , DefaultHTTPPort ) ,
"tcp://" : DefaultTCPHost ,
"tcp://:2375" : fmt . Sprintf ( "tcp://%s:2375" , DefaultHTTPHost ) ,
"tcp://:2376" : fmt . Sprintf ( "tcp://%s:2376" , DefaultHTTPHost ) ,
2015-12-16 01:53:17 +00:00
"tcp://0.0.0.0:8080" : "tcp://0.0.0.0:8080" ,
"tcp://192.168.0.0:12000" : "tcp://192.168.0.0:12000" ,
"tcp://192.168:8080" : "tcp://192.168:8080" ,
"tcp://0.0.0.0:1234567890" : "tcp://0.0.0.0:1234567890" , // yeah it's valid :P
2016-01-31 02:45:49 +00:00
" tcp://:7777/path " : fmt . Sprintf ( "tcp://%s:7777/path" , DefaultHTTPHost ) ,
2015-12-16 01:53:17 +00:00
"tcp://docker.com:2375" : "tcp://docker.com:2375" ,
2016-01-31 02:45:49 +00:00
"unix://" : "unix://" + DefaultUnixSocket ,
2015-12-16 01:53:17 +00:00
"unix://path/to/socket" : "unix://path/to/socket" ,
2016-01-31 02:45:49 +00:00
"npipe://" : "npipe://" + DefaultNamedPipe ,
"npipe:////./pipe/foo" : "npipe:////./pipe/foo" ,
2015-12-16 01:53:17 +00:00
}
2016-02-18 00:05:52 +00:00
for _ , value := range invalid {
2018-10-15 07:52:53 +00:00
if _ , err := ParseHost ( false , false , value ) ; err == nil {
2016-02-18 00:05:52 +00:00
t . Errorf ( "Expected an error for %v, got [nil]" , value )
2015-12-16 01:53:17 +00:00
}
}
2016-02-18 00:05:52 +00:00
2015-12-16 01:53:17 +00:00
for value , expected := range valid {
2018-10-15 07:52:53 +00:00
if actual , err := ParseHost ( false , false , value ) ; err != nil || actual != expected {
2016-01-31 02:45:49 +00:00
t . Errorf ( "Expected for %v [%v], got [%v, %v]" , value , expected , actual , err )
2015-12-16 01:53:17 +00:00
}
}
}
func TestParseDockerDaemonHost ( t * testing . T ) {
invalids := map [ string ] string {
2016-06-22 00:14:55 +00:00
2015-12-16 01:53:17 +00:00
"tcp:a.b.c.d" : "Invalid bind address format: tcp:a.b.c.d" ,
"tcp:a.b.c.d/path" : "Invalid bind address format: tcp:a.b.c.d/path" ,
"udp://127.0.0.1" : "Invalid bind address format: udp://127.0.0.1" ,
"udp://127.0.0.1:2375" : "Invalid bind address format: udp://127.0.0.1:2375" ,
2016-06-22 00:14:55 +00:00
"tcp://unix:///run/docker.sock" : "Invalid proto, expected tcp: unix:///run/docker.sock" ,
2016-01-31 02:45:49 +00:00
" tcp://:7777/path " : "Invalid bind address format: tcp://:7777/path " ,
"" : "Invalid bind address format: " ,
2015-12-16 01:53:17 +00:00
}
valids := map [ string ] string {
"0.0.0.1:" : "tcp://0.0.0.1:2375" ,
"0.0.0.1:5555" : "tcp://0.0.0.1:5555" ,
"0.0.0.1:5555/path" : "tcp://0.0.0.1:5555/path" ,
"[::1]:" : "tcp://[::1]:2375" ,
"[::1]:5555/path" : "tcp://[::1]:5555/path" ,
"[0:0:0:0:0:0:0:1]:" : "tcp://[0:0:0:0:0:0:0:1]:2375" ,
"[0:0:0:0:0:0:0:1]:5555/path" : "tcp://[0:0:0:0:0:0:0:1]:5555/path" ,
2018-07-04 18:11:49 +00:00
":6666" : fmt . Sprintf ( "tcp://%s:6666" , DefaultHTTPHost ) ,
":6666/path" : fmt . Sprintf ( "tcp://%s:6666/path" , DefaultHTTPHost ) ,
"tcp://" : DefaultTCPHost ,
"tcp://:7777" : fmt . Sprintf ( "tcp://%s:7777" , DefaultHTTPHost ) ,
"tcp://:7777/path" : fmt . Sprintf ( "tcp://%s:7777/path" , DefaultHTTPHost ) ,
"unix:///run/docker.sock" : "unix:///run/docker.sock" ,
"unix://" : "unix://" + DefaultUnixSocket ,
"fd://" : "fd://" ,
"fd://something" : "fd://something" ,
"localhost:" : "tcp://localhost:2375" ,
"localhost:5555" : "tcp://localhost:5555" ,
"localhost:5555/path" : "tcp://localhost:5555/path" ,
2015-12-16 01:53:17 +00:00
}
for invalidAddr , expectedError := range invalids {
2017-10-25 12:39:51 +00:00
if addr , err := parseDaemonHost ( invalidAddr ) ; err == nil || err . Error ( ) != expectedError {
2016-06-22 00:14:55 +00:00
t . Errorf ( "tcp %v address expected error %q return, got %q and addr %v" , invalidAddr , expectedError , err , addr )
2015-12-16 01:53:17 +00:00
}
}
for validAddr , expectedAddr := range valids {
2017-10-25 12:39:51 +00:00
if addr , err := parseDaemonHost ( validAddr ) ; err != nil || addr != expectedAddr {
2015-12-16 01:53:17 +00:00
t . Errorf ( "%v -> expected %v, got (%v) addr (%v)" , validAddr , expectedAddr , err , addr )
}
}
}
func TestParseTCP ( t * testing . T ) {
var (
defaultHTTPHost = "tcp://127.0.0.1:2376"
)
invalids := map [ string ] string {
"tcp:a.b.c.d" : "Invalid bind address format: tcp:a.b.c.d" ,
"tcp:a.b.c.d/path" : "Invalid bind address format: tcp:a.b.c.d/path" ,
"udp://127.0.0.1" : "Invalid proto, expected tcp: udp://127.0.0.1" ,
"udp://127.0.0.1:2375" : "Invalid proto, expected tcp: udp://127.0.0.1:2375" ,
}
valids := map [ string ] string {
"" : defaultHTTPHost ,
"tcp://" : defaultHTTPHost ,
"0.0.0.1:" : "tcp://0.0.0.1:2376" ,
"0.0.0.1:5555" : "tcp://0.0.0.1:5555" ,
"0.0.0.1:5555/path" : "tcp://0.0.0.1:5555/path" ,
":6666" : "tcp://127.0.0.1:6666" ,
":6666/path" : "tcp://127.0.0.1:6666/path" ,
"tcp://:7777" : "tcp://127.0.0.1:7777" ,
"tcp://:7777/path" : "tcp://127.0.0.1:7777/path" ,
"[::1]:" : "tcp://[::1]:2376" ,
"[::1]:5555" : "tcp://[::1]:5555" ,
"[::1]:5555/path" : "tcp://[::1]:5555/path" ,
"[0:0:0:0:0:0:0:1]:" : "tcp://[0:0:0:0:0:0:0:1]:2376" ,
"[0:0:0:0:0:0:0:1]:5555" : "tcp://[0:0:0:0:0:0:0:1]:5555" ,
"[0:0:0:0:0:0:0:1]:5555/path" : "tcp://[0:0:0:0:0:0:0:1]:5555/path" ,
"localhost:" : "tcp://localhost:2376" ,
"localhost:5555" : "tcp://localhost:5555" ,
"localhost:5555/path" : "tcp://localhost:5555/path" ,
}
for invalidAddr , expectedError := range invalids {
2016-06-21 21:27:04 +00:00
if addr , err := ParseTCPAddr ( invalidAddr , defaultHTTPHost ) ; err == nil || err . Error ( ) != expectedError {
2015-12-16 01:53:17 +00:00
t . Errorf ( "tcp %v address expected error %v return, got %s and addr %v" , invalidAddr , expectedError , err , addr )
}
}
for validAddr , expectedAddr := range valids {
2016-06-21 21:27:04 +00:00
if addr , err := ParseTCPAddr ( validAddr , defaultHTTPHost ) ; err != nil || addr != expectedAddr {
2015-12-16 01:53:17 +00:00
t . Errorf ( "%v -> expected %v, got %v and addr %v" , validAddr , expectedAddr , err , addr )
}
}
}
func TestParseInvalidUnixAddrInvalid ( t * testing . T ) {
2016-01-31 02:45:49 +00:00
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" {
2015-12-16 01:53:17 +00:00
t . Fatalf ( "Expected an error, got %v" , err )
}
2016-01-31 02:45:49 +00:00
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" {
2015-12-16 01:53:17 +00:00
t . Fatalf ( "Expected an error, got %v" , err )
}
2016-01-31 02:45:49 +00:00
if v , err := parseSimpleProtoAddr ( "unix" , "" , "/var/run/docker.sock" ) ; err != nil || v != "unix:///var/run/docker.sock" {
2015-12-16 01:53:17 +00:00
t . Fatalf ( "Expected an %v, got %v" , v , "unix:///var/run/docker.sock" )
}
}
2016-12-23 19:09:12 +00:00
func TestValidateExtraHosts ( t * testing . T ) {
valid := [ ] string {
` myhost:192.168.0.1 ` ,
` thathost:10.0.2.1 ` ,
` anipv6host:2003:ab34:e::1 ` ,
` ipv6local:::1 ` ,
}
invalid := map [ string ] string {
` myhost:192.notanipaddress.1 ` : ` invalid IP ` ,
` thathost-nosemicolon10.0.0.1 ` : ` bad format ` ,
` anipv6host:::::1 ` : ` invalid IP ` ,
` ipv6local:::0:: ` : ` invalid IP ` ,
}
for _ , extrahost := range valid {
if _ , err := ValidateExtraHost ( extrahost ) ; err != nil {
t . Fatalf ( "ValidateExtraHost(`" + extrahost + "`) should succeed: error %v" , err )
}
}
for extraHost , expectedError := range invalid {
if _ , err := ValidateExtraHost ( extraHost ) ; err == nil {
t . Fatalf ( "ValidateExtraHost(`%q`) should have failed validation" , extraHost )
} else {
if ! strings . Contains ( err . Error ( ) , expectedError ) {
t . Fatalf ( "ValidateExtraHost(`%q`) error should contain %q" , extraHost , expectedError )
}
}
}
}