github.com/kim0/docker@v0.6.2-0.20161130212042-4addda3f07e7/cli/command/service/opts_test.go (about) 1 package service 2 3 import ( 4 "reflect" 5 "testing" 6 "time" 7 8 "github.com/docker/docker/api/types/container" 9 mounttypes "github.com/docker/docker/api/types/mount" 10 "github.com/docker/docker/pkg/testutil/assert" 11 ) 12 13 func TestMemBytesString(t *testing.T) { 14 var mem memBytes = 1048576 15 assert.Equal(t, mem.String(), "1 MiB") 16 } 17 18 func TestMemBytesSetAndValue(t *testing.T) { 19 var mem memBytes 20 assert.NilError(t, mem.Set("5kb")) 21 assert.Equal(t, mem.Value(), int64(5120)) 22 } 23 24 func TestNanoCPUsString(t *testing.T) { 25 var cpus nanoCPUs = 6100000000 26 assert.Equal(t, cpus.String(), "6.100") 27 } 28 29 func TestNanoCPUsSetAndValue(t *testing.T) { 30 var cpus nanoCPUs 31 assert.NilError(t, cpus.Set("0.35")) 32 assert.Equal(t, cpus.Value(), int64(350000000)) 33 } 34 35 func TestDurationOptString(t *testing.T) { 36 dur := time.Duration(300 * 10e8) 37 duration := DurationOpt{value: &dur} 38 assert.Equal(t, duration.String(), "5m0s") 39 } 40 41 func TestDurationOptSetAndValue(t *testing.T) { 42 var duration DurationOpt 43 assert.NilError(t, duration.Set("300s")) 44 assert.Equal(t, *duration.Value(), time.Duration(300*10e8)) 45 assert.NilError(t, duration.Set("-300s")) 46 assert.Equal(t, *duration.Value(), time.Duration(-300*10e8)) 47 } 48 49 func TestPositiveDurationOptSetAndValue(t *testing.T) { 50 var duration PositiveDurationOpt 51 assert.NilError(t, duration.Set("300s")) 52 assert.Equal(t, *duration.Value(), time.Duration(300*10e8)) 53 assert.Error(t, duration.Set("-300s"), "cannot be negative") 54 } 55 56 func TestUint64OptString(t *testing.T) { 57 value := uint64(2345678) 58 opt := Uint64Opt{value: &value} 59 assert.Equal(t, opt.String(), "2345678") 60 61 opt = Uint64Opt{} 62 assert.Equal(t, opt.String(), "none") 63 } 64 65 func TestUint64OptSetAndValue(t *testing.T) { 66 var opt Uint64Opt 67 assert.NilError(t, opt.Set("14445")) 68 assert.Equal(t, *opt.Value(), uint64(14445)) 69 } 70 71 func TestMountOptString(t *testing.T) { 72 mount := MountOpt{ 73 values: []mounttypes.Mount{ 74 { 75 Type: mounttypes.TypeBind, 76 Source: "/home/path", 77 Target: "/target", 78 }, 79 { 80 Type: mounttypes.TypeVolume, 81 Source: "foo", 82 Target: "/target/foo", 83 }, 84 }, 85 } 86 expected := "bind /home/path /target, volume foo /target/foo" 87 assert.Equal(t, mount.String(), expected) 88 } 89 90 func TestMountOptSetBindNoErrorBind(t *testing.T) { 91 for _, testcase := range []string{ 92 // tests several aliases that should have same result. 93 "type=bind,target=/target,source=/source", 94 "type=bind,src=/source,dst=/target", 95 "type=bind,source=/source,dst=/target", 96 "type=bind,src=/source,target=/target", 97 } { 98 var mount MountOpt 99 100 assert.NilError(t, mount.Set(testcase)) 101 102 mounts := mount.Value() 103 assert.Equal(t, len(mounts), 1) 104 assert.Equal(t, mounts[0], mounttypes.Mount{ 105 Type: mounttypes.TypeBind, 106 Source: "/source", 107 Target: "/target", 108 }) 109 } 110 } 111 112 func TestMountOptSetVolumeNoError(t *testing.T) { 113 for _, testcase := range []string{ 114 // tests several aliases that should have same result. 115 "type=volume,target=/target,source=/source", 116 "type=volume,src=/source,dst=/target", 117 "type=volume,source=/source,dst=/target", 118 "type=volume,src=/source,target=/target", 119 } { 120 var mount MountOpt 121 122 assert.NilError(t, mount.Set(testcase)) 123 124 mounts := mount.Value() 125 assert.Equal(t, len(mounts), 1) 126 assert.Equal(t, mounts[0], mounttypes.Mount{ 127 Type: mounttypes.TypeVolume, 128 Source: "/source", 129 Target: "/target", 130 }) 131 } 132 } 133 134 // TestMountOptDefaultType ensures that a mount without the type defaults to a 135 // volume mount. 136 func TestMountOptDefaultType(t *testing.T) { 137 var mount MountOpt 138 assert.NilError(t, mount.Set("target=/target,source=/foo")) 139 assert.Equal(t, mount.values[0].Type, mounttypes.TypeVolume) 140 } 141 142 func TestMountOptSetErrorNoTarget(t *testing.T) { 143 var mount MountOpt 144 assert.Error(t, mount.Set("type=volume,source=/foo"), "target is required") 145 } 146 147 func TestMountOptSetErrorInvalidKey(t *testing.T) { 148 var mount MountOpt 149 assert.Error(t, mount.Set("type=volume,bogus=foo"), "unexpected key 'bogus'") 150 } 151 152 func TestMountOptSetErrorInvalidField(t *testing.T) { 153 var mount MountOpt 154 assert.Error(t, mount.Set("type=volume,bogus"), "invalid field 'bogus'") 155 } 156 157 func TestMountOptSetErrorInvalidReadOnly(t *testing.T) { 158 var mount MountOpt 159 assert.Error(t, mount.Set("type=volume,readonly=no"), "invalid value for readonly: no") 160 assert.Error(t, mount.Set("type=volume,readonly=invalid"), "invalid value for readonly: invalid") 161 } 162 163 func TestMountOptDefaultEnableReadOnly(t *testing.T) { 164 var m MountOpt 165 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo")) 166 assert.Equal(t, m.values[0].ReadOnly, false) 167 168 m = MountOpt{} 169 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly")) 170 assert.Equal(t, m.values[0].ReadOnly, true) 171 172 m = MountOpt{} 173 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly=1")) 174 assert.Equal(t, m.values[0].ReadOnly, true) 175 176 m = MountOpt{} 177 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly=true")) 178 assert.Equal(t, m.values[0].ReadOnly, true) 179 180 m = MountOpt{} 181 assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly=0")) 182 assert.Equal(t, m.values[0].ReadOnly, false) 183 } 184 185 func TestMountOptVolumeNoCopy(t *testing.T) { 186 var m MountOpt 187 assert.NilError(t, m.Set("type=volume,target=/foo,volume-nocopy")) 188 assert.Equal(t, m.values[0].Source, "") 189 190 m = MountOpt{} 191 assert.NilError(t, m.Set("type=volume,target=/foo,source=foo")) 192 assert.Equal(t, m.values[0].VolumeOptions == nil, true) 193 194 m = MountOpt{} 195 assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy=true")) 196 assert.Equal(t, m.values[0].VolumeOptions != nil, true) 197 assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) 198 199 m = MountOpt{} 200 assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy")) 201 assert.Equal(t, m.values[0].VolumeOptions != nil, true) 202 assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) 203 204 m = MountOpt{} 205 assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy=1")) 206 assert.Equal(t, m.values[0].VolumeOptions != nil, true) 207 assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) 208 } 209 210 func TestMountOptTypeConflict(t *testing.T) { 211 var m MountOpt 212 assert.Error(t, m.Set("type=bind,target=/foo,source=/foo,volume-nocopy=true"), "cannot mix") 213 assert.Error(t, m.Set("type=volume,target=/foo,source=/foo,bind-propagation=rprivate"), "cannot mix") 214 } 215 216 func TestHealthCheckOptionsToHealthConfig(t *testing.T) { 217 dur := time.Second 218 opt := healthCheckOptions{ 219 cmd: "curl", 220 interval: PositiveDurationOpt{DurationOpt{value: &dur}}, 221 timeout: PositiveDurationOpt{DurationOpt{value: &dur}}, 222 retries: 10, 223 } 224 config, err := opt.toHealthConfig() 225 assert.NilError(t, err) 226 assert.Equal(t, reflect.DeepEqual(config, &container.HealthConfig{ 227 Test: []string{"CMD-SHELL", "curl"}, 228 Interval: time.Second, 229 Timeout: time.Second, 230 Retries: 10, 231 }), true) 232 } 233 234 func TestHealthCheckOptionsToHealthConfigNoHealthcheck(t *testing.T) { 235 opt := healthCheckOptions{ 236 noHealthcheck: true, 237 } 238 config, err := opt.toHealthConfig() 239 assert.NilError(t, err) 240 assert.Equal(t, reflect.DeepEqual(config, &container.HealthConfig{ 241 Test: []string{"NONE"}, 242 }), true) 243 } 244 245 func TestHealthCheckOptionsToHealthConfigConflict(t *testing.T) { 246 opt := healthCheckOptions{ 247 cmd: "curl", 248 noHealthcheck: true, 249 } 250 _, err := opt.toHealthConfig() 251 assert.Error(t, err, "--no-healthcheck conflicts with --health-* options") 252 }