|
@@ -0,0 +1,134 @@
|
|
|
+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)
|
|
|
+ }
|
|
|
+}
|