launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/apiserver/logger/logger_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package logger_test 5 6 import ( 7 gc "launchpad.net/gocheck" 8 9 jujutesting "launchpad.net/juju-core/juju/testing" 10 "launchpad.net/juju-core/state" 11 "launchpad.net/juju-core/state/api/params" 12 "launchpad.net/juju-core/state/apiserver/common" 13 "launchpad.net/juju-core/state/apiserver/logger" 14 apiservertesting "launchpad.net/juju-core/state/apiserver/testing" 15 statetesting "launchpad.net/juju-core/state/testing" 16 ) 17 18 type loggerSuite struct { 19 jujutesting.JujuConnSuite 20 21 // These are raw State objects. Use them for setup and assertions, but 22 // should never be touched by the API calls themselves 23 rawMachine *state.Machine 24 logger *logger.LoggerAPI 25 resources *common.Resources 26 authorizer apiservertesting.FakeAuthorizer 27 } 28 29 var _ = gc.Suite(&loggerSuite{}) 30 31 func (s *loggerSuite) SetUpTest(c *gc.C) { 32 s.JujuConnSuite.SetUpTest(c) 33 s.resources = common.NewResources() 34 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 35 36 // Create a machine to work with 37 var err error 38 s.rawMachine, err = s.State.AddMachine("quantal", state.JobHostUnits) 39 c.Assert(err, gc.IsNil) 40 41 // The default auth is as the machine agent 42 s.authorizer = apiservertesting.FakeAuthorizer{ 43 Tag: s.rawMachine.Tag(), 44 LoggedIn: true, 45 MachineAgent: true, 46 } 47 s.logger, err = logger.NewLoggerAPI(s.State, s.resources, s.authorizer) 48 c.Assert(err, gc.IsNil) 49 } 50 51 func (s *loggerSuite) TestNewLoggerAPIRefusesNonAgent(c *gc.C) { 52 // We aren't even a machine agent 53 anAuthorizer := s.authorizer 54 anAuthorizer.MachineAgent = false 55 endPoint, err := logger.NewLoggerAPI(s.State, s.resources, anAuthorizer) 56 c.Assert(endPoint, gc.IsNil) 57 c.Assert(err, gc.ErrorMatches, "permission denied") 58 } 59 60 func (s *loggerSuite) TestNewLoggerAPIAcceptsUnitAgent(c *gc.C) { 61 // We aren't even a machine agent 62 anAuthorizer := s.authorizer 63 anAuthorizer.UnitAgent = true 64 anAuthorizer.MachineAgent = false 65 endPoint, err := logger.NewLoggerAPI(s.State, s.resources, anAuthorizer) 66 c.Assert(err, gc.IsNil) 67 c.Assert(endPoint, gc.NotNil) 68 } 69 70 func (s *loggerSuite) TestWatchLoggingConfigNothing(c *gc.C) { 71 // Not an error to watch nothing 72 results := s.logger.WatchLoggingConfig(params.Entities{}) 73 c.Assert(results.Results, gc.HasLen, 0) 74 } 75 76 func (s *loggerSuite) setLoggingConfig(c *gc.C, loggingConfig string) { 77 err := statetesting.UpdateConfig(s.State, map[string]interface{}{"logging-config": loggingConfig}) 78 c.Assert(err, gc.IsNil) 79 envConfig, err := s.State.EnvironConfig() 80 c.Assert(err, gc.IsNil) 81 c.Assert(envConfig.LoggingConfig(), gc.Equals, loggingConfig) 82 } 83 84 func (s *loggerSuite) TestWatchLoggingConfig(c *gc.C) { 85 args := params.Entities{ 86 Entities: []params.Entity{{Tag: s.rawMachine.Tag()}}, 87 } 88 results := s.logger.WatchLoggingConfig(args) 89 c.Assert(results.Results, gc.HasLen, 1) 90 c.Assert(results.Results[0].NotifyWatcherId, gc.Not(gc.Equals), "") 91 c.Assert(results.Results[0].Error, gc.IsNil) 92 resource := s.resources.Get(results.Results[0].NotifyWatcherId) 93 c.Assert(resource, gc.NotNil) 94 95 w := resource.(state.NotifyWatcher) 96 wc := statetesting.NewNotifyWatcherC(c, s.State, w) 97 wc.AssertNoChange() 98 99 newLoggingConfig := "<root>=WARN;juju.log.test=DEBUG;unit=INFO" 100 s.setLoggingConfig(c, newLoggingConfig) 101 102 wc.AssertOneChange() 103 statetesting.AssertStop(c, w) 104 wc.AssertClosed() 105 } 106 107 func (s *loggerSuite) TestWatchLoggingConfigRefusesWrongAgent(c *gc.C) { 108 // We are a machine agent, but not the one we are trying to track 109 args := params.Entities{ 110 Entities: []params.Entity{{Tag: "machine-12354"}}, 111 } 112 results := s.logger.WatchLoggingConfig(args) 113 // It is not an error to make the request, but the specific item is rejected 114 c.Assert(results.Results, gc.HasLen, 1) 115 c.Assert(results.Results[0].NotifyWatcherId, gc.Equals, "") 116 c.Assert(results.Results[0].Error, gc.DeepEquals, apiservertesting.ErrUnauthorized) 117 } 118 119 func (s *loggerSuite) TestLoggingConfigForNoone(c *gc.C) { 120 // Not an error to request nothing, dumb, but not an error. 121 results := s.logger.LoggingConfig(params.Entities{}) 122 c.Assert(results.Results, gc.HasLen, 0) 123 } 124 125 func (s *loggerSuite) TestLoggingConfigRefusesWrongAgent(c *gc.C) { 126 args := params.Entities{ 127 Entities: []params.Entity{{Tag: "machine-12354"}}, 128 } 129 results := s.logger.LoggingConfig(args) 130 c.Assert(results.Results, gc.HasLen, 1) 131 result := results.Results[0] 132 c.Assert(result.Error, gc.DeepEquals, apiservertesting.ErrUnauthorized) 133 } 134 135 func (s *loggerSuite) TestLoggingConfigForAgent(c *gc.C) { 136 newLoggingConfig := "<root>=WARN;juju.log.test=DEBUG;unit=INFO" 137 s.setLoggingConfig(c, newLoggingConfig) 138 139 args := params.Entities{ 140 Entities: []params.Entity{{Tag: s.rawMachine.Tag()}}, 141 } 142 results := s.logger.LoggingConfig(args) 143 c.Assert(results.Results, gc.HasLen, 1) 144 result := results.Results[0] 145 c.Assert(result.Error, gc.IsNil) 146 c.Assert(result.Result, gc.Equals, newLoggingConfig) 147 }