github.com/portworx/docker@v1.12.1/api/client/service/opts_test.go (about) 1 package service 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/docker/docker/pkg/testutil/assert" 8 "github.com/docker/engine-api/types/swarm" 9 ) 10 11 func TestMemBytesString(t *testing.T) { 12 var mem memBytes = 1048576 13 assert.Equal(t, mem.String(), "1 MiB") 14 } 15 16 func TestMemBytesSetAndValue(t *testing.T) { 17 var mem memBytes 18 assert.NilError(t, mem.Set("5kb")) 19 assert.Equal(t, mem.Value(), int64(5120)) 20 } 21 22 func TestNanoCPUsString(t *testing.T) { 23 var cpus nanoCPUs = 6100000000 24 assert.Equal(t, cpus.String(), "6.100") 25 } 26 27 func TestNanoCPUsSetAndValue(t *testing.T) { 28 var cpus nanoCPUs 29 assert.NilError(t, cpus.Set("0.35")) 30 assert.Equal(t, cpus.Value(), int64(350000000)) 31 } 32 33 func TestDurationOptString(t *testing.T) { 34 dur := time.Duration(300 * 10e8) 35 duration := DurationOpt{value: &dur} 36 assert.Equal(t, duration.String(), "5m0s") 37 } 38 39 func TestDurationOptSetAndValue(t *testing.T) { 40 var duration DurationOpt 41 assert.NilError(t, duration.Set("300s")) 42 assert.Equal(t, *duration.Value(), time.Duration(300*10e8)) 43 } 44 45 func TestUint64OptString(t *testing.T) { 46 value := uint64(2345678) 47 opt := Uint64Opt{value: &value} 48 assert.Equal(t, opt.String(), "2345678") 49 50 opt = Uint64Opt{} 51 assert.Equal(t, opt.String(), "none") 52 } 53 54 func TestUint64OptSetAndValue(t *testing.T) { 55 var opt Uint64Opt 56 assert.NilError(t, opt.Set("14445")) 57 assert.Equal(t, *opt.Value(), uint64(14445)) 58 } 59 60 func TestMountOptString(t *testing.T) { 61 mount := MountOpt{ 62 values: []swarm.Mount{ 63 { 64 Type: swarm.MountTypeBind, 65 Source: "/home/path", 66 Target: "/target", 67 }, 68 { 69 Type: swarm.MountTypeVolume, 70 Source: "foo", 71 Target: "/target/foo", 72 }, 73 }, 74 } 75 expected := "bind /home/path /target, volume foo /target/foo" 76 assert.Equal(t, mount.String(), expected) 77 } 78 79 func TestMountOptSetNoError(t *testing.T) { 80 for _, testcase := range []string{ 81 // tests several aliases that should have same result. 82 "type=bind,target=/target,source=/source", 83 "type=bind,src=/source,dst=/target", 84 "type=bind,source=/source,dst=/target", 85 "type=bind,src=/source,target=/target", 86 } { 87 var mount MountOpt 88 89 assert.NilError(t, mount.Set(testcase)) 90 91 mounts := mount.Value() 92 assert.Equal(t, len(mounts), 1) 93 assert.Equal(t, mounts[0], swarm.Mount{ 94 Type: swarm.MountTypeBind, 95 Source: "/source", 96 Target: "/target", 97 }) 98 } 99 } 100 101 // TestMountOptDefaultType ensures that a mount without the type defaults to a 102 // volume mount. 103 func TestMountOptDefaultType(t *testing.T) { 104 var mount MountOpt 105 assert.NilError(t, mount.Set("target=/target,source=/foo")) 106 assert.Equal(t, mount.values[0].Type, swarm.MountTypeVolume) 107 } 108 109 func TestMountOptSetErrorNoTarget(t *testing.T) { 110 var mount MountOpt 111 assert.Error(t, mount.Set("type=volume,source=/foo"), "target is required") 112 } 113 114 func TestMountOptSetErrorInvalidKey(t *testing.T) { 115 var mount MountOpt 116 assert.Error(t, mount.Set("type=volume,bogus=foo"), "unexpected key 'bogus'") 117 } 118 119 func TestMountOptSetErrorInvalidField(t *testing.T) { 120 var mount MountOpt 121 assert.Error(t, mount.Set("type=volume,bogus"), "invalid field 'bogus'") 122 } 123 124 func TestMountOptSetErrorInvalidReadOnly(t *testing.T) { 125 var mount MountOpt 126 assert.Error(t, mount.Set("type=volume,readonly=no"), "invalid value for readonly: no") 127 assert.Error(t, mount.Set("type=volume,readonly=invalid"), "invalid value for readonly: invalid") 128 } 129 130 func TestMountOptDefaultEnableReadOnly(t *testing.T) { 131 var m MountOpt 132 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo")) 133 assert.Equal(t, m.values[0].ReadOnly, false) 134 135 m = MountOpt{} 136 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly")) 137 assert.Equal(t, m.values[0].ReadOnly, true) 138 139 m = MountOpt{} 140 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly=1")) 141 assert.Equal(t, m.values[0].ReadOnly, true) 142 143 m = MountOpt{} 144 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly=0")) 145 assert.Equal(t, m.values[0].ReadOnly, false) 146 } 147 148 func TestMountOptVolumeNoCopy(t *testing.T) { 149 var m MountOpt 150 assert.Error(t, m.Set("type=volume,target=/foo,volume-nocopy"), "source is required") 151 152 m = MountOpt{} 153 assert.NilError(t, m.Set("type=volume,target=/foo,source=foo")) 154 assert.Equal(t, m.values[0].VolumeOptions == nil, true) 155 156 m = MountOpt{} 157 assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy=true")) 158 assert.Equal(t, m.values[0].VolumeOptions != nil, true) 159 assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) 160 161 m = MountOpt{} 162 assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy")) 163 assert.Equal(t, m.values[0].VolumeOptions != nil, true) 164 assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) 165 166 m = MountOpt{} 167 assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy=1")) 168 assert.Equal(t, m.values[0].VolumeOptions != nil, true) 169 assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) 170 } 171 172 func TestMountOptTypeConflict(t *testing.T) { 173 var m MountOpt 174 assert.Error(t, m.Set("type=bind,target=/foo,source=/foo,volume-nocopy=true"), "cannot mix") 175 assert.Error(t, m.Set("type=volume,target=/foo,source=/foo,bind-propagation=rprivate"), "cannot mix") 176 }