image/docker/docker_client_test.go

155 lines
4.9 KiB
Go

package docker
import (
"fmt"
"path/filepath"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/containers/image/types"
"github.com/stretchr/testify/assert"
)
func TestDockerCertDir(t *testing.T) {
const nondefaultFullPath = "/this/is/not/the/default/full/path"
const nondefaultPerHostDir = "/this/is/not/the/default/certs.d"
const variableReference = "$HOME"
const rootPrefix = "/root/prefix"
const registryHostPort = "thishostdefinitelydoesnotexist:5000"
systemPerHostResult := filepath.Join(systemPerHostCertDirPaths[len(systemPerHostCertDirPaths)-1], registryHostPort)
for _, c := range []struct {
sys *types.SystemContext
expected string
}{
// The common case
{nil, systemPerHostResult},
// There is a context, but it does not override the path.
{&types.SystemContext{}, systemPerHostResult},
// Full path overridden
{&types.SystemContext{DockerCertPath: nondefaultFullPath}, nondefaultFullPath},
// Per-host path overridden
{
&types.SystemContext{DockerPerHostCertDirPath: nondefaultPerHostDir},
filepath.Join(nondefaultPerHostDir, registryHostPort),
},
// Both overridden
{
&types.SystemContext{
DockerCertPath: nondefaultFullPath,
DockerPerHostCertDirPath: nondefaultPerHostDir,
},
nondefaultFullPath,
},
// Root overridden
{
&types.SystemContext{RootForImplicitAbsolutePaths: rootPrefix},
filepath.Join(rootPrefix, systemPerHostResult),
},
// Root and path overrides present simultaneously,
{
&types.SystemContext{
DockerCertPath: nondefaultFullPath,
RootForImplicitAbsolutePaths: rootPrefix,
},
nondefaultFullPath,
},
{
&types.SystemContext{
DockerPerHostCertDirPath: nondefaultPerHostDir,
RootForImplicitAbsolutePaths: rootPrefix,
},
filepath.Join(nondefaultPerHostDir, registryHostPort),
},
// … and everything at once
{
&types.SystemContext{
DockerCertPath: nondefaultFullPath,
DockerPerHostCertDirPath: nondefaultPerHostDir,
RootForImplicitAbsolutePaths: rootPrefix,
},
nondefaultFullPath,
},
// No environment expansion happens in the overridden paths
{&types.SystemContext{DockerCertPath: variableReference}, variableReference},
{
&types.SystemContext{DockerPerHostCertDirPath: variableReference},
filepath.Join(variableReference, registryHostPort),
},
} {
path, err := dockerCertDir(c.sys, registryHostPort)
require.Equal(t, nil, err)
assert.Equal(t, c.expected, path)
}
}
func TestNewBearerTokenFromJsonBlob(t *testing.T) {
expected := &bearerToken{Token: "IAmAToken", ExpiresIn: 100, IssuedAt: time.Unix(1514800802, 0)}
tokenBlob := []byte(`{"token":"IAmAToken","expires_in":100,"issued_at":"2018-01-01T10:00:02+00:00"}`)
token, err := newBearerTokenFromJSONBlob(tokenBlob)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
assertBearerTokensEqual(t, expected, token)
}
func TestNewBearerAccessTokenFromJsonBlob(t *testing.T) {
expected := &bearerToken{Token: "IAmAToken", ExpiresIn: 100, IssuedAt: time.Unix(1514800802, 0)}
tokenBlob := []byte(`{"access_token":"IAmAToken","expires_in":100,"issued_at":"2018-01-01T10:00:02+00:00"}`)
token, err := newBearerTokenFromJSONBlob(tokenBlob)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
assertBearerTokensEqual(t, expected, token)
}
func TestNewBearerTokenFromInvalidJsonBlob(t *testing.T) {
tokenBlob := []byte("IAmNotJson")
_, err := newBearerTokenFromJSONBlob(tokenBlob)
if err == nil {
t.Fatalf("unexpected an error unmarshalling JSON")
}
}
func TestNewBearerTokenSmallExpiryFromJsonBlob(t *testing.T) {
expected := &bearerToken{Token: "IAmAToken", ExpiresIn: 60, IssuedAt: time.Unix(1514800802, 0)}
tokenBlob := []byte(`{"token":"IAmAToken","expires_in":1,"issued_at":"2018-01-01T10:00:02+00:00"}`)
token, err := newBearerTokenFromJSONBlob(tokenBlob)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
assertBearerTokensEqual(t, expected, token)
}
func TestNewBearerTokenIssuedAtZeroFromJsonBlob(t *testing.T) {
zeroTime := time.Time{}.Format(time.RFC3339)
now := time.Now()
tokenBlob := []byte(fmt.Sprintf(`{"token":"IAmAToken","expires_in":100,"issued_at":"%s"}`, zeroTime))
token, err := newBearerTokenFromJSONBlob(tokenBlob)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if token.IssuedAt.Before(now) {
t.Fatalf("expected [%s] not to be before [%s]", token.IssuedAt, now)
}
}
func assertBearerTokensEqual(t *testing.T, expected, subject *bearerToken) {
if expected.Token != subject.Token {
t.Fatalf("expected [%s] to equal [%s], it did not", subject.Token, expected.Token)
}
if expected.ExpiresIn != subject.ExpiresIn {
t.Fatalf("expected [%d] to equal [%d], it did not", subject.ExpiresIn, expected.ExpiresIn)
}
if !expected.IssuedAt.Equal(subject.IssuedAt) {
t.Fatalf("expected [%s] to equal [%s], it did not", subject.IssuedAt, expected.IssuedAt)
}
}