|
@@ -0,0 +1,282 @@
|
|
|
|
+package api
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "io/ioutil"
|
|
|
|
+ "path/filepath"
|
|
|
|
+ "testing"
|
|
|
|
+
|
|
|
|
+ "github.com/docker/docker/api/types"
|
|
|
|
+ "os"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+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",
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ "4.3.2.1:3322->2233/tcp, 1.2.3.4:8899->9988/udp, 1.2.3.4:8899->9988/tcp",
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ []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",
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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
|
|
|
|
+ // where some folder do not exists.
|
|
|
|
+ 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)
|
|
|
|
+ }
|
|
|
|
+}
|