155 lines
3.6 KiB
Go
155 lines
3.6 KiB
Go
package docker
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"os"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/fsouza/go-dockerclient/external/github.com/docker/docker/pkg/archive"
|
|
)
|
|
|
|
func TestBuildImageMultipleContextsError(t *testing.T) {
|
|
fakeRT := &FakeRoundTripper{message: "", status: http.StatusOK}
|
|
client := newTestClient(fakeRT)
|
|
var buf bytes.Buffer
|
|
opts := BuildImageOptions{
|
|
Name: "testImage",
|
|
NoCache: true,
|
|
SuppressOutput: true,
|
|
RmTmpContainer: true,
|
|
ForceRmTmpContainer: true,
|
|
InputStream: &buf,
|
|
OutputStream: &buf,
|
|
ContextDir: "testing/data",
|
|
}
|
|
err := client.BuildImage(opts)
|
|
if err != ErrMultipleContexts {
|
|
t.Errorf("BuildImage: providing both InputStream and ContextDir should produce an error")
|
|
}
|
|
}
|
|
|
|
func TestBuildImageContextDirDockerignoreParsing(t *testing.T) {
|
|
fakeRT := &FakeRoundTripper{message: "", status: http.StatusOK}
|
|
client := newTestClient(fakeRT)
|
|
|
|
if err := os.Symlink("doesnotexist", "testing/data/symlink"); err != nil {
|
|
t.Errorf("error creating symlink on demand: %s", err)
|
|
}
|
|
defer func() {
|
|
if err := os.Remove("testing/data/symlink"); err != nil {
|
|
t.Errorf("error removing symlink on demand: %s", err)
|
|
}
|
|
}()
|
|
|
|
var buf bytes.Buffer
|
|
opts := BuildImageOptions{
|
|
Name: "testImage",
|
|
NoCache: true,
|
|
SuppressOutput: true,
|
|
RmTmpContainer: true,
|
|
ForceRmTmpContainer: true,
|
|
OutputStream: &buf,
|
|
ContextDir: "testing/data",
|
|
}
|
|
err := client.BuildImage(opts)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
reqBody := fakeRT.requests[0].Body
|
|
tmpdir, err := unpackBodyTarball(reqBody)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
defer func() {
|
|
if err := os.RemoveAll(tmpdir); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
files, err := ioutil.ReadDir(tmpdir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
foundFiles := []string{}
|
|
for _, file := range files {
|
|
foundFiles = append(foundFiles, file.Name())
|
|
}
|
|
|
|
expectedFiles := []string{
|
|
".dockerignore",
|
|
"Dockerfile",
|
|
"barfile",
|
|
"ca.pem",
|
|
"cert.pem",
|
|
"key.pem",
|
|
"server.pem",
|
|
"serverkey.pem",
|
|
"symlink",
|
|
}
|
|
|
|
if !reflect.DeepEqual(expectedFiles, foundFiles) {
|
|
t.Errorf(
|
|
"BuildImage: incorrect files sent in tarball to docker server\nexpected %+v, found %+v",
|
|
expectedFiles, foundFiles,
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestBuildImageSendXRegistryConfig(t *testing.T) {
|
|
fakeRT := &FakeRoundTripper{message: "", status: http.StatusOK}
|
|
client := newTestClient(fakeRT)
|
|
var buf bytes.Buffer
|
|
opts := BuildImageOptions{
|
|
Name: "testImage",
|
|
NoCache: true,
|
|
SuppressOutput: true,
|
|
RmTmpContainer: true,
|
|
ForceRmTmpContainer: true,
|
|
OutputStream: &buf,
|
|
ContextDir: "testing/data",
|
|
AuthConfigs: AuthConfigurations{
|
|
Configs: map[string]AuthConfiguration{
|
|
"quay.io": {
|
|
Username: "foo",
|
|
Password: "bar",
|
|
Email: "baz",
|
|
ServerAddress: "quay.io",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
encodedConfig := "eyJjb25maWdzIjp7InF1YXkuaW8iOnsidXNlcm5hbWUiOiJmb28iLCJwYXNzd29yZCI6ImJhciIsImVtYWlsIjoiYmF6Iiwic2VydmVyYWRkcmVzcyI6InF1YXkuaW8ifX19Cg=="
|
|
|
|
if err := client.BuildImage(opts); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
xRegistryConfig := fakeRT.requests[0].Header["X-Registry-Config"][0]
|
|
if xRegistryConfig != encodedConfig {
|
|
t.Errorf(
|
|
"BuildImage: X-Registry-Config not set currectly: expected %q, got %q",
|
|
encodedConfig,
|
|
xRegistryConfig,
|
|
)
|
|
}
|
|
}
|
|
|
|
func unpackBodyTarball(req io.ReadCloser) (tmpdir string, err error) {
|
|
tmpdir, err = ioutil.TempDir("", "go-dockerclient-test")
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = archive.Untar(req, tmpdir, &archive.TarOptions{
|
|
Compression: archive.Uncompressed,
|
|
NoLchown: true,
|
|
})
|
|
return
|
|
}
|