github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/configvalidator_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/environs/config"
    12  	"github.com/juju/juju/state"
    13  	coretesting "github.com/juju/juju/testing"
    14  )
    15  
    16  type ConfigValidatorSuite struct {
    17  	ConnSuite
    18  	configValidator mockConfigValidator
    19  }
    20  
    21  var _ = gc.Suite(&ConfigValidatorSuite{})
    22  
    23  type mockConfigValidator struct {
    24  	validateError error
    25  	validateCfg   *config.Config
    26  	validateOld   *config.Config
    27  	validateValid *config.Config
    28  }
    29  
    30  // To test UpdateModelConfig updates state, Validate returns a config
    31  // different to both input configs
    32  func mockValidCfg() (valid *config.Config, err error) {
    33  	cfg, err := config.New(config.UseDefaults, coretesting.FakeConfig())
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  	valid, err = cfg.Apply(map[string]interface{}{
    38  		"arbitrary-key": "cptn-marvel",
    39  	})
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  	return valid, nil
    44  }
    45  
    46  func (p *mockConfigValidator) Validate(cfg, old *config.Config) (valid *config.Config, err error) {
    47  	p.validateCfg = cfg
    48  	p.validateOld = old
    49  	p.validateValid, p.validateError = mockValidCfg()
    50  	return p.validateValid, p.validateError
    51  }
    52  
    53  func (s *ConfigValidatorSuite) SetUpTest(c *gc.C) {
    54  	s.ConnSuite.SetUpTest(c)
    55  	s.configValidator = mockConfigValidator{}
    56  	s.policy.GetConfigValidator = func(string) (state.ConfigValidator, error) {
    57  		return &s.configValidator, nil
    58  	}
    59  }
    60  
    61  func (s *ConfigValidatorSuite) updateModelConfig(c *gc.C) error {
    62  	updateAttrs := map[string]interface{}{
    63  		"authorized-keys": "different-keys",
    64  		"arbitrary-key":   "shazam!",
    65  	}
    66  	return s.State.UpdateModelConfig(updateAttrs, nil, nil)
    67  }
    68  
    69  func (s *ConfigValidatorSuite) TestConfigValidate(c *gc.C) {
    70  	err := s.updateModelConfig(c)
    71  	c.Assert(err, jc.ErrorIsNil)
    72  }
    73  
    74  func (s *ConfigValidatorSuite) TestUpdateModelConfigFailsOnConfigValidateError(c *gc.C) {
    75  	var configValidatorErr error
    76  	s.policy.GetConfigValidator = func(string) (state.ConfigValidator, error) {
    77  		configValidatorErr = errors.NotFoundf("")
    78  		return &s.configValidator, configValidatorErr
    79  	}
    80  
    81  	err := s.updateModelConfig(c)
    82  	c.Assert(err, gc.ErrorMatches, " not found")
    83  }
    84  
    85  func (s *ConfigValidatorSuite) TestUpdateModelConfigUpdatesState(c *gc.C) {
    86  	s.updateModelConfig(c)
    87  	stateCfg, err := s.State.ModelConfig()
    88  	c.Assert(err, jc.ErrorIsNil)
    89  	newValidCfg, err := mockValidCfg()
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Assert(stateCfg.AllAttrs()["arbitrary-key"], gc.Equals, newValidCfg.AllAttrs()["arbitrary-key"])
    92  }
    93  
    94  func (s *ConfigValidatorSuite) TestConfigValidateUnimplemented(c *gc.C) {
    95  	var configValidatorErr error
    96  	s.policy.GetConfigValidator = func(string) (state.ConfigValidator, error) {
    97  		return nil, configValidatorErr
    98  	}
    99  
   100  	err := s.updateModelConfig(c)
   101  	c.Assert(err, gc.ErrorMatches, "policy returned nil configValidator without an error")
   102  	configValidatorErr = errors.NotImplementedf("Validator")
   103  	err = s.updateModelConfig(c)
   104  	c.Assert(err, jc.ErrorIsNil)
   105  }
   106  
   107  func (s *ConfigValidatorSuite) TestConfigValidateNoPolicy(c *gc.C) {
   108  	s.policy.GetConfigValidator = func(providerType string) (state.ConfigValidator, error) {
   109  		c.Errorf("should not have been invoked")
   110  		return nil, nil
   111  	}
   112  
   113  	state.SetPolicy(s.State, nil)
   114  	err := s.updateModelConfig(c)
   115  	c.Assert(err, jc.ErrorIsNil)
   116  }