github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/leadership/settings_test.go (about)

     1  // Copyright 2014-2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package leadership_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names"
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/apiserver/leadership"
    14  	"github.com/juju/juju/apiserver/params"
    15  	coreleadership "github.com/juju/juju/core/leadership"
    16  )
    17  
    18  // TODO(fwereade): this is *severely* undertested.
    19  type settingsSuite struct {
    20  	testing.IsolationSuite
    21  }
    22  
    23  var _ = gc.Suite(&settingsSuite{})
    24  
    25  func (s *settingsSuite) TestReadSettings(c *gc.C) {
    26  
    27  	settingsToReturn := params.Settings(map[string]string{"foo": "bar"})
    28  	numGetSettingCalls := 0
    29  	getSettings := func(serviceId string) (map[string]string, error) {
    30  		numGetSettingCalls++
    31  		c.Check(serviceId, gc.Equals, StubServiceNm)
    32  		return settingsToReturn, nil
    33  	}
    34  	authorizer := stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
    35  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, nil, getSettings, nil, nil)
    36  
    37  	results, err := accessor.Read(params.Entities{
    38  		[]params.Entity{
    39  			{Tag: names.NewServiceTag(StubServiceNm).String()},
    40  		},
    41  	})
    42  	c.Assert(err, gc.IsNil)
    43  	c.Assert(numGetSettingCalls, gc.Equals, 1)
    44  	c.Assert(results.Results, gc.HasLen, 1)
    45  	c.Assert(results.Results[0].Error, gc.IsNil)
    46  	c.Check(results.Results[0].Settings, gc.DeepEquals, settingsToReturn)
    47  }
    48  
    49  func (s *settingsSuite) TestWriteSettings(c *gc.C) {
    50  
    51  	expectToken := &fakeToken{}
    52  
    53  	numLeaderCheckCalls := 0
    54  	leaderCheck := func(serviceId, unitId string) coreleadership.Token {
    55  		numLeaderCheckCalls++
    56  		c.Check(serviceId, gc.Equals, StubServiceNm)
    57  		c.Check(unitId, gc.Equals, StubUnitNm)
    58  		return expectToken
    59  	}
    60  
    61  	numWriteSettingCalls := 0
    62  	writeSettings := func(token coreleadership.Token, serviceId string, settings map[string]string) error {
    63  		numWriteSettingCalls++
    64  		c.Check(serviceId, gc.Equals, StubServiceNm)
    65  		c.Check(token, gc.Equals, expectToken)
    66  		c.Check(settings, jc.DeepEquals, map[string]string{"baz": "biz"})
    67  		return nil
    68  	}
    69  
    70  	authorizer := stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
    71  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, nil, nil, leaderCheck, writeSettings)
    72  
    73  	results, err := accessor.Merge(params.MergeLeadershipSettingsBulkParams{
    74  		[]params.MergeLeadershipSettingsParam{
    75  			{
    76  				ServiceTag: names.NewServiceTag(StubServiceNm).String(),
    77  				Settings:   map[string]string{"baz": "biz"},
    78  			},
    79  		},
    80  	})
    81  	c.Assert(err, gc.IsNil)
    82  	c.Assert(results.Results, gc.HasLen, 1)
    83  	c.Check(results.Results[0].Error, gc.IsNil)
    84  	c.Check(numWriteSettingCalls, gc.Equals, 1)
    85  	c.Check(numLeaderCheckCalls, gc.Equals, 1)
    86  }
    87  
    88  func (s *settingsSuite) TestWriteSettingsError(c *gc.C) {
    89  
    90  	expectToken := &fakeToken{}
    91  
    92  	numLeaderCheckCalls := 0
    93  	leaderCheck := func(serviceId, unitId string) coreleadership.Token {
    94  		numLeaderCheckCalls++
    95  		c.Check(serviceId, gc.Equals, StubServiceNm)
    96  		c.Check(unitId, gc.Equals, StubUnitNm)
    97  		return expectToken
    98  	}
    99  
   100  	numWriteSettingCalls := 0
   101  	writeSettings := func(token coreleadership.Token, serviceId string, settings map[string]string) error {
   102  		numWriteSettingCalls++
   103  		c.Check(serviceId, gc.Equals, StubServiceNm)
   104  		c.Check(token, gc.Equals, expectToken)
   105  		c.Check(settings, jc.DeepEquals, map[string]string{"baz": "biz"})
   106  		return errors.New("zap blort")
   107  	}
   108  
   109  	authorizer := stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
   110  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, nil, nil, leaderCheck, writeSettings)
   111  
   112  	results, err := accessor.Merge(params.MergeLeadershipSettingsBulkParams{
   113  		[]params.MergeLeadershipSettingsParam{
   114  			{
   115  				ServiceTag: names.NewServiceTag(StubServiceNm).String(),
   116  				Settings:   map[string]string{"baz": "biz"},
   117  			},
   118  		},
   119  	})
   120  	c.Assert(err, gc.IsNil)
   121  	c.Assert(results.Results, gc.HasLen, 1)
   122  	c.Check(results.Results[0].Error, gc.ErrorMatches, "zap blort")
   123  	c.Check(numWriteSettingCalls, gc.Equals, 1)
   124  	c.Check(numLeaderCheckCalls, gc.Equals, 1)
   125  }
   126  
   127  func (s *settingsSuite) TestBlockUntilChanges(c *gc.C) {
   128  
   129  	numSettingsWatcherCalls := 0
   130  	registerWatcher := func(serviceId string) (string, error) {
   131  		numSettingsWatcherCalls++
   132  		c.Check(serviceId, gc.Equals, StubServiceNm)
   133  		return "foo", nil
   134  	}
   135  
   136  	authorizer := &stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
   137  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, registerWatcher, nil, nil, nil)
   138  
   139  	results, err := accessor.WatchLeadershipSettings(params.Entities{[]params.Entity{
   140  		{names.NewServiceTag(StubServiceNm).String()},
   141  	}})
   142  	c.Assert(err, gc.IsNil)
   143  	c.Assert(results.Results, gc.HasLen, 1)
   144  	c.Assert(results.Results[0].Error, gc.IsNil)
   145  }
   146  
   147  type fakeToken struct {
   148  	coreleadership.Token
   149  }