github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/upgrades/environconfig_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package upgrades_test
     5  
     6  import (
     7  	"errors"
     8  
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/environs"
    14  	"github.com/juju/juju/environs/config"
    15  	"github.com/juju/juju/state"
    16  	coretesting "github.com/juju/juju/testing"
    17  	"github.com/juju/juju/upgrades"
    18  )
    19  
    20  type upgradeModelConfigSuite struct {
    21  	coretesting.BaseSuite
    22  	stub     testing.Stub
    23  	cfg      *config.Config
    24  	reader   upgrades.ModelConfigReader
    25  	updater  upgrades.ModelConfigUpdater
    26  	registry *mockProviderRegistry
    27  }
    28  
    29  var _ = gc.Suite(&upgradeModelConfigSuite{})
    30  
    31  func (s *upgradeModelConfigSuite) SetUpTest(c *gc.C) {
    32  	s.BaseSuite.SetUpTest(c)
    33  
    34  	s.stub = testing.Stub{}
    35  	s.cfg = coretesting.ModelConfig(c)
    36  	s.registry = &mockProviderRegistry{
    37  		providers: make(map[string]environs.EnvironProvider),
    38  	}
    39  
    40  	s.reader = environConfigFunc(func() (*config.Config, error) {
    41  		s.stub.AddCall("ModelConfig")
    42  		return s.cfg, s.stub.NextErr()
    43  	})
    44  
    45  	s.updater = updateModelConfigFunc(func(
    46  		update map[string]interface{}, remove []string, validate state.ValidateConfigFunc,
    47  	) error {
    48  		s.stub.AddCall("UpdateModelConfig", update, remove, validate)
    49  		return s.stub.NextErr()
    50  	})
    51  }
    52  
    53  func (s *upgradeModelConfigSuite) TestUpgradeModelConfigModelConfigError(c *gc.C) {
    54  	s.stub.SetErrors(errors.New("cannot read environ config"))
    55  	err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry)
    56  	c.Assert(err, gc.ErrorMatches, "reading model config: cannot read environ config")
    57  	s.stub.CheckCallNames(c, "ModelConfig")
    58  }
    59  
    60  func (s *upgradeModelConfigSuite) TestUpgradeModelConfigProviderNotRegistered(c *gc.C) {
    61  	s.registry.SetErrors(errors.New(`no registered provider for "someprovider"`))
    62  	err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry)
    63  	c.Assert(err, gc.ErrorMatches, `getting provider: no registered provider for "someprovider"`)
    64  	s.stub.CheckCallNames(c, "ModelConfig")
    65  }
    66  
    67  func (s *upgradeModelConfigSuite) TestUpgradeModelConfigProviderNotConfigUpgrader(c *gc.C) {
    68  	s.registry.providers["someprovider"] = &mockEnvironProvider{}
    69  	err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry)
    70  	c.Assert(err, jc.ErrorIsNil)
    71  	s.registry.CheckCalls(c, []testing.StubCall{{
    72  		FuncName: "Provider", Args: []interface{}{"someprovider"},
    73  	}})
    74  	s.stub.CheckCallNames(c, "ModelConfig")
    75  }
    76  
    77  func (s *upgradeModelConfigSuite) TestUpgradeModelConfigProviderConfigUpgrader(c *gc.C) {
    78  	var err error
    79  	s.cfg, err = s.cfg.Apply(map[string]interface{}{"test-key": "test-value"})
    80  	c.Assert(err, jc.ErrorIsNil)
    81  
    82  	s.registry.providers["someprovider"] = &mockModelConfigUpgrader{
    83  		upgradeConfig: func(cfg *config.Config) (*config.Config, error) {
    84  			return cfg.Remove([]string{"test-key"})
    85  		},
    86  	}
    87  	err = upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry)
    88  	c.Assert(err, jc.ErrorIsNil)
    89  
    90  	s.stub.CheckCallNames(c, "ModelConfig", "UpdateModelConfig")
    91  	updateCall := s.stub.Calls()[1]
    92  	expectedAttrs := s.cfg.AllAttrs()
    93  	delete(expectedAttrs, "test-key")
    94  	c.Assert(updateCall.Args, gc.HasLen, 3)
    95  	c.Assert(updateCall.Args[0], jc.DeepEquals, expectedAttrs)
    96  	c.Assert(updateCall.Args[1], jc.SameContents, []string{"test-key"})
    97  	c.Assert(updateCall.Args[2], gc.IsNil)
    98  }
    99  
   100  func (s *upgradeModelConfigSuite) TestUpgradeModelConfigUpgradeConfigError(c *gc.C) {
   101  	s.registry.providers["someprovider"] = &mockModelConfigUpgrader{
   102  		upgradeConfig: func(cfg *config.Config) (*config.Config, error) {
   103  			return nil, errors.New("cannot upgrade config")
   104  		},
   105  	}
   106  	err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry)
   107  	c.Assert(err, gc.ErrorMatches, "upgrading config: cannot upgrade config")
   108  	s.stub.CheckCallNames(c, "ModelConfig")
   109  }
   110  
   111  func (s *upgradeModelConfigSuite) TestUpgradeModelConfigUpdateConfigError(c *gc.C) {
   112  	s.stub.SetErrors(nil, errors.New("cannot update environ config"))
   113  	s.registry.providers["someprovider"] = &mockModelConfigUpgrader{
   114  		upgradeConfig: func(cfg *config.Config) (*config.Config, error) {
   115  			return cfg, nil
   116  		},
   117  	}
   118  	err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry)
   119  	c.Assert(err, gc.ErrorMatches, "updating config in state: cannot update environ config")
   120  
   121  	s.stub.CheckCallNames(c, "ModelConfig", "UpdateModelConfig")
   122  	updateCall := s.stub.Calls()[1]
   123  	c.Assert(updateCall.Args, gc.HasLen, 3)
   124  	c.Assert(updateCall.Args[0], jc.DeepEquals, s.cfg.AllAttrs())
   125  	c.Assert(updateCall.Args[1], gc.IsNil)
   126  	c.Assert(updateCall.Args[2], gc.IsNil)
   127  }
   128  
   129  type environConfigFunc func() (*config.Config, error)
   130  
   131  func (f environConfigFunc) ModelConfig() (*config.Config, error) {
   132  	return f()
   133  }
   134  
   135  type updateModelConfigFunc func(map[string]interface{}, []string, state.ValidateConfigFunc) error
   136  
   137  func (f updateModelConfigFunc) UpdateModelConfig(
   138  	update map[string]interface{}, remove []string, validate state.ValidateConfigFunc,
   139  ) error {
   140  	return f(update, remove, validate)
   141  }
   142  
   143  type mockProviderRegistry struct {
   144  	environs.ProviderRegistry
   145  	testing.Stub
   146  	providers map[string]environs.EnvironProvider
   147  }
   148  
   149  func (r *mockProviderRegistry) Provider(name string) (environs.EnvironProvider, error) {
   150  	r.MethodCall(r, "Provider", name)
   151  	return r.providers[name], r.NextErr()
   152  }
   153  
   154  type mockEnvironProvider struct {
   155  	testing.Stub
   156  	environs.EnvironProvider
   157  }
   158  
   159  type mockModelConfigUpgrader struct {
   160  	mockEnvironProvider
   161  	upgradeConfig func(*config.Config) (*config.Config, error)
   162  }
   163  
   164  func (u *mockModelConfigUpgrader) UpgradeConfig(cfg *config.Config) (*config.Config, error) {
   165  	u.MethodCall(u, "UpgradeConfig", cfg)
   166  	return u.upgradeConfig(cfg)
   167  }