2015-08-04 13:30:38 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"path/filepath"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"os"
|
2015-12-15 21:40:11 +00:00
|
|
|
|
2016-01-05 00:05:26 +00:00
|
|
|
"github.com/docker/engine-api/types"
|
2015-08-04 13:30:38 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type ports struct {
|
|
|
|
ports []types.Port
|
|
|
|
expected string
|
|
|
|
}
|
|
|
|
|
|
|
|
// DisplayablePorts
|
|
|
|
func TestDisplayablePorts(t *testing.T) {
|
|
|
|
cases := []ports{
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
PrivatePort: 9988,
|
|
|
|
Type: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"9988/tcp"},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
PrivatePort: 9988,
|
|
|
|
Type: "udp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"9988/udp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
IP: "0.0.0.0",
|
|
|
|
PrivatePort: 9988,
|
|
|
|
Type: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"0.0.0.0:0->9988/tcp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
PrivatePort: 9988,
|
|
|
|
PublicPort: 8899,
|
|
|
|
Type: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"9988/tcp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
IP: "4.3.2.1",
|
|
|
|
PrivatePort: 9988,
|
|
|
|
PublicPort: 8899,
|
|
|
|
Type: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"4.3.2.1:8899->9988/tcp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
IP: "4.3.2.1",
|
|
|
|
PrivatePort: 9988,
|
|
|
|
PublicPort: 9988,
|
|
|
|
Type: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"4.3.2.1:9988->9988/tcp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
PrivatePort: 9988,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
PrivatePort: 9988,
|
|
|
|
Type: "udp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"9988/udp, 9988/udp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
IP: "1.2.3.4",
|
|
|
|
PublicPort: 9998,
|
|
|
|
PrivatePort: 9998,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
IP: "1.2.3.4",
|
|
|
|
PublicPort: 9999,
|
|
|
|
PrivatePort: 9999,
|
|
|
|
Type: "udp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"1.2.3.4:9998-9999->9998-9999/udp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
IP: "1.2.3.4",
|
|
|
|
PublicPort: 8887,
|
|
|
|
PrivatePort: 9998,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
IP: "1.2.3.4",
|
|
|
|
PublicPort: 8888,
|
|
|
|
PrivatePort: 9999,
|
|
|
|
Type: "udp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"1.2.3.4:8887->9998/udp, 1.2.3.4:8888->9999/udp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
PrivatePort: 9998,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
PrivatePort: 9999,
|
|
|
|
Type: "udp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"9998-9999/udp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
IP: "1.2.3.4",
|
|
|
|
PrivatePort: 6677,
|
|
|
|
PublicPort: 7766,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
PrivatePort: 9988,
|
|
|
|
PublicPort: 8899,
|
|
|
|
Type: "udp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"9988/udp, 1.2.3.4:7766->6677/tcp",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
IP: "1.2.3.4",
|
|
|
|
PrivatePort: 9988,
|
|
|
|
PublicPort: 8899,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
IP: "1.2.3.4",
|
|
|
|
PrivatePort: 9988,
|
|
|
|
PublicPort: 8899,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
IP: "4.3.2.1",
|
|
|
|
PrivatePort: 2233,
|
|
|
|
PublicPort: 3322,
|
|
|
|
Type: "tcp",
|
|
|
|
},
|
|
|
|
},
|
2015-10-19 15:38:54 +00:00
|
|
|
"4.3.2.1:3322->2233/tcp, 1.2.3.4:8899->9988/tcp, 1.2.3.4:8899->9988/udp",
|
2015-08-04 13:30:38 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
PrivatePort: 9988,
|
|
|
|
PublicPort: 8899,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
IP: "1.2.3.4",
|
|
|
|
PrivatePort: 6677,
|
|
|
|
PublicPort: 7766,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
IP: "4.3.2.1",
|
|
|
|
PrivatePort: 2233,
|
|
|
|
PublicPort: 3322,
|
|
|
|
Type: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"9988/udp, 4.3.2.1:3322->2233/tcp, 1.2.3.4:7766->6677/tcp",
|
|
|
|
},
|
2015-10-19 15:38:54 +00:00
|
|
|
{
|
|
|
|
[]types.Port{
|
|
|
|
{
|
|
|
|
PrivatePort: 80,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
PrivatePort: 1024,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
PrivatePort: 80,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
PrivatePort: 1024,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
IP: "1.1.1.1",
|
|
|
|
PublicPort: 80,
|
|
|
|
PrivatePort: 1024,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
IP: "1.1.1.1",
|
|
|
|
PublicPort: 80,
|
|
|
|
PrivatePort: 1024,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
IP: "1.1.1.1",
|
|
|
|
PublicPort: 1024,
|
|
|
|
PrivatePort: 80,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
IP: "1.1.1.1",
|
|
|
|
PublicPort: 1024,
|
|
|
|
PrivatePort: 80,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
IP: "2.1.1.1",
|
|
|
|
PublicPort: 80,
|
|
|
|
PrivatePort: 1024,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
IP: "2.1.1.1",
|
|
|
|
PublicPort: 80,
|
|
|
|
PrivatePort: 1024,
|
|
|
|
Type: "udp",
|
|
|
|
}, {
|
|
|
|
IP: "2.1.1.1",
|
|
|
|
PublicPort: 1024,
|
|
|
|
PrivatePort: 80,
|
|
|
|
Type: "tcp",
|
|
|
|
}, {
|
|
|
|
IP: "2.1.1.1",
|
|
|
|
PublicPort: 1024,
|
|
|
|
PrivatePort: 80,
|
|
|
|
Type: "udp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"80/tcp, 80/udp, 1024/tcp, 1024/udp, 1.1.1.1:1024->80/tcp, 1.1.1.1:1024->80/udp, 2.1.1.1:1024->80/tcp, 2.1.1.1:1024->80/udp, 1.1.1.1:80->1024/tcp, 1.1.1.1:80->1024/udp, 2.1.1.1:80->1024/tcp, 2.1.1.1:80->1024/udp",
|
|
|
|
},
|
2015-08-04 13:30:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, port := range cases {
|
|
|
|
actual := DisplayablePorts(port.ports)
|
|
|
|
if port.expected != actual {
|
|
|
|
t.Fatalf("Expected %s, got %s.", port.expected, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MatchesContentType
|
|
|
|
func TestJsonContentType(t *testing.T) {
|
|
|
|
if !MatchesContentType("application/json", "application/json") {
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
|
|
|
|
if !MatchesContentType("application/json; charset=utf-8", "application/json") {
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
|
|
|
|
if MatchesContentType("dockerapplication/json", "application/json") {
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LoadOrCreateTrustKey
|
|
|
|
func TestLoadOrCreateTrustKeyInvalidKeyFile(t *testing.T) {
|
|
|
|
tmpKeyFolderPath, err := ioutil.TempDir("", "api-trustkey-test")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer os.RemoveAll(tmpKeyFolderPath)
|
|
|
|
|
|
|
|
tmpKeyFile, err := ioutil.TempFile(tmpKeyFolderPath, "keyfile")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := LoadOrCreateTrustKey(tmpKeyFile.Name()); err == nil {
|
|
|
|
t.Fatalf("expected an error, got nothing.")
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLoadOrCreateTrustKeyCreateKey(t *testing.T) {
|
|
|
|
tmpKeyFolderPath, err := ioutil.TempDir("", "api-trustkey-test")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer os.RemoveAll(tmpKeyFolderPath)
|
|
|
|
|
|
|
|
// Without the need to create the folder hierarchy
|
|
|
|
tmpKeyFile := filepath.Join(tmpKeyFolderPath, "keyfile")
|
|
|
|
|
|
|
|
if key, err := LoadOrCreateTrustKey(tmpKeyFile); err != nil || key == nil {
|
|
|
|
t.Fatalf("expected a new key file, got : %v and %v", err, key)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := os.Stat(tmpKeyFile); err != nil {
|
|
|
|
t.Fatalf("Expected to find a file %s, got %v", tmpKeyFile, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// With the need to create the folder hierarchy as tmpKeyFie is in a path
|
2016-03-05 16:59:11 +00:00
|
|
|
// where some folders do not exist.
|
2015-08-04 13:30:38 +00:00
|
|
|
tmpKeyFile = filepath.Join(tmpKeyFolderPath, "folder/hierarchy/keyfile")
|
|
|
|
|
|
|
|
if key, err := LoadOrCreateTrustKey(tmpKeyFile); err != nil || key == nil {
|
|
|
|
t.Fatalf("expected a new key file, got : %v and %v", err, key)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := os.Stat(tmpKeyFile); err != nil {
|
|
|
|
t.Fatalf("Expected to find a file %s, got %v", tmpKeyFile, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// With no path at all
|
|
|
|
defer os.Remove("keyfile")
|
|
|
|
if key, err := LoadOrCreateTrustKey("keyfile"); err != nil || key == nil {
|
|
|
|
t.Fatalf("expected a new key file, got : %v and %v", err, key)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := os.Stat("keyfile"); err != nil {
|
|
|
|
t.Fatalf("Expected to find a file keyfile, got %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLoadOrCreateTrustKeyLoadValidKey(t *testing.T) {
|
|
|
|
tmpKeyFile := filepath.Join("fixtures", "keyfile")
|
|
|
|
|
|
|
|
if key, err := LoadOrCreateTrustKey(tmpKeyFile); err != nil || key == nil {
|
|
|
|
t.Fatalf("expected a key file, got : %v and %v", err, key)
|
|
|
|
}
|
|
|
|
}
|