mirror of https://github.com/docker/cli.git
135 lines
3.6 KiB
Go
135 lines
3.6 KiB
Go
|
package loader
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/docker/docker/cli/compose/types"
|
||
|
"github.com/docker/docker/pkg/testutil/assert"
|
||
|
)
|
||
|
|
||
|
func TestParseVolumeAnonymousVolume(t *testing.T) {
|
||
|
for _, path := range []string{"/path", "/path/foo"} {
|
||
|
volume, err := parseVolume(path)
|
||
|
expected := types.ServiceVolumeConfig{Type: "volume", Target: path}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeAnonymousVolumeWindows(t *testing.T) {
|
||
|
for _, path := range []string{"C:\\path", "Z:\\path\\foo"} {
|
||
|
volume, err := parseVolume(path)
|
||
|
expected := types.ServiceVolumeConfig{Type: "volume", Target: path}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeTooManyColons(t *testing.T) {
|
||
|
_, err := parseVolume("/foo:/foo:ro:foo")
|
||
|
assert.Error(t, err, "too many colons")
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeShortVolumes(t *testing.T) {
|
||
|
for _, path := range []string{".", "/a"} {
|
||
|
volume, err := parseVolume(path)
|
||
|
expected := types.ServiceVolumeConfig{Type: "volume", Target: path}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeMissingSource(t *testing.T) {
|
||
|
for _, spec := range []string{":foo", "/foo::ro"} {
|
||
|
_, err := parseVolume(spec)
|
||
|
assert.Error(t, err, "empty section between colons")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeBindMount(t *testing.T) {
|
||
|
for _, path := range []string{"./foo", "~/thing", "../other", "/foo", "/home/user"} {
|
||
|
volume, err := parseVolume(path + ":/target")
|
||
|
expected := types.ServiceVolumeConfig{
|
||
|
Type: "bind",
|
||
|
Source: path,
|
||
|
Target: "/target",
|
||
|
}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeRelativeBindMountWindows(t *testing.T) {
|
||
|
for _, path := range []string{
|
||
|
"./foo",
|
||
|
"~/thing",
|
||
|
"../other",
|
||
|
"D:\\path", "/home/user",
|
||
|
} {
|
||
|
volume, err := parseVolume(path + ":d:\\target")
|
||
|
expected := types.ServiceVolumeConfig{
|
||
|
Type: "bind",
|
||
|
Source: path,
|
||
|
Target: "d:\\target",
|
||
|
}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeWithBindOptions(t *testing.T) {
|
||
|
volume, err := parseVolume("/source:/target:slave")
|
||
|
expected := types.ServiceVolumeConfig{
|
||
|
Type: "bind",
|
||
|
Source: "/source",
|
||
|
Target: "/target",
|
||
|
Bind: &types.ServiceVolumeBind{Propagation: "slave"},
|
||
|
}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeWithBindOptionsWindows(t *testing.T) {
|
||
|
volume, err := parseVolume("C:\\source\\foo:D:\\target:ro,rprivate")
|
||
|
expected := types.ServiceVolumeConfig{
|
||
|
Type: "bind",
|
||
|
Source: "C:\\source\\foo",
|
||
|
Target: "D:\\target",
|
||
|
ReadOnly: true,
|
||
|
Bind: &types.ServiceVolumeBind{Propagation: "rprivate"},
|
||
|
}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeWithInvalidVolumeOptions(t *testing.T) {
|
||
|
_, err := parseVolume("name:/target:bogus")
|
||
|
assert.Error(t, err, "invalid spec: name:/target:bogus: unknown option: bogus")
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeWithVolumeOptions(t *testing.T) {
|
||
|
volume, err := parseVolume("name:/target:nocopy")
|
||
|
expected := types.ServiceVolumeConfig{
|
||
|
Type: "volume",
|
||
|
Source: "name",
|
||
|
Target: "/target",
|
||
|
Volume: &types.ServiceVolumeVolume{NoCopy: true},
|
||
|
}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
|
||
|
func TestParseVolumeWithReadOnly(t *testing.T) {
|
||
|
for _, path := range []string{"./foo", "/home/user"} {
|
||
|
volume, err := parseVolume(path + ":/target:ro")
|
||
|
expected := types.ServiceVolumeConfig{
|
||
|
Type: "bind",
|
||
|
Source: path,
|
||
|
Target: "/target",
|
||
|
ReadOnly: true,
|
||
|
}
|
||
|
assert.NilError(t, err)
|
||
|
assert.DeepEqual(t, volume, expected)
|
||
|
}
|
||
|
}
|