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  }