github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/provider/vsphere/config_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // +build !gccgo
     5  
     6  package vsphere_test
     7  
     8  import (
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/environs"
    13  	"github.com/juju/juju/environs/config"
    14  	"github.com/juju/juju/provider/vsphere"
    15  	"github.com/juju/juju/testing"
    16  )
    17  
    18  type ConfigSuite struct {
    19  	vsphere.BaseSuite
    20  
    21  	config *config.Config
    22  }
    23  
    24  var _ = gc.Suite(&ConfigSuite{})
    25  
    26  func (s *ConfigSuite) SetUpTest(c *gc.C) {
    27  	s.BaseSuite.SetUpTest(c)
    28  
    29  	cfg, err := testing.ModelConfig(c).Apply(vsphere.ConfigAttrs())
    30  	c.Assert(err, jc.ErrorIsNil)
    31  	s.config = cfg
    32  }
    33  
    34  // configTestSpec defines a subtest to run in a table driven test.
    35  type configTestSpec struct {
    36  	// info describes the subtest.
    37  	info string
    38  	// insert holds attrs that should be merged into the config.
    39  	insert testing.Attrs
    40  	// remove has the names of attrs that should be removed.
    41  	remove []string
    42  	// expect defines the expected attributes in a success case.
    43  	expect testing.Attrs
    44  	// err is the error message to expect in a failure case.
    45  	err string
    46  }
    47  
    48  func (ts configTestSpec) checkSuccess(c *gc.C, value interface{}, err error) {
    49  	if !c.Check(err, jc.ErrorIsNil) {
    50  		return
    51  	}
    52  
    53  	var cfg *config.Config
    54  	switch typed := value.(type) {
    55  	case *config.Config:
    56  		cfg = typed
    57  	case environs.Environ:
    58  		cfg = typed.Config()
    59  	}
    60  
    61  	attrs := cfg.AllAttrs()
    62  	for field, value := range ts.expect {
    63  		c.Check(attrs[field], gc.Equals, value)
    64  	}
    65  }
    66  
    67  func (ts configTestSpec) checkFailure(c *gc.C, err error, msg string) {
    68  	c.Check(err, gc.ErrorMatches, msg+": "+ts.err)
    69  }
    70  
    71  func (ts configTestSpec) checkAttrs(c *gc.C, attrs map[string]interface{}, cfg *config.Config) {
    72  	for field, value := range cfg.UnknownAttrs() {
    73  		c.Check(attrs[field], gc.Equals, value)
    74  	}
    75  }
    76  
    77  func (ts configTestSpec) attrs() testing.Attrs {
    78  	return vsphere.ConfigAttrs().Merge(ts.insert).Delete(ts.remove...)
    79  }
    80  
    81  func (ts configTestSpec) newConfig(c *gc.C) *config.Config {
    82  	attrs := ts.attrs()
    83  	cfg, err := testing.ModelConfig(c).Apply(attrs)
    84  	c.Assert(err, jc.ErrorIsNil)
    85  	return cfg
    86  }
    87  
    88  var newConfigTests = []configTestSpec{{
    89  	info:   "unknown field is not touched",
    90  	insert: testing.Attrs{"unknown-field": "12345"},
    91  	expect: testing.Attrs{"unknown-field": "12345"},
    92  }}
    93  
    94  func (*ConfigSuite) TestNewModelConfig(c *gc.C) {
    95  	for i, test := range newConfigTests {
    96  		c.Logf("test %d: %s", i, test.info)
    97  
    98  		testConfig := test.newConfig(c)
    99  		environ, err := environs.New(environs.OpenParams{
   100  			Cloud:  vsphere.FakeCloudSpec(),
   101  			Config: testConfig,
   102  		})
   103  
   104  		// Check the result
   105  		if test.err != "" {
   106  			test.checkFailure(c, err, "invalid config")
   107  		} else {
   108  			test.checkSuccess(c, environ, err)
   109  		}
   110  	}
   111  }
   112  
   113  func (*ConfigSuite) TestValidateNewConfig(c *gc.C) {
   114  	for i, test := range newConfigTests {
   115  		c.Logf("test %d: %s", i, test.info)
   116  
   117  		testConfig := test.newConfig(c)
   118  		validatedConfig, err := vsphere.Provider.Validate(testConfig, nil)
   119  
   120  		// Check the result
   121  		if test.err != "" {
   122  			test.checkFailure(c, err, "invalid config")
   123  		} else {
   124  			c.Check(validatedConfig, gc.NotNil)
   125  			test.checkSuccess(c, validatedConfig, err)
   126  		}
   127  	}
   128  }
   129  
   130  func (s *ConfigSuite) TestValidateOldConfig(c *gc.C) {
   131  	for i, test := range newConfigTests {
   132  		c.Logf("test %d: %s", i, test.info)
   133  
   134  		oldcfg := test.newConfig(c)
   135  		newcfg := s.config
   136  		expected := vsphere.ConfigAttrs()
   137  
   138  		// Validate the new config (relative to the old one) using the
   139  		// provider.
   140  		validatedConfig, err := vsphere.Provider.Validate(newcfg, oldcfg)
   141  
   142  		// Check the result.
   143  		if test.err != "" {
   144  			test.checkFailure(c, err, "invalid base config")
   145  		} else {
   146  			if test.remove != nil {
   147  				// No defaults are set on the old config.
   148  				c.Check(err, gc.ErrorMatches, "invalid base config: .*")
   149  				continue
   150  			}
   151  
   152  			c.Check(err, jc.ErrorIsNil)
   153  			// We verify that Validate filled in the defaults
   154  			// appropriately.
   155  			c.Check(validatedConfig, gc.NotNil)
   156  			test.checkAttrs(c, expected, validatedConfig)
   157  		}
   158  	}
   159  }
   160  
   161  var changeConfigTests = []configTestSpec{{
   162  	info:   "no change, no error",
   163  	expect: vsphere.ConfigAttrs(),
   164  }, {
   165  	info:   "can insert unknown field",
   166  	insert: testing.Attrs{"unknown": "ignoti"},
   167  	expect: testing.Attrs{"unknown": "ignoti"},
   168  }}
   169  
   170  func (s *ConfigSuite) TestValidateChange(c *gc.C) {
   171  	for i, test := range changeConfigTests {
   172  		c.Logf("test %d: %s", i, test.info)
   173  
   174  		testConfig := test.newConfig(c)
   175  		validatedConfig, err := vsphere.Provider.Validate(testConfig, s.config)
   176  
   177  		// Check the result.
   178  		if test.err != "" {
   179  			test.checkFailure(c, err, "invalid config change")
   180  		} else {
   181  			test.checkSuccess(c, validatedConfig, err)
   182  		}
   183  	}
   184  }
   185  
   186  func (s *ConfigSuite) TestSetConfig(c *gc.C) {
   187  	for i, test := range changeConfigTests {
   188  		c.Logf("test %d: %s", i, test.info)
   189  
   190  		environ, err := environs.New(environs.OpenParams{
   191  			Cloud:  vsphere.FakeCloudSpec(),
   192  			Config: s.config,
   193  		})
   194  		c.Assert(err, jc.ErrorIsNil)
   195  
   196  		testConfig := test.newConfig(c)
   197  		err = environ.SetConfig(testConfig)
   198  
   199  		// Check the result.
   200  		if test.err != "" {
   201  			test.checkFailure(c, err, "invalid config change")
   202  			test.checkAttrs(c, environ.Config().AllAttrs(), s.config)
   203  		} else {
   204  			test.checkSuccess(c, environ.Config(), err)
   205  		}
   206  	}
   207  }