github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/core/cache/model_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  package cache_test
     4  
     5  import (
     6  	"github.com/juju/errors"
     7  	jc "github.com/juju/testing/checkers"
     8  	"github.com/prometheus/client_golang/prometheus/testutil"
     9  	gc "gopkg.in/check.v1"
    10  	"gopkg.in/juju/worker.v1/workertest"
    11  
    12  	"github.com/juju/juju/core/cache"
    13  	"github.com/juju/juju/core/life"
    14  	"github.com/juju/juju/core/status"
    15  )
    16  
    17  type ModelSuite struct {
    18  	entitySuite
    19  }
    20  
    21  var _ = gc.Suite(&ModelSuite{})
    22  
    23  func (s *ModelSuite) SetUpTest(c *gc.C) {
    24  	s.entitySuite.SetUpTest(c)
    25  }
    26  
    27  func (s *ModelSuite) newModel(details cache.ModelChange) *cache.Model {
    28  	m := cache.NewModel(s.gauges, s.hub)
    29  	m.SetDetails(details)
    30  	return m
    31  }
    32  
    33  func (s *ModelSuite) TestReport(c *gc.C) {
    34  	m := s.newModel(modelChange)
    35  	c.Assert(m.Report(), jc.DeepEquals, map[string]interface{}{
    36  		"name":              "model-owner/test-model",
    37  		"life":              life.Value("alive"),
    38  		"application-count": 0,
    39  	})
    40  }
    41  
    42  func (s *ModelSuite) TestConfig(c *gc.C) {
    43  	m := s.newModel(modelChange)
    44  	c.Assert(m.Config(), jc.DeepEquals, map[string]interface{}{
    45  		"key":     "value",
    46  		"another": "foo",
    47  	})
    48  }
    49  
    50  func (s *ModelSuite) TestNewModelGeneratesHash(c *gc.C) {
    51  	s.newModel(modelChange)
    52  	c.Check(testutil.ToFloat64(s.gauges.ModelHashCacheMiss), gc.Equals, float64(1))
    53  }
    54  
    55  func (s *ModelSuite) TestModelConfigIncrementsReadCount(c *gc.C) {
    56  	m := s.newModel(modelChange)
    57  	c.Check(testutil.ToFloat64(s.gauges.ModelConfigReads), gc.Equals, float64(0))
    58  	m.Config()
    59  	c.Check(testutil.ToFloat64(s.gauges.ModelConfigReads), gc.Equals, float64(1))
    60  	m.Config()
    61  	c.Check(testutil.ToFloat64(s.gauges.ModelConfigReads), gc.Equals, float64(2))
    62  }
    63  
    64  func (s *ModelSuite) TestConfigWatcherStops(c *gc.C) {
    65  	m := s.newModel(modelChange)
    66  	w := m.WatchConfig()
    67  	wc := NewNotifyWatcherC(c, w)
    68  	// Sends initial event.
    69  	wc.AssertOneChange()
    70  	wc.AssertStops()
    71  }
    72  
    73  func (s *ModelSuite) TestConfigWatcherChange(c *gc.C) {
    74  	m := s.newModel(modelChange)
    75  	w := m.WatchConfig()
    76  	defer workertest.CleanKill(c, w)
    77  	wc := NewNotifyWatcherC(c, w)
    78  	// Sends initial event.
    79  	wc.AssertOneChange()
    80  
    81  	change := modelChange
    82  	change.Config = map[string]interface{}{
    83  		"key": "changed",
    84  	}
    85  
    86  	m.SetDetails(change)
    87  	wc.AssertOneChange()
    88  
    89  	// The hash is generated each time we set the details.
    90  	c.Check(testutil.ToFloat64(s.gauges.ModelHashCacheMiss), gc.Equals, float64(2))
    91  	// The value is retrieved from the cache when the watcher is created and notified.
    92  	c.Check(testutil.ToFloat64(s.gauges.ModelHashCacheHit), gc.Equals, float64(2))
    93  }
    94  
    95  func (s *ModelSuite) TestConfigWatcherOneValue(c *gc.C) {
    96  	m := s.newModel(modelChange)
    97  	w := m.WatchConfig("key")
    98  	defer workertest.CleanKill(c, w)
    99  	wc := NewNotifyWatcherC(c, w)
   100  	// Sends initial event.
   101  	wc.AssertOneChange()
   102  
   103  	change := modelChange
   104  	change.Config = map[string]interface{}{
   105  		"key":     "changed",
   106  		"another": "foo",
   107  	}
   108  
   109  	m.SetDetails(change)
   110  	wc.AssertOneChange()
   111  }
   112  
   113  func (s *ModelSuite) TestConfigWatcherOneValueOtherChange(c *gc.C) {
   114  	m := s.newModel(modelChange)
   115  	w := m.WatchConfig("key")
   116  	defer workertest.CleanKill(c, w)
   117  	wc := NewNotifyWatcherC(c, w)
   118  	// Sends initial event.
   119  	wc.AssertOneChange()
   120  
   121  	change := modelChange
   122  	change.Config = map[string]interface{}{
   123  		"key":     "value",
   124  		"another": "changed",
   125  	}
   126  
   127  	m.SetDetails(change)
   128  	wc.AssertNoChange()
   129  }
   130  
   131  func (s *ModelSuite) TestApplicationNotFoundError(c *gc.C) {
   132  	m := s.newModel(modelChange)
   133  	_, err := m.Application("nope")
   134  	c.Assert(errors.IsNotFound(err), jc.IsTrue)
   135  }
   136  
   137  var modelChange = cache.ModelChange{
   138  	ModelUUID: "model-uuid",
   139  	Name:      "test-model",
   140  	Life:      life.Alive,
   141  	Owner:     "model-owner",
   142  	Config: map[string]interface{}{
   143  		"key":     "value",
   144  		"another": "foo",
   145  	},
   146  	Status: status.StatusInfo{
   147  		Status: status.Active,
   148  	},
   149  }