github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/cli/compose/convert/volume_test.go (about)

     1  package convert
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/docker/docker/api/types/mount"
     7  	composetypes "github.com/docker/docker/cli/compose/types"
     8  	"github.com/docker/docker/pkg/testutil/assert"
     9  )
    10  
    11  func TestIsReadOnly(t *testing.T) {
    12  	assert.Equal(t, isReadOnly([]string{"foo", "bar", "ro"}), true)
    13  	assert.Equal(t, isReadOnly([]string{"ro"}), true)
    14  	assert.Equal(t, isReadOnly([]string{}), false)
    15  	assert.Equal(t, isReadOnly([]string{"foo", "rw"}), false)
    16  	assert.Equal(t, isReadOnly([]string{"foo"}), false)
    17  }
    18  
    19  func TestIsNoCopy(t *testing.T) {
    20  	assert.Equal(t, isNoCopy([]string{"foo", "bar", "nocopy"}), true)
    21  	assert.Equal(t, isNoCopy([]string{"nocopy"}), true)
    22  	assert.Equal(t, isNoCopy([]string{}), false)
    23  	assert.Equal(t, isNoCopy([]string{"foo", "rw"}), false)
    24  }
    25  
    26  func TestGetBindOptions(t *testing.T) {
    27  	opts := getBindOptions([]string{"slave"})
    28  	expected := mount.BindOptions{Propagation: mount.PropagationSlave}
    29  	assert.Equal(t, *opts, expected)
    30  }
    31  
    32  func TestGetBindOptionsNone(t *testing.T) {
    33  	opts := getBindOptions([]string{"ro"})
    34  	assert.Equal(t, opts, (*mount.BindOptions)(nil))
    35  }
    36  
    37  func TestConvertVolumeToMountAnonymousVolume(t *testing.T) {
    38  	stackVolumes := volumes{}
    39  	namespace := NewNamespace("foo")
    40  	expected := mount.Mount{
    41  		Type:   mount.TypeVolume,
    42  		Target: "/foo/bar",
    43  	}
    44  	mount, err := convertVolumeToMount("/foo/bar", stackVolumes, namespace)
    45  	assert.NilError(t, err)
    46  	assert.DeepEqual(t, mount, expected)
    47  }
    48  
    49  func TestConvertVolumeToMountInvalidFormat(t *testing.T) {
    50  	namespace := NewNamespace("foo")
    51  	invalids := []string{"::", "::cc", ":bb:", "aa::", "aa::cc", "aa:bb:", " : : ", " : :cc", " :bb: ", "aa: : ", "aa: :cc", "aa:bb: "}
    52  	for _, vol := range invalids {
    53  		_, err := convertVolumeToMount(vol, volumes{}, namespace)
    54  		assert.Error(t, err, "invalid volume: "+vol)
    55  	}
    56  }
    57  
    58  func TestConvertVolumeToMountNamedVolume(t *testing.T) {
    59  	stackVolumes := volumes{
    60  		"normal": composetypes.VolumeConfig{
    61  			Driver: "glusterfs",
    62  			DriverOpts: map[string]string{
    63  				"opt": "value",
    64  			},
    65  			Labels: map[string]string{
    66  				"something": "labeled",
    67  			},
    68  		},
    69  	}
    70  	namespace := NewNamespace("foo")
    71  	expected := mount.Mount{
    72  		Type:     mount.TypeVolume,
    73  		Source:   "foo_normal",
    74  		Target:   "/foo",
    75  		ReadOnly: true,
    76  		VolumeOptions: &mount.VolumeOptions{
    77  			Labels: map[string]string{
    78  				LabelNamespace: "foo",
    79  				"something":    "labeled",
    80  			},
    81  			DriverConfig: &mount.Driver{
    82  				Name: "glusterfs",
    83  				Options: map[string]string{
    84  					"opt": "value",
    85  				},
    86  			},
    87  		},
    88  	}
    89  	mount, err := convertVolumeToMount("normal:/foo:ro", stackVolumes, namespace)
    90  	assert.NilError(t, err)
    91  	assert.DeepEqual(t, mount, expected)
    92  }
    93  
    94  func TestConvertVolumeToMountNamedVolumeExternal(t *testing.T) {
    95  	stackVolumes := volumes{
    96  		"outside": composetypes.VolumeConfig{
    97  			External: composetypes.External{
    98  				External: true,
    99  				Name:     "special",
   100  			},
   101  		},
   102  	}
   103  	namespace := NewNamespace("foo")
   104  	expected := mount.Mount{
   105  		Type:   mount.TypeVolume,
   106  		Source: "special",
   107  		Target: "/foo",
   108  	}
   109  	mount, err := convertVolumeToMount("outside:/foo", stackVolumes, namespace)
   110  	assert.NilError(t, err)
   111  	assert.DeepEqual(t, mount, expected)
   112  }
   113  
   114  func TestConvertVolumeToMountBind(t *testing.T) {
   115  	stackVolumes := volumes{}
   116  	namespace := NewNamespace("foo")
   117  	expected := mount.Mount{
   118  		Type:        mount.TypeBind,
   119  		Source:      "/bar",
   120  		Target:      "/foo",
   121  		ReadOnly:    true,
   122  		BindOptions: &mount.BindOptions{Propagation: mount.PropagationShared},
   123  	}
   124  	mount, err := convertVolumeToMount("/bar:/foo:ro,shared", stackVolumes, namespace)
   125  	assert.NilError(t, err)
   126  	assert.DeepEqual(t, mount, expected)
   127  }
   128  
   129  func TestConvertVolumeToMountVolumeDoesNotExist(t *testing.T) {
   130  	namespace := NewNamespace("foo")
   131  	_, err := convertVolumeToMount("unknown:/foo:ro", volumes{}, namespace)
   132  	assert.Error(t, err, "undefined volume: unknown")
   133  }