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 }