github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/api/uniter/application_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter_test
     5  
     6  import (
     7  	"time"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/api/uniter"
    14  	"github.com/juju/juju/apiserver/params"
    15  	"github.com/juju/juju/state"
    16  	"github.com/juju/juju/status"
    17  	"github.com/juju/juju/watcher/watchertest"
    18  )
    19  
    20  type serviceSuite struct {
    21  	uniterSuite
    22  
    23  	apiService *uniter.Application
    24  }
    25  
    26  var _ = gc.Suite(&serviceSuite{})
    27  
    28  func (s *serviceSuite) SetUpTest(c *gc.C) {
    29  	s.uniterSuite.SetUpTest(c)
    30  
    31  	var err error
    32  	s.apiService, err = s.uniter.Application(s.wordpressService.Tag().(names.ApplicationTag))
    33  	c.Assert(err, jc.ErrorIsNil)
    34  }
    35  
    36  func (s *serviceSuite) TestNameTagAndString(c *gc.C) {
    37  	c.Assert(s.apiService.Name(), gc.Equals, s.wordpressService.Name())
    38  	c.Assert(s.apiService.String(), gc.Equals, s.wordpressService.String())
    39  	c.Assert(s.apiService.Tag(), gc.Equals, s.wordpressService.Tag().(names.ApplicationTag))
    40  }
    41  
    42  func (s *serviceSuite) TestWatch(c *gc.C) {
    43  	c.Assert(s.apiService.Life(), gc.Equals, params.Alive)
    44  
    45  	w, err := s.apiService.Watch()
    46  	c.Assert(err, jc.ErrorIsNil)
    47  	wc := watchertest.NewNotifyWatcherC(c, w, s.BackingState.StartSync)
    48  	defer wc.AssertStops()
    49  
    50  	// Initial event.
    51  	wc.AssertOneChange()
    52  
    53  	// Change something and check it's detected.
    54  	err = s.wordpressService.SetExposed()
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	wc.AssertOneChange()
    57  
    58  	// Destroy the service and check it's detected.
    59  	err = s.wordpressService.Destroy()
    60  	c.Assert(err, jc.ErrorIsNil)
    61  	wc.AssertOneChange()
    62  }
    63  
    64  func (s *serviceSuite) TestWatchRelations(c *gc.C) {
    65  	w, err := s.apiService.WatchRelations()
    66  	c.Assert(err, jc.ErrorIsNil)
    67  	wc := watchertest.NewStringsWatcherC(c, w, s.BackingState.StartSync)
    68  	defer wc.AssertStops()
    69  
    70  	// Initial event.
    71  	wc.AssertChange()
    72  	wc.AssertNoChange()
    73  
    74  	// Change something other than the lifecycle and make sure it's
    75  	// not detected.
    76  	err = s.wordpressService.SetExposed()
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	wc.AssertNoChange()
    79  
    80  	// Add another service and relate it to wordpress,
    81  	// check it's detected.
    82  	s.addMachineServiceCharmAndUnit(c, "mysql")
    83  	rel := s.addRelation(c, "wordpress", "mysql")
    84  	wc.AssertChange(rel.String())
    85  
    86  	// Destroy the relation and check it's detected.
    87  	err = rel.Destroy()
    88  	c.Assert(err, jc.ErrorIsNil)
    89  	wc.AssertChange(rel.String())
    90  	wc.AssertNoChange()
    91  }
    92  
    93  func (s *serviceSuite) TestRefresh(c *gc.C) {
    94  	c.Assert(s.apiService.Life(), gc.Equals, params.Alive)
    95  
    96  	err := s.wordpressService.Destroy()
    97  	c.Assert(err, jc.ErrorIsNil)
    98  	c.Assert(s.apiService.Life(), gc.Equals, params.Alive)
    99  
   100  	err = s.apiService.Refresh()
   101  	c.Assert(err, jc.ErrorIsNil)
   102  	c.Assert(s.apiService.Life(), gc.Equals, params.Dying)
   103  }
   104  
   105  func (s *serviceSuite) TestCharmURL(c *gc.C) {
   106  	// Get the charm URL through state calls.
   107  	curl, force := s.wordpressService.CharmURL()
   108  	c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL())
   109  	c.Assert(force, jc.IsFalse)
   110  
   111  	// Now check the same through the API.
   112  	curl, force, err := s.apiService.CharmURL()
   113  	c.Assert(err, jc.ErrorIsNil)
   114  	c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL())
   115  	c.Assert(force, jc.IsFalse)
   116  }
   117  
   118  func (s *serviceSuite) TestCharmModifiedVersion(c *gc.C) {
   119  	// Get the charm URL through state calls.
   120  	ver, err := s.apiService.CharmModifiedVersion()
   121  	c.Assert(err, jc.ErrorIsNil)
   122  	c.Assert(ver, gc.Equals, s.wordpressService.CharmModifiedVersion())
   123  }
   124  
   125  func (s *serviceSuite) TestSetServiceStatus(c *gc.C) {
   126  	message := "a test message"
   127  	stat, err := s.wordpressService.Status()
   128  	c.Assert(err, jc.ErrorIsNil)
   129  	c.Assert(stat.Status, gc.Not(gc.Equals), status.Active)
   130  	c.Assert(stat.Message, gc.Not(gc.Equals), message)
   131  
   132  	err = s.apiService.SetStatus(s.wordpressUnit.Name(), status.Active, message, map[string]interface{}{})
   133  	c.Check(err, gc.ErrorMatches, `"wordpress/0" is not leader of "wordpress"`)
   134  
   135  	s.claimLeadership(c, s.wordpressUnit, s.wordpressService)
   136  
   137  	err = s.apiService.SetStatus(s.wordpressUnit.Name(), status.Active, message, map[string]interface{}{})
   138  	c.Check(err, jc.ErrorIsNil)
   139  
   140  	stat, err = s.wordpressService.Status()
   141  	c.Check(err, jc.ErrorIsNil)
   142  	c.Check(stat.Status, gc.Equals, status.Active)
   143  	c.Check(stat.Message, gc.Equals, message)
   144  }
   145  
   146  func (s *serviceSuite) TestServiceStatus(c *gc.C) {
   147  	message := "a test message"
   148  	stat, err := s.wordpressService.Status()
   149  	c.Assert(err, jc.ErrorIsNil)
   150  	c.Assert(stat.Status, gc.Not(gc.Equals), status.Active)
   151  	c.Assert(stat.Message, gc.Not(gc.Equals), message)
   152  
   153  	now := time.Now()
   154  	sInfo := status.StatusInfo{
   155  		Status:  status.Active,
   156  		Message: message,
   157  		Data:    map[string]interface{}{},
   158  		Since:   &now,
   159  	}
   160  	err = s.wordpressService.SetStatus(sInfo)
   161  	c.Check(err, jc.ErrorIsNil)
   162  
   163  	stat, err = s.wordpressService.Status()
   164  	c.Check(err, jc.ErrorIsNil)
   165  	c.Check(stat.Status, gc.Equals, status.Active)
   166  	c.Check(stat.Message, gc.Equals, message)
   167  
   168  	result, err := s.apiService.Status(s.wordpressUnit.Name())
   169  	c.Check(err, gc.ErrorMatches, `"wordpress/0" is not leader of "wordpress"`)
   170  
   171  	s.claimLeadership(c, s.wordpressUnit, s.wordpressService)
   172  	result, err = s.apiService.Status(s.wordpressUnit.Name())
   173  	c.Check(err, jc.ErrorIsNil)
   174  	c.Check(result.Application.Status, gc.Equals, status.Active.String())
   175  }
   176  
   177  func (s *serviceSuite) claimLeadership(c *gc.C, unit *state.Unit, service *state.Application) {
   178  	claimer := s.State.LeadershipClaimer()
   179  	err := claimer.ClaimLeadership(service.Name(), unit.Name(), time.Minute)
   180  	c.Assert(err, jc.ErrorIsNil)
   181  }