github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/instance/instance_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package instance_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/instance"
    11  )
    12  
    13  type HardwareSuite struct{}
    14  
    15  var _ = gc.Suite(&HardwareSuite{})
    16  
    17  type parseHardwareTestSpec struct {
    18  	summary string
    19  	args    []string
    20  	err     string
    21  }
    22  
    23  func (ts *parseHardwareTestSpec) check(c *gc.C) {
    24  	hwc, err := instance.ParseHardware(ts.args...)
    25  
    26  	// Check the spec'ed error condition first.
    27  	if ts.err != "" {
    28  		c.Check(err, gc.ErrorMatches, ts.err)
    29  		// We expected an error so we don't worry about checking hwc.
    30  		return
    31  	} else if !c.Check(err, jc.ErrorIsNil) {
    32  		// We got an unexpected error so we don't worry about checking hwc.
    33  		return
    34  	}
    35  
    36  	// The error condition matched so we check hwc.
    37  	cons1, err := instance.ParseHardware(hwc.String())
    38  	if !c.Check(err, jc.ErrorIsNil) {
    39  		// Parsing didn't work so we don't worry about checking hwc.
    40  		return
    41  	}
    42  
    43  	// Compare the round-tripped HWC.
    44  	c.Check(cons1, gc.DeepEquals, hwc)
    45  }
    46  
    47  var parseHardwareTests = []parseHardwareTestSpec{
    48  	// Simple errors.
    49  	{
    50  		summary: "nothing at all",
    51  	}, {
    52  		summary: "empty",
    53  		args:    []string{"     "},
    54  	}, {
    55  		summary: "complete nonsense",
    56  		args:    []string{"cheese"},
    57  		err:     `malformed characteristic "cheese"`,
    58  	}, {
    59  		summary: "missing name",
    60  		args:    []string{"=cheese"},
    61  		err:     `malformed characteristic "=cheese"`,
    62  	}, {
    63  		summary: "unknown characteristic",
    64  		args:    []string{"cheese=edam"},
    65  		err:     `unknown characteristic "cheese"`,
    66  	},
    67  
    68  	// "arch" in detail.
    69  	{
    70  		summary: "set arch empty",
    71  		args:    []string{"arch="},
    72  	}, {
    73  		summary: "set arch amd64",
    74  		args:    []string{"arch=amd64"},
    75  	}, {
    76  		summary: "set arch i386",
    77  		args:    []string{"arch=i386"},
    78  	}, {
    79  		summary: "set arch armhf",
    80  		args:    []string{"arch=armhf"},
    81  	}, {
    82  		summary: "set nonsense arch 1",
    83  		args:    []string{"arch=cheese"},
    84  		err:     `bad "arch" characteristic: "cheese" not recognized`,
    85  	}, {
    86  		summary: "set nonsense arch 2",
    87  		args:    []string{"arch=123.45"},
    88  		err:     `bad "arch" characteristic: "123.45" not recognized`,
    89  	}, {
    90  		summary: "double set arch together",
    91  		args:    []string{"arch=amd64 arch=amd64"},
    92  		err:     `bad "arch" characteristic: already set`,
    93  	}, {
    94  		summary: "double set arch separately",
    95  		args:    []string{"arch=armhf", "arch="},
    96  		err:     `bad "arch" characteristic: already set`,
    97  	},
    98  
    99  	// "cores" in detail.
   100  	{
   101  		summary: "set cores empty",
   102  		args:    []string{"cores="},
   103  	}, {
   104  		summary: "set cores zero",
   105  		args:    []string{"cores=0"},
   106  	}, {
   107  		summary: "set cores",
   108  		args:    []string{"cores=4"},
   109  	}, {
   110  		summary: "set nonsense cores 1",
   111  		args:    []string{"cores=cheese"},
   112  		err:     `bad "cores" characteristic: must be a non-negative integer`,
   113  	}, {
   114  		summary: "set nonsense cores 2",
   115  		args:    []string{"cores=-1"},
   116  		err:     `bad "cores" characteristic: must be a non-negative integer`,
   117  	}, {
   118  		summary: "set nonsense cores 3",
   119  		args:    []string{"cores=123.45"},
   120  		err:     `bad "cores" characteristic: must be a non-negative integer`,
   121  	}, {
   122  		summary: "double set cores together",
   123  		args:    []string{"cores=128 cores=1"},
   124  		err:     `bad "cores" characteristic: already set`,
   125  	}, {
   126  		summary: "double set cores separately",
   127  		args:    []string{"cores=128", "cores=1"},
   128  		err:     `bad "cores" characteristic: already set`,
   129  	},
   130  
   131  	// "cpu-power" in detail.
   132  	{
   133  		summary: "set cpu-power empty",
   134  		args:    []string{"cpu-power="},
   135  	}, {
   136  		summary: "set cpu-power zero",
   137  		args:    []string{"cpu-power=0"},
   138  	}, {
   139  		summary: "set cpu-power",
   140  		args:    []string{"cpu-power=44"},
   141  	}, {
   142  		summary: "set nonsense cpu-power 1",
   143  		args:    []string{"cpu-power=cheese"},
   144  		err:     `bad "cpu-power" characteristic: must be a non-negative integer`,
   145  	}, {
   146  		summary: "set nonsense cpu-power 2",
   147  		args:    []string{"cpu-power=-1"},
   148  		err:     `bad "cpu-power" characteristic: must be a non-negative integer`,
   149  	}, {
   150  		summary: "double set cpu-power together",
   151  		args:    []string{"  cpu-power=300 cpu-power=1700 "},
   152  		err:     `bad "cpu-power" characteristic: already set`,
   153  	}, {
   154  		summary: "double set cpu-power separately",
   155  		args:    []string{"cpu-power=300  ", "  cpu-power=1700"},
   156  		err:     `bad "cpu-power" characteristic: already set`,
   157  	},
   158  
   159  	// "mem" in detail.
   160  	{
   161  		summary: "set mem empty",
   162  		args:    []string{"mem="},
   163  	}, {
   164  		summary: "set mem zero",
   165  		args:    []string{"mem=0"},
   166  	}, {
   167  		summary: "set mem without suffix",
   168  		args:    []string{"mem=512"},
   169  	}, {
   170  		summary: "set mem with M suffix",
   171  		args:    []string{"mem=512M"},
   172  	}, {
   173  		summary: "set mem with G suffix",
   174  		args:    []string{"mem=1.5G"},
   175  	}, {
   176  		summary: "set mem with T suffix",
   177  		args:    []string{"mem=36.2T"},
   178  	}, {
   179  		summary: "set mem with P suffix",
   180  		args:    []string{"mem=18.9P"},
   181  	}, {
   182  		summary: "set nonsense mem 1",
   183  		args:    []string{"mem=cheese"},
   184  		err:     `bad "mem" characteristic: must be a non-negative float with optional M/G/T/P suffix`,
   185  	}, {
   186  		summary: "set nonsense mem 2",
   187  		args:    []string{"mem=-1"},
   188  		err:     `bad "mem" characteristic: must be a non-negative float with optional M/G/T/P suffix`,
   189  	}, {
   190  		summary: "set nonsense mem 3",
   191  		args:    []string{"mem=32Y"},
   192  		err:     `bad "mem" characteristic: must be a non-negative float with optional M/G/T/P suffix`,
   193  	}, {
   194  		summary: "double set mem together",
   195  		args:    []string{"mem=1G  mem=2G"},
   196  		err:     `bad "mem" characteristic: already set`,
   197  	}, {
   198  		summary: "double set mem separately",
   199  		args:    []string{"mem=1G", "mem=2G"},
   200  		err:     `bad "mem" characteristic: already set`,
   201  	},
   202  
   203  	// "root-disk" in detail.
   204  	{
   205  		summary: "set root-disk empty",
   206  		args:    []string{"root-disk="},
   207  	}, {
   208  		summary: "set root-disk zero",
   209  		args:    []string{"root-disk=0"},
   210  	}, {
   211  		summary: "set root-disk without suffix",
   212  		args:    []string{"root-disk=512"},
   213  	}, {
   214  		summary: "set root-disk with M suffix",
   215  		args:    []string{"root-disk=512M"},
   216  	}, {
   217  		summary: "set root-disk with G suffix",
   218  		args:    []string{"root-disk=1.5G"},
   219  	}, {
   220  		summary: "set root-disk with T suffix",
   221  		args:    []string{"root-disk=36.2T"},
   222  	}, {
   223  		summary: "set root-disk with P suffix",
   224  		args:    []string{"root-disk=18.9P"},
   225  	}, {
   226  		summary: "set nonsense root-disk 1",
   227  		args:    []string{"root-disk=cheese"},
   228  		err:     `bad "root-disk" characteristic: must be a non-negative float with optional M/G/T/P suffix`,
   229  	}, {
   230  		summary: "set nonsense root-disk 2",
   231  		args:    []string{"root-disk=-1"},
   232  		err:     `bad "root-disk" characteristic: must be a non-negative float with optional M/G/T/P suffix`,
   233  	}, {
   234  		summary: "set nonsense root-disk 3",
   235  		args:    []string{"root-disk=32Y"},
   236  		err:     `bad "root-disk" characteristic: must be a non-negative float with optional M/G/T/P suffix`,
   237  	}, {
   238  		summary: "double set root-disk together",
   239  		args:    []string{"root-disk=1G  root-disk=2G"},
   240  		err:     `bad "root-disk" characteristic: already set`,
   241  	}, {
   242  		summary: "double set root-disk separately",
   243  		args:    []string{"root-disk=1G", "root-disk=2G"},
   244  		err:     `bad "root-disk" characteristic: already set`,
   245  	},
   246  
   247  	// "availability-zone" in detail.
   248  	{
   249  		summary: "set availability-zone empty",
   250  		args:    []string{"availability-zone="},
   251  	}, {
   252  		summary: "set availability-zone non-empty",
   253  		args:    []string{"availability-zone=a_zone"},
   254  	}, {
   255  		summary: "double set availability-zone together",
   256  		args:    []string{"availability-zone=a_zone availability-zone=a_zone"},
   257  		err:     `bad "availability-zone" characteristic: already set`,
   258  	}, {
   259  		summary: "double set availability-zone separately",
   260  		args:    []string{"availability-zone=a_zone", "availability-zone="},
   261  		err:     `bad "availability-zone" characteristic: already set`,
   262  	},
   263  
   264  	// Everything at once.
   265  	{
   266  		summary: "kitchen sink together",
   267  		args:    []string{" root-disk=4G mem=2T  arch=i386  cores=4096 cpu-power=9001 availability-zone=a_zone"},
   268  	}, {
   269  		summary: "kitchen sink separately",
   270  		args:    []string{"root-disk=4G", "mem=2T", "cores=4096", "cpu-power=9001", "arch=armhf", "availability-zone=a_zone"},
   271  	},
   272  }
   273  
   274  func (s *HardwareSuite) TestParseHardware(c *gc.C) {
   275  	for i, t := range parseHardwareTests {
   276  		c.Logf("test %d: %s", i, t.summary)
   277  		t.check(c)
   278  	}
   279  }