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  }