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  }